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 方法是情空一级缓存。