验证码: 看不清楚,换一张 查询 注册会员,免验证
  • {{ basic.site_slogan }}
  • 打开微信扫一扫,
    您还可以在这里找到我们哟

    关注我们

mybatis查询方式与效率高低源码对比分析

阅读:1136 来源:乙速云 作者:代码code

mybatis查询方式与效率高低源码对比分析

mybatis查询方式与效率高低



    
    
    
        
        
        
        
        
    

    
        select * from student;
    
    
        select * from  teacher where id=#{id};
    


    
    
        
        
        
        
            
            
        
    
    
        select s.id,s.name,s.age,t.name tname ,t.id tid from student s,teacher t where s.tid=t.id;
    

------------------------------------------------------------------

    
        
        
        
            
            
            
            
        
    
    
         select t.id ,t.name,s.id sid,s.name sname,s.age sage,s.tid stid
         from student s ,teacher t
         where s.tid=t.id and t.id=1;
    

mybatis提高查询效率的方式

缓存机制

1 一级缓存:

mysql连续执行两次select * from table where id =1;第一次会执行sql语句查询数据库,然后保存到sqlsession缓存,第二次查询会先从缓存里查找,有的话直接返回不会执行sql.

但是如果两次sql中间增加一次commit操作(insert,delete,update),如:

select * from table where id =1
update table set name = zjw where id =1;
select * from table where id =1

这个时候第一次查询依然会执行sql查询数据库,但是在执行完update后会清空sqlsession里的缓存,原因是避免脏读,

所以第二次select在缓存里找不到数据,又会执行sql查询数据库。

2 二级缓存:

二级缓存是基于mapper文件的namaspace,对该mapper的所有sqlsession都共享一个二级缓存,如果两个mapper的namespace一致,则两个mapper的所有sqlsession共用一个二级缓存,

步骤:

在全局配置文件mybatis-configuration.xml加入

其次在mapper文件开启缓存 type里面是缓存类。如果不写是默认的mabatis缓存类,自定义缓存类必须实现cache接口

需要缓存的pojo实体类要实现serializable接口,因为在缓存中取出数据映射到pojo类需要反序列化。

不同的两个sqlsession查询走二级缓存,但是如果其中有一个commit操作,为避免脏读二级缓存还是会被清空。

在每个sql语句上使用useCache=true/false是否使用缓存,flushcache=true/false是否刷新缓存 ,在每次的commit后默认刷新缓存。

懒加载

Mybatis中resultmap可以实现高级映射,association一对一,Collection一对多具有延迟加载功能

在collection或association中fetchtype=lazy,即为懒加载

在查询主表时,不会把子集查出来,直到子集用到的情况才会查出子集。

分享到:
*特别声明:以上内容来自于网络收集,著作权属原作者所有,如有侵权,请联系我们: hlamps#outlook.com (#换成@)。
相关文章
{{ v.title }}
{{ v.description||(cleanHtml(v.content)).substr(0,100)+'···' }}
你可能感兴趣
推荐阅读 更多>