mybatis流式查詢與分頁插件

来源:https://www.cnblogs.com/wandaren/archive/2022/11/21/16906569.html
-Advertisement-
Play Games

1、流式查詢 1、實體類 package com.wanqi.pojo; import java.util.Date; /** * @Description TODO * @Version 1.0.0 * @Date 2022/9/12 * @Author wandaren */ public cl ...


1、流式查詢

image.png

1、實體類

package com.wanqi.pojo;

import java.util.Date;

/**
 * @Description TODO
 * @Version 1.0.0
 * @Date 2022/9/12
 * @Author wandaren
 */

public class VoteRecord {
    private int id;
    private String userId;
    private int voteNum;
    private int groupId;
    private boolean status;
    private Date createTime;

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getUserId() {
        return userId;
    }

    public void setUserId(String userId) {
        this.userId = userId;
    }

    public int getVoteNum() {
        return voteNum;
    }

    public void setVoteNum(int voteNum) {
        this.voteNum = voteNum;
    }

    public int getGroupId() {
        return groupId;
    }

    public void setGroupId(int groupId) {
        this.groupId = groupId;
    }

    public boolean isStatus() {
        return status;
    }

    public void setStatus(boolean status) {
        this.status = status;
    }

    public Date getCreateTime() {
        return createTime;
    }

    public void setCreateTime(Date createTime) {
        this.createTime = createTime;
    }

    @Override
    public String toString() {
        return "VoteRecord{" +
                "id=" + id +
                ", userId='" + userId + '\'' +
                ", voteNum=" + voteNum +
                ", groupId=" + groupId +
                ", status=" + status +
                ", createTime=" + createTime +
                '}';
    }
}

2、mapper

package com.wanqi.mapper;

import com.wanqi.pojo.VoteRecord;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Options;
import org.apache.ibatis.annotations.ResultType;
import org.apache.ibatis.annotations.Select;
import org.apache.ibatis.cursor.Cursor;
import org.apache.ibatis.mapping.ResultSetType;
import org.apache.ibatis.session.ResultHandler;

import java.util.List;

/**
 * @Description TODO
 * @Version 1.0.0
 * @Date 2022/9/12
 * @Author wandaren
 */
@Mapper
public interface VoteRecordMapper {
//    @Select("select id, user_id as userId, vote_num as voteNum, group_id as groupId, status, create_time as createTime from vote_record")
//    @Options(resultSetType = ResultSetType.FORWARD_ONLY, fetchSize = Integer.MIN_VALUE)
//    @ResultType(VoteRecord.class)
    void all(ResultHandler<VoteRecord> resultHandler);
}

3、mapper配置

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.wanqi.mapper.VoteRecordMapper">

        <select id="all" resultType="com.wanqi.pojo.VoteRecord" resultSetType="FORWARD_ONLY"
                fetchSize="-2147483648">
            select id, user_id as userId, vote_num as voteNum, group_id as groupId, status, create_time as createTime
            from vote_record
        </select>

</mapper>

image.png
:::info
this.query.getResultType() == Type.FORWARD_ONLY
this.query.getResultFetchSize() == Integer.MIN_VALUE�
:::

  • fetchSize必須設置成-2147483648

4、自定義處理結果集

package com.wanqi.handler;

import com.wanqi.pojo.VoteRecord;
import org.apache.ibatis.session.ResultContext;
import org.apache.ibatis.session.ResultHandler;
import org.springframework.util.ObjectUtils;

import java.util.ArrayList;
import java.util.List;

/**
 * @Description TODO
 * @Version 1.0.0
 * @Date 2022/9/12
 * @Author wandaren
 */
public class VoteRecordHandler implements ResultHandler<VoteRecord> {
    // 這是每批處理的大小
    private final static int BATCH_SIZE = 1000;
    private int size;
    private final List<VoteRecord> list = new ArrayList<>();

    @Override
    public void handleResult(ResultContext<? extends VoteRecord> resultContext) {
        VoteRecord voteRecord = resultContext.getResultObject();
        list.add(voteRecord);
        size++;
        if (size == BATCH_SIZE) {
            handle();
        }
    }


    private void handle() {
        try {
            if (ObjectUtils.isEmpty(list)) {
                return;
            }
            // 在這裡可以對你獲取到的批量結果數據進行需要的業務處理
//            list.parallelStream().forEach(s -> System.out.println(s.getId()));
        } finally {
            // 處理完每批數據後後將臨時清空
            size = 0;
            list.clear();
        }
    }

    // 這個方法給外面調用,用來完成最後一批數據處理
    public void end(){
        handle();// 處理最後一批不到BATCH_SIZE的數據
    }
}

5、service層

package com.wanqi.service;

import com.github.pagehelper.PageHelper;
import com.wanqi.handler.VoteRecordHandler;
import com.wanqi.mapper.VoteRecordMapper;
import com.wanqi.pojo.VoteRecord;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.List;

