欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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>
相关标签: spring boot