Mybatis的N+1select问题

对于N+1问题,刚开始看到这个名词会让人很懵,这个关系到数据表关联关系,一对多,多对多的情况,这个问题在使用mybatis或者hibernate都有可能遇到,select语句数量过多或者重复的情况下,就会出现这个问题,频繁发送相同的sql语句给数据库带来很大压力

说说解决方案:
1.使用sql语句:
基本的查询语句select name age from user_info where id=2;
最直接的使用,也是我的平时使用量最大的,但是当遇到有外键关联的时候,
就应该使用join去连接查询:
select a.uname d.salary from user_info ui left join department d on ui.uid=d.id
关于join连接:
两张关联表,左表和右表
left join 获取左表所有数据,再取右表能与左表匹配的数据为结果
right join 与上面left 相反,取右表所有数据,左表与之匹配
inner join 与join差不多,就是取两表相交叉的匹配结果
2.MyBatis处理N+1问题的途径,可以使用延迟加载

<configuration>  
    <settings>  
     <setting name="cacheEnabled" value="true"/>  
     <setting name="lazyLoadingEnabled" value="true"/>  
     <setting name="aggressiveLazyLoading" value="false"/>  
    </settings>  
    <environments default="development">  
.......  
</configuration>

cacheEnabled: 开启mybatis缓存
lazyLoadingEnabled: 延迟加载的全局开关。当开启时,所有关联对象都会延迟加载
aggressiveLazyLoading:
当启用时,对任意延迟属性的调用会使带有延迟加载属性的对象完整加载;反之,每种属性将会按需加载

在对多对多表操作的时候,Mybatis一般都会使用association,collection这两个标签,这里一个fetchType属性:可以自己按需要设置加载策略
eager:即刻加载
lazy: 延迟加载

参考:

http://blog.csdn.net/ykzhen2015/article/details/51364906
http://blog.csdn.net/z69183787/article/details/46288815

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值