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、二级缓存失效

  1. SqlSession未提交时,这个SqlSession查询到的结果在缓存中是不存在的;
  2. 更新操作会导致缓存被清空;
  3. 多表关联时,当前namespace无法感知其他namespace中对表的修改,导致缓存数据变成脏数据。可以通过让当前namespace引用其他namespace来共享二级缓存来解决。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值