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>
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章