一、PageHelper介绍
PageHelper 是 Mybatis 的一个插件,这里就不扯了,就是为了更加便捷的进行分页查询。
官方网址:https://pagehelper.github.io/
PageHelper插件的优点:
- 物理分页:支持常见的 12 种数据库Oracle,MySql,MariaDB,SQLite,DB2,PostgreSQL,SqlServer 等...
- 支持多种分页方式:支持常见的RowBounds(PageRowBounds),PageHelper.startPage 方法调用,Mapper 接口参数调用。
- QueryInterceptor 规范:使用 QueryInterceptor 规范,开发插件更轻松。
二、PageHelper使用
1. 导入pom依赖
<dependency> <groupId>com.github.pagehelper</groupId> <artifactId>pagehelper</artifactId> <version>5.2.0</version> </dependency>
2. Mybatis.cfg.xml 配置拦截器
<plugins> <plugin interceptor="com.github.pagehelper.PageInterceptor"/> </plugins>
必须配置在<environments>上面,不然会报错。
正确实例:
其他配置:
<plugins> <!-- com.github.pagehelper为PageHelper类所在包名 --> <plugin interceptor="com.github.pagehelper.PageHelper"> <!-- 支持的方言: oracle,mysql,mariadb,sqlite,hsqldb,postgresql,db2,sqlserver,informix,h2,sqlserver2012 --> <property name="dialect" value="mysql"/> <!-- 该参数默认为false --> <!-- 设置为true时,会将RowBounds第一个参数offset当成pageNum页码使用 --> <!-- 和startPage中的pageNum效果一样--> <property name="offsetAsPageNum" value="true"/> <!-- 该参数默认为false --> <!-- 设置为true时,使用RowBounds分页会进行count查询 --> <property name="rowBoundsWithCount" value="true"/> <!-- 设置为true时,如果pageSize=0或者RowBounds.limit = 0就会查询出全部的结果 --> <!-- (相当于没有执行分页查询,但是返回结果仍然是Page类型)--> <property name="pageSizeZero" value="true"/> <!-- 3.3.0版本可用 - 分页参数合理化,默认false禁用 --> <!-- 启用合理化时,如果pageNum<1会查询第一页,如果pageNum>pages会查询最后一页 --> <!-- 禁用合理化时,如果pageNum<1或pageNum>pages会返回空数据 --> <property name="reasonable" value="false"/> <!-- 3.5.0版本可用 - 为了支持startPage(Object params)方法 --> <!-- 增加了一个`params`参数来配置参数映射,用于从Map或ServletRequest中取值 --> <!-- 可以配置pageNum,pageSize,count,pageSizeZero,reasonable,orderBy,不配置映射的用默认值 --> <!-- 不理解该含义的前提下,不要随便复制该配置 --> <property name="params" value="pageNum=pageHelperStart;pageSize=pageHelperRows;"/> <!-- 支持通过Mapper接口参数来传递分页参数 --> <property name="supportMethodsArguments" value="false"/> <!-- always总是返回PageInfo类型,check检查返回类型是否为PageInfo,none返回Page --> <property name="returnPageInfo" value="none"/> </plugin> </plugins>
3. 配置 Mapper.xml
博主设置的类型是map集合,可根据需求自行修改。
<select id="listPager" resultType="java.util.Map" parameterType="java.util.Map"> select * from t_mvc_book where bname like concat(concat('%',#{bname}),'%') </select>
1. 生成一个方法接口
2. 编写service层接口和继承接口类......省略
4. 编写测试
package com.ycxw.demo; import com.github.pagehelper.PageHelper; import com.ycxw.biz.BookBiz; import com.ycxw.biz.impl.BookBizImpl; import com.ycxw.mapper.BookMapper; import com.ycxw.utils.SessionUtil; import org.apache.ibatis.session.SqlSession; import org.junit.After; import org.junit.Before; import org.junit.Test; import java.util.HashMap; import java.util.Map; /** * @author 云村小威 * @site blog.csdn.net/Justw320 * @create 2023-08-20 18:05 */ public class CURDTest { private BookBiz bookBiz; private SqlSession sqlSession; @Before public void before() { System.out.println("执行测试方法之前会执行的初始化代码块方法"); //获取一个数据库会话对象,并将其赋值给sqlSession变量 this.sqlSession = SessionUtil.openSession(); //实例化业务逻辑层 BookBizImpl book = new BookBizImpl(); //获取接口实例 BookMapper mapper = this.sqlSession.getMapper(BookMapper.class); book.setBookMapper(mapper); //最后赋值给bookBiz接口,便于对数据库进行增删改查操作 this.bookBiz = book; } @After public void after() { System.out.println("执行测试方法之后的后执行的方法"); //提交事务 this.sqlSession.commit(); } @Test public void test(){ Map map = new HashMap(); map.put("bname","圣墟"); PageHelper.startPage(1, 10); bookBiz.listPager(map).forEach(System.out::println); } }
通过这个方法可实现分页:
PageHelper.startPage(页码, 数据量);
当然,该演示只是最简单的方法,可通过方法传递动态修改页码数据等等。更多用法欢迎大佬们在评论区留言🫰
三、特殊字符处理
在mybatis中我们经常用到特殊字符动态拼接语句,如经常使用到 大于(>,>=)、小于(<,<=)、不等于(<> ,!=)符号。Mybatis使用的 *.xml文件格式,需要在尖括号进行相关的转义或者使用 CDATA 区段。
1. 使用转义字符
特殊字符 | 转义字符 |
< | < |
> | > |
& | & |
" | " |
’ | ' |
<= | <= |
>= | >= |
示例:
<select id="listPager" resultType="java.util.Map" parameterType="java.util.Map"> select * from t_mvc_book where price < 9 and price > 20 </select>
2. 使用CDATA 区段
<![CDATA[ ]]>是xml语法,在<![CDATA[ ]]>内部的所有内容都会被解析器忽略,不进行转义。所以在xml中这是一种通用方案。
特殊字符 | <![CDATA[ ]]> |
< | <![CDATA[<]]> |
> | <![CDATA[>]]> |
& | <![CDATA[&]]> |
" | <![CDATA["]]> |
’ | <![CDATA[']]> |
<= | <![CDATA[<=]]> |
>= | <![CDATA[>=]]> |
!= | <![CDATA[!=]]> |
示例:
<select id="listPager" resultType="java.util.Map" parameterType="java.util.Map"> select * from t_mvc_book where <![CDATA[ price > #{price} and #{price} != 0 ]]> </select>