MyBatis 是一个支持普通 SQL 查询、存储过程和高级映射的持久层框架。它消除了几乎所有的 JDBC 代码和参数的手动设置以及结果集的检索。MyBatis 可以通过简单的 XML 或注解来配置和映射原始类型、接口和 Java 的 POJO(Plain Old Java Objects,普通老式 Java 对象)到数据库中的记录。
MyBatis的特点
SQL 分离:MyBatis 将 SQL 语句从 Java 代码中分离出来,通常放在 XML 文件中,使得 SQL 更加清晰,并且便于维护。
灵活的映射:提供强大的映射功能,能够将 SQL 查询的结果直接映射到 Java 对象(POJOs),包括一对一、一对多等复杂关系映射。
动态 SQL:支持基于 OGNL 表达式的动态 SQL 构建,允许根据不同的条件生成不同的 SQL 语句。
插件机制:通过插件机制可以对 SQL 执行过程进行拦截和增强,比如实现分页、缓存等功能。
与 Spring 集成:易于与 Spring 等主流框架集成,提供事务管理和依赖注入的支持。
数据库独立性:尽管 MyBatis 不像 Hibernate 那样提供完全的 ORM 解决方案,但它仍然可以在不同类型的数据库之间保持较高的移植性,只需要调整相应的 SQL 语句或使用插件如 PageHelper 来适配特定数据库的方言。
性能优化:由于它是半自动化的持久层框架,开发者可以根据需要手动编写高效的 SQL,从而获得更好的性能。
在 Java 中使用 MyBatis 进行分页
在 Java 中使用 MyBatis 进行分页查询,通常会结合数据库的分页功能或使用第三方插件如 PageHelper 来简化分页逻辑。以下是使用 PageHelper 插件进行分页的基本步骤:
引入依赖:
首先,在项目的pom.xml
文件中添加 PageHelper 和 MyBatis 的依赖。配置 PageHelper:
在 MyBatis 的配置文件中配置 PageHelper 插件,例如在mybatis-config.xml
中添加如下配置:<plugins> <plugin interceptor="com.github.pagehelper.PageInterceptor"> <!-- 配置参数 --> </plugin> </plugins>
编写 Mapper 接口:
创建对应的 Mapper 接口,并定义需要执行的查询方法。例如:public interface UserMapper { List<User> selectUsers(); }
使用 PageHelper 进行分页:
在调用查询方法之前,使用 PageHelper 提供的方法开始分页,比如PageHelper.startPage(pageNum, pageSize)
,其中pageNum
是页码,pageSize
是每页显示的数量。import com.github.pagehelper.PageHelper; import com.github.pagehelper.PageInfo; // 设置分页参数 PageHelper.startPage(pageNum, pageSize); // 执行查询 List<User> userList = userMapper.selectUsers(); // 获取分页信息 PageInfo<User> pageInfo = new PageInfo<>(userList);
处理分页结果:
使用PageInfo
类来获取分页后的数据,包括总记录数、总页数、当前页的数据列表等信息。
PageHelper插件配置
PageHelper 插件提供了丰富的配置选项来满足不同的分页需求。这些配置项可以在 MyBatis 的全局配置文件(如 mybatis-config.xml
)中定义,或者在启动 PageHelper 时通过代码方式设置。以下是 PageHelper 的一些主要配置参数:
helperDialect:
- 数据库方言,用于告诉插件使用哪种数据库的分页语法。例如:
mysql
,oracle
,sqlserver
等。如果未指定,插件会自动检测当前数据库的方言,但推荐显式指定以避免潜在问题。
- 数据库方言,用于告诉插件使用哪种数据库的分页语法。例如:
reasonable:
- 分页合理化,默认值为
false
。开启后,当pageNum <= 0
时会自动调整为第一页;当pageNum > pages
(总页数)时会自动调整为最后一页。
- 分页合理化,默认值为
supportMethodsArguments:
- 是否支持通过方法参数来传递分页参数,默认值为
false
。开启后可以不使用PageHelper.startPage
方法,而是直接在 Mapper 接口的方法中添加分页参数。
- 是否支持通过方法参数来传递分页参数,默认值为
params:
- 自定义参数,可以通过此属性来覆盖默认的分页参数名称。例如:
count=countSql;pagehelper=pageHelper
,这里指定了计数查询语句中的 count 参数和分页助手的别名。
- 自定义参数,可以通过此属性来覆盖默认的分页参数名称。例如:
autoRuntimeDialect:
- 是否自动识别数据库方言,默认值为
false
。如果开启了这个选项,则不需要手动指定helperDialect
,插件会根据运行时的数据库连接信息自动选择合适的方言。
- 是否自动识别数据库方言,默认值为
closeConn:
- 执行分页后是否关闭连接,默认值为
true
。对于某些特殊场景,比如执行存储过程时,可能需要将此选项设为false
。
- 执行分页后是否关闭连接,默认值为
offsetAsPageNum:
- 是否把
offset
当作页码来使用,默认值为false
。如果设为true
,则分页插件会自动计算出正确的offset
和limit
。
- 是否把
rowBoundsWithCount:
- 是否进行记录总数查询,默认值为
false
。开启后每次分页都会自动查询一次总数,适用于需要显示总页数或总记录数的场合。
- 是否进行记录总数查询,默认值为
pageSizeZero:
- 当
pageSize = 0
或pageSize < 0
时,是否返回全部结果,默认值为false
。
- 当
reasonableAdjust:
- 是否启用合理的调整,默认值为
true
。它会影响reasonable
属性的行为,即当pageNum <= 0
或pageNum > pages
时如何处理。
- 是否启用合理的调整,默认值为
这些配置项可以帮助开发者更好地控制分页行为,确保分页逻辑符合具体的应用需求。通常情况下,默认配置已经能够满足大部分应用的需求,但在特定场景下适当的配置调整是必要的。
注意事项
- PageHelper 默认适用于 MySQL 数据库。如果使用其他类型的数据库,可能需要根据具体数据库调整分页插件的配置。
- 在多线程环境中使用 PageHelper 时要确保线程安全,因为分页参数是基于 ThreadLocal 存储的。
- 如果应用程序已经存在事务管理,则需要注意 PageHelper 分页操作与事务之间的交互,确保不会产生意外的行为。