/**
 * @Description TODO
 * @Version 1.0.0
 * @Date 2022/9/12
 * @Author wandaren
 */
@Service
public class VoteRecordService {
    @Autowired
    private VoteRecordMapper voteRecordMapper;


    public String allVoteRecord(){
        VoteRecordHandler voteRecordHandler = new VoteRecordHandler();
        voteRecordMapper.all(voteRecordHandler);
        System.out.println("--------------------------------------------------------");
        voteRecordHandler.end();
        return "處理結束!!!";
    }
}

2、分頁插件

1、引入依賴

		<dependency>
			<groupId>com.github.pagehelper</groupId>
			<artifactId>pagehelper-spring-boot-starter</artifactId>
			<version>1.4.3</version>
		</dependency>

2、配置文件

spring:
  redis:
    host: 172.16.156.139
    password: qifeng
    database: 2
    port: 6379
  datasource:
    type: com.alibaba.druid.pool.DruidDataSource
    url: jdbc:mysql://172.16.156.139:3306/test?allowPublicKeyRetrieval=true
    username: wq
    password: qifeng
    driver-class-name: com.mysql.cj.jdbc.Driver
mybatis:
  type-aliases-package: com.wanqi.pojo
  mapper-locations: classpath:mapper/*.xml
#分頁插件的配置
pagehelper:
  #配置四項 hprs
  helper-dialect: mysql  #分頁助手方言:mysql
  params: count=countSql  #為了支持 startPage(Object params) 方法
  support-methods-arguments: true  #支持通過 Mapper 介面參數來傳遞分頁參數,預設值 false
  reasonable: true #分頁合理化參數,預設值為 false,頁碼不為負,不超總頁碼

3、mapper介面

package com.wanqi.mapper;

import com.wanqi.pojo.VoteRecord;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.session.ResultHandler;

import java.util.List;

/**
 * @Description TODO
 * @Version 1.0.0
 * @Date 2022/9/12
 * @Author wandaren
 */
@Mapper
public interface VoteRecordMapper {
    List<VoteRecord> one();
}

4、mapper配置

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.wanqi.mapper.VoteRecordMapper">

  <select id="one" resultType="com.wanqi.pojo.VoteRecord">
        select id, user_id as userId, vote_num as voteNum, group_id as groupId, status, create_time as createTime
        from vote_record
    </select>

</mapper>

5、servlce層

package com.wanqi.service;

import com.github.pagehelper.PageHelper;
import com.wanqi.handler.VoteRecordHandler;
import com.wanqi.mapper.VoteRecordMapper;
import com.wanqi.pojo.VoteRecord;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.List;

/**
 * @Description TODO
 * @Version 1.0.0
 * @Date 2022/9/12
 * @Author wandaren
 */
@Service
public class VoteRecordService {

    @Autowired
    private VoteRecordMapper voteRecordMapper;

    public void one(){
        PageHelper.startPage(1, 50000);
        List<VoteRecord> list = voteRecordMapper.one();
        PageInfo<VoteRecord> pageInfo = new PageInfo<>(list);
        System.out.println("getTotal: "+pageInfo.getTotal());
        System.out.println("getPages: "+pageInfo.getPages());
        System.out.println("getPageNum: "+pageInfo.getPageNum());
        System.out.println("getPageSize: "+pageInfo.getPageSize());
        System.out.println("getEndRow: "+pageInfo.getEndRow());
    }
}

