一.什么是Mybatis
一、基本概念与作用
-
持久层:在软件架构中,持久层主要负责将数据存储到数据库中(如 MySQL、Oracle 等)以及从数据库中读取数据。MyBatis 简化了这个过程,让开发人员能够更高效地进行数据持久化操作。例如,在一个电商系统中,需要将用户信息、商品信息、订单信息等保存到数据库,并在需要的时候从数据库中检索这些信息,MyBatis 就可以帮助完成这些操作。
-
对象 - 关系映射(ORM):MyBatis 是一个半自动化的 ORM 框架。它不像一些完全自动化的 ORM 框架那样,会自动生成 SQL 语句。MyBatis 允许开发人员自己编写 SQL 语句,同时提供了将查询结果自动映射到 Java 对象的功能。这意味着可以灵活地控制数据库访问,又能方便地将数据库中的数据转换为程序中可以直接使用的 Java 对象。
二、mybatis的优缺点
- 优点
- 灵活性高
- MyBatis 允许开发人员手动编写 SQL 语句,这对于复杂的业务逻辑和数据库操作非常有帮助。例如,在处理多表联合查询时,开发人员可以根据数据库的特性(如 MySQL 的特定函数、Oracle 的分析函数等)编写高效的 SQL 语句。在一个大型企业级项目中,可能需要根据不同的条件进行动态查询,比如根据用户权限、时间范围等因素来查询数据。使用 MyBatis 可以灵活地拼接 SQL 语句,如在 SQL 映射文件中通过
<if>
标签来实现动态 SQL - 易于集成和维护MyBatis 可以很方便地与其他主流框架集成,如 Spring 框架。在 Spring - MyBatis 集成的项目中,通过简单的配置就可以将 MyBatis 的数据源、事务管理等功能与 Spring 的依赖注入、面向切面编程等特性相结合。
- 缺点
- 编写 SQL 工作量较大
- 因为 MyBatis 需要开发人员手动编写大量的 SQL 语句,对于简单的增删改查操作,如果有很多实体类,就会花费较多的时间在编写 SQL 上。例如,一个项目中有几十个数据库表,每个表都需要基本的 CRUD(Create、Read、Update、Delete)操作,开发人员就需要编写大量的 SQL 映射文件内容。这与一些完全自动化的 ORM 框架相比,开发效率可能会受到一定影响,特别是在项目初期快速搭建原型阶段。
- SQL 语句分散
- SQL 语句分布在多个 SQL 映射文件中,当项目规模较大时,查找和管理这些 SQL 语句会变得比较复杂。如果要对某个业务功能涉及的 SQL 进行修改,可能需要在多个文件中查找相关的 SQL 片段。例如,在一个大型的金融系统中,涉及账户管理、交易处理、报表生成等多个功能模块,每个模块都有自己的 SQL 映射文件,当需要优化一个涉及多个模块的复杂业务流程的 SQL 时,定位和修改相关 SQL 语句的难度较大。
- MyBatis 允许开发人员手动编写 SQL 语句,这对于复杂的业务逻辑和数据库操作非常有帮助。例如,在处理多表联合查询时,开发人员可以根据数据库的特性(如 MySQL 的特定函数、Oracle 的分析函数等)编写高效的 SQL 语句。在一个大型企业级项目中,可能需要根据不同的条件进行动态查询,比如根据用户权限、时间范围等因素来查询数据。使用 MyBatis 可以灵活地拼接 SQL 语句,如在 SQL 映射文件中通过
三、Mybatis的缓存
-
缓存的概念和作用
- 概念:缓存是一种用于存储数据的临时存储区域,其目的是为了提高数据访问的速度。在 MyBatis 中,缓存用于存储从数据库中查询出来的结果,这样当再次需要相同的数据时,可以直接从缓存中获取,而不必再次执行 SQL 查询,从而减少数据库的访问压力,提高系统的性能。
- 作用举例:假设在一个电商应用中,频繁地查询商品的基本信息。如果没有缓存,每次查询商品信息都要向数据库发送查询请求。而有了缓存后,第一次查询商品信息后将结果存储在缓存中,之后短时间内再次查询相同商品的基本信息时,就可以直接从缓存中获取,大大提高了查询效率。
-
MyBatis 缓存的分类
- 一级缓存(本地缓存)
- 范围和生命周期:一级缓存是 SqlSession 级别的缓存。它的生命周期和 SqlSession 对象一致,当一个 SqlSession 对象被创建时,一级缓存也随之创建;当 SqlSession 对象关闭时,一级缓存也就失效了。例如,在一个事务处理过程中,所有在这个事务内的查询操作,如果查询条件相同,就可以利用一级缓存。
- 工作原理:在同一个 SqlSession 中,当执行查询操作时,MyBatis 会先查看一级缓存中是否已经存在该查询结果。如果存在,就直接从缓存中获取数据并返回;如果不存在,就执行 SQL 查询,将查询结果存入一级缓存,然后再返回结果
- 一级缓存(本地缓存)
- 二级缓存(全局缓存)
- 范围和生命周期:二级缓存是 Mapper 级别的缓存,它的范围比一级缓存更广。二级缓存的生命周期跨越多个 SqlSession 对象,只要配置了二级缓存并且缓存没有过期,不同的 SqlSession 都可以共享这个缓存。例如,在一个多用户的 Web 应用中,不同用户的请求可能会创建不同的 SqlSession,但是如果启用了二级缓存,对于相同的查询操作,就可以共享缓存结果。
- 工作原理:当在一个 SqlSession 中执行查询操作并将结果存入二级缓存后,其他 SqlSession 在执行相同的查询时,会先检查二级缓存。如果二级缓存中有符合条件的结果,就直接从二级缓存中获取并返回;如果没有,才会执行 SQL 查询。例如,假设有两个 SqlSession(sqlSession1 和 sqlSession2),在 sqlSession1 中查询了用户 ID 为 1 的用户信息并将结果存入二级缓存,之后 sqlSession2 查询相同用户 ID 的用户信息时,就可以从二级缓存中获取,减少了数据库的查询次数。不过,要启用二级缓存,需要在 MyBatis 的配置文件和 Mapper XML 文件中进行相应的配置