java面试题 --- Mybatis&Hibernate

2023-10-16 15:33:26 浏览数 (3)

1. Mybatis 和 Hibernate 有什么区别?

  • Mybatis 是半自动的 ORM 的框架,Hibernate 是全自动的,所谓半自动,就是不会自动查询出关联对象,需要自己写 SQL。

2. Mybatis 有什么优缺点?

  • 简单轻量,学习成本低,SQL 与业务分离,便于优化,但是对开发人员的 SQL 功底要求较高,且与数据库耦合,数据库移植性较差。

3. 说一说 Mybatis 的编程步骤。

  • 创建 SqlsessionFactory;
  • 创建 SqlSession;
  • 通过 SqlSession 执行数据库操作;
  • 通过 SqlSession 提交或回滚事务;
  • 关闭 SqlSession。

4. 调用接口为什么能执行 mapper 中的 SQL?

  • 调用接口的时候会生成代理对象,代理根据接口全限定名找到对应 mapper 中的对应标签,从而执行对应的 SQL。

5. 什么叫预编译,为什么要预编译?

  • 预编译就是在数据库驱动把 SQL 发给数据库之前,先对其进行编译,数据库就可以直接执行,提高效率,同时预编译可以防止 SQL 注入攻击。

6. Mybatis 有哪些执行器?

  • SimpleExecutor:默认的执行器,每执行一个操作就开启一个 Statement 对象,用完就关;
  • ReuseExecutor:用完不关闭 Statement 对象,以 SQL 作为 key 保存在 map 中;
  • BatchExecutor:用于批量更新的执行器。

7. Mybatis 支持延迟加载吗?

  • 仅支持 association 和 collection 的延迟加载。原理是使用 cglib 创建目标对象的代理对象, 调用目标方法时会进入拦截方法,比如调用 a.getB().getName() 时,发现 B 对象为空,就会发送事先保存的查询 B 的 SQL,查出来然后调用 a.setB()方法。

8. #{} 和 ${} 有什么区别?

  • $ 是占位符替换,而 # 会使用预编译。

9. Mybatis 插件的原理是什么?

  • 使用 JDK 动态代理来生成代理对象,拦截目标方法,做一些增强。

10. Mybatis 支持缓存吗?

  • 支持,它有一级缓存和二级缓存,一级缓存用 HashMap 存储,作用域是 session;二级缓存可自定义存储源,作用域是 namespace。

11. Hibernate 对象的三种状态是什么?

  • 瞬时态:对象刚被 new 出来,数据库没有对应记录,也不在 session 管理中;
  • 持久态:数据库中有对应记录,也在 session 的管理中;
  • 游离态:数据库中有对应记录,但不在 session 的管理中。

12. openSession 和 getCurrentSession 有什么区别?

  • openSession 每次会开启一个新 session,查询不会使用事务,需要手动关闭 session;而 getCurrentSession 如果是同一个线程每次获取到的都是同一个 session,所有操作都会使用事务,不需要手动关闭。

13. 说一说 hibernate 的缓存?

  • hibernate 的一级缓存作用域是 session,默认开启,二级缓存作用域是 sessionFactory。flush 方法是让一级缓存与数据库同步,evict 方法是删除一级缓存中指定对象,clear 方法是情空一级缓存。

0 人点赞