Mybatis:常见面试题
1、一级缓存和二级缓存
一级缓存是SqlSession级别的缓存,随着SqlSession的创建而存在,随着SqlSession的销毁而销毁。
二级缓存是命名空间级别的缓存,可以在同一个命名空间中的多个SqlSession之间通用,默认关闭。当查询数据库时,会先查询二级缓存,然后查询一级缓存,最后查询数据库。需要注意的是,如果结果即是自定义的Java bean,则需要该bean实现序列化接口,才能实现二级缓存。
2、插入如何获取自增主键
insert操作有三个特有属性:
- keyProperty:指定哪个列是主键,如果是联合主键可以用逗号隔开;
- keyColumn:指定第几列是主键,不能和keyProperty共用;
- useGeneratedKeys:是否使用自动增长,默认为false;
将useGeneratedKeys设置为true,在插入的时候,会回填Java Bean的id值,通过返回的对象可获取主键值。
3、级联
在查询中配置查询结果的某个或某几个字段的值,来自于其他查询语句。级联有一对一、一对多、多对一、多对多这四种。
参考文章:https://zhuanlan.zhihu.com/p/40621891
4、延迟加载
级联的优势是能够方便地获取数据,但有时不需要获取所有数据,这样会多执行几条SQL,性能下降,为了解决这个问题,需要使用延迟加载,只要使用相关级联数据时,才会发送SQL去取回数据。
5、resultMap和resultType
resultType是返回的结果类型,可以是基本类型、自定义的java bean。如果是自定义的Java bean,要求取出的数据库的数据的字段名必须和bean的字段名一致,才能进行映射;如果所有表字段和bean的字段都不一致,则获得的bean实例为空。
resultMap是最复杂的元素,可以配置映射规则、级联、typeHandler等,与ResultType不能同时存在。如果表字段使用了下划线命名,而Bean用驼峰命名,可以使用resultMap进行字段的映射。
6、二级缓存失效
- SqlSession未提交时,这个SqlSession查询到的结果在缓存中是不存在的;
- 更新操作会导致缓存被清空;
- 多表关联时,当前namespace无法感知其他namespace中对表的修改,导致缓存数据变成脏数据。可以通过让当前namespace引用其他namespace来共享二级缓存来解决。