MyBatis和Hibernate的区别,及MyBatis的缓存机制了解吗

2024-02-22 12:22:51 浏览数 (3)

MyBatis和Hibernate的区别

概要

Hibernate和MyBatis都是ORM框架,都支持JDBC和JTA事务处理,它们创建地目的都是为了简化Java原生程序操作数据库地步骤。增加开发者地效率。

两者的不同点
  1. Hibernate是全自动的,MyBatis是半自动的。在Hibernate中,开发者只需要定义好数据的表字段和Java DO的映射关系和规则即可,Hibernate会开放出来接口自动去处理数据库表的CRUD,并按照规定好的而规则映射到DO对象中,这个过程中操作者是完全不需要感知SQL逻辑的,但是在MyBatis中则完全不是这样,MyBatis不会帮助开发者编写SQL逻辑,MyBatis只会按照定义好的规则将数据库字段映射到Java的DO中,但是具体的SQL逻辑还是需要开发者自己编写。
  2. 正式因为MyBatis需要自己编写SQL逻辑,这是一个包袱,因为开发者需要根据不同的DB,选择不同的SQL语句(DB的移植性不高),而且正是因为要自己写SQL,项目初期的开发工作量要比Hibernate要大。但是这也是优点,通过MyBatis开发者就可以自定义SQL,比如:多表join操作等等。
  3. Hibernate的缓存系统更优于MyBatis,如果二级缓存出现脏数据,Hibernate会直接报错,但是MyBatis就需要开发者自己感知。

总的来说,MyBatis是一个小巧、方便、高效、简单、直接、半自动化的持久层框架,Hibernate是一个强大、方便、高效、复杂、间接、全自动化的持久层框架。

如何选择

对于性能要求不苛刻的系统,比如管理系统、ERP等推荐使用Hibernate,而对于性能要求高,响应快、灵活的系统则推荐使用MyBatis。

MyBatis缓存机制

首先MyBatis的缓存机制有两种:一级缓存和二级缓存。

一级缓存

在同一个会话中,MyBatis会将执行过的SQL语句的结果缓存到内存中,下载再次执行相同的SQL语句时,会先查看缓存中是否存在该结果,如果存在则直接返回缓存中的结果,不用再执行SQL语句。一级缓存默认是开启的状态,可以通过在MyBatis的配置文件中设置禁用活刷新缓存来控制缓存的使用。

工作流程如下:

image

对于一级缓存,有两点需要注意:

  1. MyBatis一级缓存内部设计简单,只是一个没有容量限定的HashMap,在缓存的功能上有所欠缺。
  2. MyBatis的一级缓存最大范围时SqlSession内部,有多个SqlSession或者分布式的环境下,数据库写操作会引起脏数据的问题。换句话说,当一个SqlSession查询并缓存结果后,另一个SqlSession更新了该数据,其他缓存结果里的SqlSession是看不到最新更新的数据的,所以建议设定缓存级别为Statement
二级缓存

二级缓存是基于命名空间的缓存,它可以跨会话,在多个会话之间共享缓存,可以减少数据库的访问次数。要使用二级缓存,需要在MyBatis的配置文件中配置相应的缓存实现类,并在需要使用缓存的Mapper接口上添加@CacheNamespace注解。二级缓存的使用需要注意缓存的更新和失效机制,以及并发问操作的问题。

工作流程如下:

image

因为二级缓存是基于namespace的,所以一般情况下,MyBatis的二级缓存是不是和多表查询的情况的。举个例子:

我们有两个表:student和class,我们为这两个表创建可两个namespace去对这两个表做相关的操作。同时,为了进行多表查询,我们在namespace=student的空间中,对student和class两张表及逆行了关联查询操作(sqlA)。此时就会在namespace=student的空间中把sqlA的结果缓存下来,如果我们在namespace=class下更新了class表,namespace=student是不会更新的,这就会导致脏数据的产生。

好了,本章节到此告一段落。希望对你有所帮助,祝学习顺利。

0 人点赞