Hibernate和Mybatis中的一级缓存的区别

 

Hibernate和Mybatis中的一级缓存的区别_第1张图片

它说的意思是要mybatis相同语句和相同参数才能让一级缓存在第二次查询时不发sql语句,也就是所一级缓存中保存的是sql语句,我写了个测试,查询tb_user表中同一个记录,一个根据id去查,一个根据name去查,两个不是同一语句但是查询的都是同一条记录,测试下来会发2条语句

 
    

日志打印下来是这样的(可以看出发送了两条语句)

2019-05-23 00:47:10,685 ==>  Preparing: select user_name,password,name,age,sex,birthday,created,updated from tb_user where id = ?; 
2019-05-23 00:47:10,757 ==> Parameters: 1(Long)
2019-05-23 00:47:10,816 <==      Total: 1
User [id=null, userName=zhangsan, password=123456, name=张三, age=30, sex=1, birthday=Wed Aug 08 00:00:00 CST 1984, created=Fri Sep 19 16:56:04 CST 2014, updated=Sun Sep 21 11:24:59 CST 2014]
2019-05-23 00:47:10,821 ==>  Preparing: select user_name,password,name,age,sex,birthday,created,updated from tb_user where name = ?; 
2019-05-23 00:47:10,821 ==> Parameters: 张三(String)
2019-05-23 00:47:10,824 <==      Total: 1
User [id=null, userName=zhangsan, password=123456, name=张三, age=30, sex=1, birthday=Wed Aug 08 00:00:00 CST 1984, created=Fri Sep 19 16:56:04 CST 2014, updated=Sun Sep 21 11:24:59 CST 2014]

 

而hibernate的一级缓存和mybatis的一级缓存保存的数据不一样,我之前有一篇博客写过,hibernate的一级缓存保存的是持久化对象,它在进行查询的时候,会根据oid去一级缓存中去查找,如果缓存中有相同oid的持久化对象,就不会发送sql语句

 

总结下来:hibernate一级缓存保存的是持久化对象,而mybatis一级缓存中保存的是sql语句,mybatis的一级缓存类似于hibernate二级缓存中的查询缓存,只是hibernate的查询缓存存放的是键值对,key是sql,value是值

 

 

补充说明:

不过,貌似mybatis对一级缓存的支持不像hibernate那么好,因为如果在mapper中写两个不用id但是相同的sql,依旧会发两次sql语句...

Hibernate和Mybatis中的一级缓存的区别_第2张图片

Hibernate和Mybatis中的一级缓存的区别_第3张图片

你可能感兴趣的:(mybatis)