Hibernate和MyBatis都是ORM框架,都支持JDBC和JTA事务处理,它们创建地目的都是为了简化Java原生程序操作数据库地步骤。增加开发者地效率。
总的来说,MyBatis是一个小巧、方便、高效、简单、直接、半自动化的持久层框架,Hibernate是一个强大、方便、高效、复杂、间接、全自动化的持久层框架。
对于性能要求不苛刻的系统,比如管理系统、ERP等推荐使用Hibernate,而对于性能要求高,响应快、灵活的系统则推荐使用MyBatis。
首先MyBatis的缓存机制有两种:一级缓存和二级缓存。
在同一个会话中,MyBatis会将执行过的SQL语句的结果缓存到内存中,下载再次执行相同的SQL语句时,会先查看缓存中是否存在该结果,如果存在则直接返回缓存中的结果,不用再执行SQL语句。一级缓存默认是开启的状态,可以通过在MyBatis的配置文件中设置禁用活刷新缓存来控制缓存的使用。
工作流程如下:
image
对于一级缓存,有两点需要注意:
二级缓存是基于命名空间的缓存,它可以跨会话,在多个会话之间共享缓存,可以减少数据库的访问次数。要使用二级缓存,需要在MyBatis的配置文件中配置相应的缓存实现类,并在需要使用缓存的Mapper接口上添加@CacheNamespace注解。二级缓存的使用需要注意缓存的更新和失效机制,以及并发问操作的问题。
工作流程如下:
image
因为二级缓存是基于namespace的,所以一般情况下,MyBatis的二级缓存是不是和多表查询的情况的。举个例子:
我们有两个表:student和class,我们为这两个表创建可两个namespace去对这两个表做相关的操作。同时,为了进行多表查询,我们在namespace=student的空间中,对student和class两张表及逆行了关联查询操作(sqlA)。此时就会在namespace=student的空间中把sqlA的结果缓存下来,如果我们在namespace=class下更新了class表,namespace=student是不会更新的,这就会导致脏数据的产生。
好了,本章节到此告一段落。希望对你有所帮助,祝学习顺利。