SpringBoot整合Mybatis配置pagehelper分页插件
程序员文章站
2022-07-15 10:27:03
...
引入pagehelper依赖
<!--pagehelper分页插件 -->
<dependency>
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper-spring-boot-starter</artifactId>
<version>1.2.5</version>
</dependency>
Springboot配置文件配置pagehelper属性和Mybatis属性
#分页插件 pagehelper
#pagehelper:
# #定义数据库语言
# helper-dialect: mysql
# #分页参数合理化
# reasonable: true
# support-methods-arguments: true
# #支持通过Mapper接口参数来传递分页参数
# params: count=countSql
mybatis:
#指定mapper.xml路径
mapper-locations: classpath:mapper/*Mapper.xml
#指定mybatis配置文件
config-location: classpath:mybatis-config.xml
#:mybatis允许设置别名
# type-aliases-package: com.springboot.agriculture.entity
#打印sql
# configuration.log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
在config-location: classpath:mybatis-config.xml 指定自定义的XML格式的配置
mybatis-config.xml配置
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<settings>
<setting name="cacheEnabled" value="true" /> <!-- 全局映射器启用缓存 -->
<setting name="lazyLoadingEnabled" value="true" /> <!-- 查询时,关闭关联对象即时加载以提高性能 -->
<setting name="aggressiveLazyLoading" value="false" /> <!-- 设置关联对象加载的形态,此处为按需加载字段(加载字段由SQL指 定),不会加载关联表的所有字段,以提高性能 -->
<setting name="multipleResultSetsEnabled" value="true" /> <!-- 对于未知的SQL查询,允许返回不同的结果集以达到通用的效果 -->
<setting name="useColumnLabel" value="true" /> <!-- 允许使用列标签代替列名 -->
<setting name="useGeneratedKeys" value="true" /> <!-- 允许使用自定义的主键值(比如由程序生成的UUID 32位编码作为键值),数据表的PK生成策略将被覆盖 -->
<setting name="autoMappingBehavior" value="FULL" /> <!-- 给予被嵌套的resultMap以字段-属性的映射支持 -->
<setting name="defaultExecutorType" value="REUSE" /> <!-- 对于批量更新操作缓存SQL以提高性能 -->
<setting name="defaultStatementTimeout" value="25000" /><!-- 数据库超过25000秒仍未响应则超时 -->
<setting name="logImpl" value="STDOUT_LOGGING" /><!-- 控制台打印sql -->
</settings>
<plugins>
<!-- com.github.pagehelper为PageHelper类所在包名 -->
<!-- <plugin interceptor="com.github.pagehelper.PageHelper"> -->
<plugin interceptor="com.github.pagehelper.PageInterceptor">
<!-- <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="false"/>
<!-- 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中取值 -->
</plugin>
</plugins>
</configuration>
至此PageHelper插件就配置成功了,下面我们进行测试:
简单的分页查询
Controller
@RequestMapping(value = "/getListPage")
@ResponseBody
public CommonResponse getListPage(Model model, HttpServletRequest request,
@RequestParam(value = "pageNum", defaultValue = "1") Integer pageNum,
@RequestParam(value = "pageSize", defaultValue = "2") Integer pageSize) {
// 自动查询总条数/自动分页
PageInfo<User> pageInfo = userService.findAll(pageNum, pageSize);
return CommonResponseUtil.success(pageInfo);
}
ServiceImpl
/**
* pageNum 当前页码 pageSize 每页条数
*/
@Override
public PageInfo<User> findAll(Integer pageNum, Integer pageSize) {
// PageHelper开启分页查询,根据下一条sql添加查询条件查询出总数量
PageHelper.startPage(pageNum, pageSize);
// 自定义查询数据结果集,PageHelper自动加上Limit pageSize
List<User> userAll = usermapper.findAll();
PageInfo<User> pageInfo = new PageInfo<>(userAll);
return pageInfo;
}
这里需要注意:
PageHelper.startPage(pageNum, pageSize);开启分页查询,并且根据下一条sql语句的查询条件查询总总数量,所以下一条语句必须是分页查询数据
PageInfo结果集对象
{
"code": 1000,
"data": {
"total": 5,
"list": [
{
"id": 41,
"caseCode": "11111111111111111111",
"companyCode": "1142011500000144",
"punish": "420122196910198730",
"punishCode": "11111111111111111111",
"caseType": "0",
"violation": "1",
"punishResult": "4",
"punishDate": "2019-12-23",
"createCode": "100536",
"indCate": "2",
"bz": "1",
"createDate": "2019-12-04 14:00:08"
},
{
"id": 28,
"caseCode": "12313232323232323232",
"companyCode": "1142011500000144",
"punish": "420122196910198730",
"punishCode": "12313232323232323232",
"caseType": "1",
"violation": "2121ghgk",
"punishResult": "3",
"punishDate": "2019-12-17",
"createCode": "100536",
"indCate": "1",
"bz": "221"
}
],
"pageNum": 1,
"pageSize": 2,
"size": 2,
"startRow": 1,
"endRow": 2,
"pages": 3,
"prePage": 0,
"nextPage": 2,
"isFirstPage": true,
"isLastPage": false,
如果是复杂分页查询:
在当前分页数据查询条件中有可能存在其它对象数据条件,例如对当前登录用户的企业处罚信息查询分页,那么我们就必须首先查询出所有当前登录用户的企业信息,根据企业信息筛选查询出有处罚的企业信息
- 用户在分页查询条件选择了企业信息,那么查询指定企业的处罚信息
- 没有勾选分选查询条件,则查询当前用户所有的企业处罚信息
针对没有勾选查询条件,需要查询出所有数据的情况,首先要遍历当前登录用户企业List com 查询出单位处罚信息并保存在list集合,在根据list结果集通过foreach遍历查询出最终的企业处罚分页信息,封装到PageHelper
一定要注意:PageHelper.startPage(pageNum, pageSize);才是开启分页查询,紧跟下一个sql语句就是分页条件查询
/**
* CompanyCase : 当前企业处罚条件查询封装对象
* List<Company> com : 当前登录用户的企业信息列
*/
@Override
public PageInfo<CompanyCase> findAllMan(Integer pageNum, Integer pageSize, CompanyCase comCase, List<Company> com) {
// PageHelper.startPage(pageNum, pageSize);
// List<CompanyCase> caseList = new ArrayList<CompanyCase>();
List<Integer> list = new ArrayList<Integer>();
PageInfo<CompanyCase> pageInfo = new PageInfo<>();
if (StringUtils.isEmpty(comCase.getCompanyCode())) {
// 查询条件中没有企业信息,查询登录用户下所有企业的单位处罚
for (Company company : com) {
//查询出企业信息设置到企业处罚对象
comCase.setCompanyCode(company.getCompanyCode());
//companyAll 企业处罚可能有多条记录
List<CompanyCase> companyAll = companyCaseMapper.findAllMan(comCase);
for (CompanyCase companyCase : companyAll) {
list.add(companyCase.getId());
}
}
if (list.size() > 0 && list != null) {
//这里才是真正的分页查询
PageHelper.startPage(pageNum, pageSize);
List<CompanyCase> cs = companyCaseMapper.selectList(list);
PageInfo<CompanyCase> pageInfos = new PageInfo<>(cs);
return pageInfos;
} else {
PageInfo<CompanyCase> pageInfos = new PageInfo<>();
return pageInfos;
}
} else {
PageHelper.startPage(pageNum, pageSize);
// 查询条件中有企业编码,查询指定企业的单位处罚
List<CompanyCase> companyAll = companyCaseMapper.findAllMan(comCase);// 自动查询总条数/自动分页
pageInfo.setList(companyAll);
}
return pageInfo;
}
Sql语句,筛选出来的企业处罚信息对象通过In查询封装到PageHelper
<select id="selectList" resultMap="BaseResultMap" parameterType="java.util.List">
select
*
from company_case where id in
<foreach collection="list" item="item" index="index" open="("
separator="," close=") order by create_date desc">
#{item}
</foreach>
</select>
上一篇: JDK动态代理实现
推荐阅读
-
SpringBoot项目中分页插件PageHelper无效的问题及解决方法
-
Mybatis分页PageHelper插件代码实例
-
MyBatis 分页插件 PageHelper 使用
-
Springboot集成通用Mapper与Pagehelper,实现mybatis+Druid的多数据源配置
-
springboot多数据源配置mybatis采用druid连接池对mysql,hive双数据源整合
-
Springboot集成mybatis通用Mapper与分页插件PageHelper
-
springboot 整合 Mybatis的分页插件 PageHelper
-
springboot+mybatis整合分页插件
-
SpringBoot整合Mybatis配置pagehelper分页插件
-
springboot整合mybatis和分页插件pagehelper