您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 大家好,歡迎來到 Crossin的編程教室 ! 前幾天,後臺老有小伙伴留言“愛心代碼”。這不是Crossin很早之前發過的內容嘛,怎麼最近突然又被人翻出來了?後來才知道,原來是一部有關程式員的青春偶像劇《點燃我,溫暖你》在熱播,而劇中有一段關於期中考試要用程式畫一個愛心的橋段。 於是出於好奇,Cro ...
  • 列表和字典的區別是列表可以通過索引來訪問值,而字典可以通過名稱來訪問各個值。 字典這種數據結構稱為映射(mapping),字典是Python中唯一內置映射類型,值不按照順序排列,而是存儲再鍵下麵。 其中鍵可以是數字、字元串或元組等不可變數據類型。 字典的用途 字典的名稱指出了這種數據結構的用途。日常 ...
  • 來源:blog.csdn.net/u014454538/article/details/98515807 1. Java中的線程安全 Java線程安全:狹義地認為是多線程之間共用數據的訪問。 Java語言中各種操作共用的數據有5種類型:不可變、絕對線程安全、相對線程安全、線程相容、線程獨立 ① 不可 ...
  • 1、快速開始 1.1、現有一張 User 表,其表結構如下 | id | name | age | emali | | | | | | | 1 | Jone | 18 | [email protected] | | 2 | Jack | 20 | [email protected] | | 3 ...
  • 在JSP頁面實現驗證碼校驗文章中當時是使用的Servlet類來進行的驗證碼校驗,但是這種方式並不能即時校驗,在正常情況下都是直接在用戶輸入之後就進行校驗,這樣對用戶來說很方便的。 AJAX 即“Asynchronous Javascript And XML”(非同步 JavaScript 和 XML) ...
  • 抽象類:可以作為頂層基類,從高層次規範編程介面 1、在abc模塊中,最常見的抽象類有Iterable,我們可以用他判斷一個對象是不是可迭代對象 1 from collections.abc import Iterable 2 3 4 class Valley: 5 6 def __iter__(se ...
  • 流程式控制制主要作用於:用來判斷某個程式在不同條件下,執行不同邏輯。 按結構分類,流程式控制制可分為:順序結構、選擇結構、迴圈結構 順序結構:程式從上往下執行 選擇結構:根據程式在不同條件下,選擇執行不同的邏輯代碼 迴圈結構:在一定的條件下,重覆執行某段代碼 選擇結構 java選擇結構的語句有:if語句 i ...
  • 虛擬機 1.1 發展歷程 1.1.1 java往事 ​ Java誕生在一群懶惰、急躁而傲慢的程式天才之中。 ​ 1990年12月,Sun的工程師Patrick Naughton被當時糟糕的Sun C++工具折磨的快瘋了。他大聲抱怨,並威脅要離開Sun轉投當時在Steve Jobs領導之下的NeXT公 ...
一周排行
    -Advertisement-
    Play Games
  • Dapr Outbox 是1.12中的功能。 本文只介紹Dapr Outbox 執行流程,Dapr Outbox基本用法請閱讀官方文檔 。本文中appID=order-processor,topic=orders 本文前提知識:熟悉Dapr狀態管理、Dapr發佈訂閱和Outbox 模式。 Outbo ...
  • 引言 在前幾章我們深度講解了單元測試和集成測試的基礎知識,這一章我們來講解一下代碼覆蓋率,代碼覆蓋率是單元測試運行的度量值,覆蓋率通常以百分比表示,用於衡量代碼被測試覆蓋的程度,幫助開發人員評估測試用例的質量和代碼的健壯性。常見的覆蓋率包括語句覆蓋率(Line Coverage)、分支覆蓋率(Bra ...
  • 前言 本文介紹瞭如何使用S7.NET庫實現對西門子PLC DB塊數據的讀寫,記錄了使用電腦模擬,模擬PLC,自至完成測試的詳細流程,並重點介紹了在這個過程中的易錯點,供參考。 用到的軟體: 1.Windows環境下鏈路層網路訪問的行業標準工具(WinPcap_4_1_3.exe)下載鏈接:http ...
  • 從依賴倒置原則(Dependency Inversion Principle, DIP)到控制反轉(Inversion of Control, IoC)再到依賴註入(Dependency Injection, DI)的演進過程,我們可以理解為一種逐步抽象和解耦的設計思想。這種思想在C#等面向對象的編 ...
  • 關於Python中的私有屬性和私有方法 Python對於類的成員沒有嚴格的訪問控制限制,這與其他面相對對象語言有區別。關於私有屬性和私有方法,有如下要點: 1、通常我們約定,兩個下劃線開頭的屬性是私有的(private)。其他為公共的(public); 2、類內部可以訪問私有屬性(方法); 3、類外 ...
  • C++ 訪問說明符 訪問說明符是 C++ 中控制類成員(屬性和方法)可訪問性的關鍵字。它們用於封裝類數據並保護其免受意外修改或濫用。 三種訪問說明符: public:允許從類外部的任何地方訪問成員。 private:僅允許在類內部訪問成員。 protected:允許在類內部及其派生類中訪問成員。 示 ...
  • 寫這個隨筆說一下C++的static_cast和dynamic_cast用在子類與父類的指針轉換時的一些事宜。首先,【static_cast,dynamic_cast】【父類指針,子類指針】,兩兩一組,共有4種組合:用 static_cast 父類轉子類、用 static_cast 子類轉父類、使用 ...
  • /******************************************************************************************************** * * * 設計雙向鏈表的介面 * * * * Copyright (c) 2023-2 ...
  • 相信接觸過spring做開發的小伙伴們一定使用過@ComponentScan註解 @ComponentScan("com.wangm.lifecycle") public class AppConfig { } @ComponentScan指定basePackage,將包下的類按照一定規則註冊成Be ...
  • 操作系統 :CentOS 7.6_x64 opensips版本: 2.4.9 python版本:2.7.5 python作為腳本語言,使用起來很方便,查了下opensips的文檔,支持使用python腳本寫邏輯代碼。今天整理下CentOS7環境下opensips2.4.9的python模塊筆記及使用 ...