SpringBoot整合Mybatis配置pagehelper分页插件

引入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语句的查询条件查询总总数量,所以下一条语句必须是分页查询数据
分页计算公式:select * from User Limit (pageNum-1)*pageSize,pageSize

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>
发布了32 篇原创文章 · 获赞 53 · 访问量 2470

猜你喜欢

转载自blog.csdn.net/qq_41714882/article/details/104291175