最近一直在研究MyBatis源码,作为国内经常使用的持久层框架,其内部代码的设计非常优秀。比如在开发过程中,有能力对框架进行深度的定制化开发,解决BUG也更加得心应手!另外学习开发者是如何设计高扩展性、低耦合性的代码,便于在自己的开发场景中应用。
而在Mybatis中,缓存是一个绕不开的话题。比如说,MyBatis的一级缓存竟然还会引来麻烦?
MyBatis 一级缓存与 SpringFramework 的声明式事务有冲突吗?在 Service 中开启事务,连续查询两次同样的数据,结果两次查询的结果不一致。这些应该如何解决?
- 使用 Mapper 的 selectById 查出来实体,修改实体的属性值,然后再 selectById 查找实体,发现之前查出来的是刚才修改过的实体,不是由数据库查出来的
- 如果不开启事务,则两次请求查询的结果是相同的,控制台打印了两次 SQ
然而大多数人对Mybatis框架的理解仅仅局限于使用,并不熟悉框架底层的实现原理。但MyBatis框架在互联网大厂是非常重要的角色,比如说阿里巴巴的持久层抛弃hibernate,采用的就是MyBatis框架
为什么阿里巴巴的持久层抛弃hibernate,采用MyBatis框架?
原因大概有以下4点:
- 阿里在mysql上下了大功夫,他们对数据查询的要求也比较高,很多sql查询都要精心设计。而hibernate把数据库和你隔离了,如果使用hibernate,虽然能对生成的查询进行一定程度的定制,但开发起