溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

MyBatis-Plus 分頁(yè)查詢以及自定義sql分頁(yè)的實(shí)現(xiàn)

發(fā)布時(shí)間:2020-09-06 18:10:58 來(lái)源:腳本之家 閱讀:2762 作者:IT賤男 欄目:開(kāi)發(fā)技術(shù)

一、引言

分頁(yè)查詢每個(gè)人程序猿幾乎都使用過(guò),但是有部分同學(xué)不懂什么是物理分頁(yè)和邏輯分頁(yè)。

物理分頁(yè):相當(dāng)于執(zhí)行了limit分頁(yè)語(yǔ)句,返回部分?jǐn)?shù)據(jù)。物理分頁(yè)只返回部分?jǐn)?shù)據(jù)占用內(nèi)存小,能夠獲取數(shù)據(jù)庫(kù)最新的狀態(tài),實(shí)施性比較強(qiáng),一般適用于數(shù)據(jù)量比較大,數(shù)據(jù)更新比較頻繁的場(chǎng)景。

邏輯分頁(yè):一次性把全部的數(shù)據(jù)取出來(lái),通過(guò)程序進(jìn)行篩選數(shù)據(jù)。如果數(shù)據(jù)量大的情況下會(huì)消耗大量的內(nèi)存,由于邏輯分頁(yè)只需要讀取數(shù)據(jù)庫(kù)一次,不能獲取數(shù)據(jù)庫(kù)最新?tīng)顟B(tài),實(shí)施性比較差,適用于數(shù)據(jù)量小,數(shù)據(jù)穩(wěn)定的場(chǎng)合。

那么MP中的物理分頁(yè)怎么實(shí)現(xiàn)呢? 往下看往下看

二、配置

創(chuàng)建MybatisPlusConfig配置類,需要配置分頁(yè)插件,小編使用的Spring boot配置方式。

/**
 * @Auther: IT賤男
 * @Date: 2019/6/12 15:06
 * @Description: MybatisPlus配置類
 */
@Configuration
public class MyBatisPlusConfig {

  /**
   * 分頁(yè)插件
   * @return
   */
  @Bean
  public PaginationInterceptor paginationInterceptor() {
    return new PaginationInterceptor();
  }
}

三、具體分頁(yè)實(shí)現(xiàn)

MP的Wrapper提供了兩種分頁(yè)查詢的方式,源碼如下:

  /**
   * 根據(jù) entity 條件,查詢?nèi)坑涗洠ú⒎?yè))
   *
   * @param page     分頁(yè)查詢條件(可以為 RowBounds.DEFAULT)
   * @param queryWrapper 實(shí)體對(duì)象封裝操作類(可以為 null)
   */
  IPage<T> selectPage(IPage<T> page, @Param(Constants.WRAPPER) Wrapper<T> queryWrapper);

  /**
   * 根據(jù) Wrapper 條件,查詢?nèi)坑涗洠ú⒎?yè))
   *
   * @param page     分頁(yè)查詢條件
   * @param queryWrapper 實(shí)體對(duì)象封裝操作類
   */
  IPage<Map<String, Object>> selectMapsPage(IPage<T> page, @Param(Constants.WRAPPER) Wrapper<T> queryWrapper);

可見(jiàn)兩個(gè)分頁(yè)方法參數(shù)都是一致的,只是返回參數(shù)略有不同,具體選擇根據(jù)實(shí)際業(yè)務(wù)為準(zhǔn)。

  /**
   * 分頁(yè)查詢
   */
  @Test
  public void selectByPage() {
    QueryWrapper<User> wrapper = new QueryWrapper();
    wrapper.like("name", "雨").lt("age", 40);

    Page<User> page = new Page<>(1,2);

    //IPage<User> userIPage = userMapper.selectPage(page, wrapper);

    IPage<Map<String, Object>> mapIPage = userMapper.selectMapsPage(page, wrapper);


    System.out.println("總頁(yè)數(shù)"+mapIPage.getPages());
    System.out.println("總記錄數(shù)"+mapIPage.getTotal());
    List<Map<String, Object>> records = mapIPage.getRecords();
    records.forEach(System.out::println);
  }

以上分頁(yè)查詢執(zhí)行sql如下,先是查詢了一次總記錄數(shù),然后在查詢的數(shù)據(jù)。

DEBUG==>  Preparing: SELECT COUNT(1) FROM user WHERE name LIKE ? AND age < ?
DEBUG==> Parameters: %雨%(String), 40(Integer)
TRACE<==    Columns: COUNT(1)
TRACE<==        Row: 2
DEBUG==>  Preparing: SELECT id,name,age,email,manager_id,create_time FROM user WHERE name LIKE ? AND age < ? LIMIT ?,?
DEBUG==> Parameters: %雨%(String), 40(Integer), 0(Long), 2(Long)
TRACE<==    Columns: id, name, age, email, manager_id, create_time
TRACE<==        Row: 2, 張雨琪, 31, zjq@baomidou.com, 1088248166370832385, 2019-01-14 09:15:15
TRACE<==        Row: 3, 劉紅雨, 31, lhm@baomidou.com, 1088248166370832385, 2019-01-14 09:48:16
DEBUG<==      Total: 2
總頁(yè)數(shù)1
總記錄數(shù)2

現(xiàn)在我們有需求只要查詢數(shù)據(jù)即可, 不關(guān)心總記錄數(shù)等,如果使用默認(rèn)的方式就消耗不必要的性能。那么解決辦法也是很簡(jiǎn)單的,只需要在創(chuàng)建page對(duì)象時(shí)傳入第三個(gè)參數(shù)為false即可。

 Page<User> page = new Page<>(1,2,false);

四、自定義sql分頁(yè)查詢

有時(shí)候查詢的數(shù)據(jù)難免會(huì)出現(xiàn)多表連接查詢,或者是一些復(fù)雜的sql語(yǔ)句,但是這些語(yǔ)句也是需要支持分頁(yè)查詢的,

先定義查詢接口,第一個(gè)參數(shù)要是分頁(yè)的參數(shù),小編這里演示就寫簡(jiǎn)單的sql。

步驟一:在mapper文件中,編寫對(duì)應(yīng)的分頁(yè)查詢接口。

步驟二:在xml中編寫對(duì)應(yīng)的sql語(yǔ)句,小編這里演示的 “${ew.customSqlSegment}”,這個(gè)是如果你想自定義的sql語(yǔ)句,也想使用wrapper查詢條件構(gòu)造器,則需要在mapper接口中添加參數(shù),以及xml中也要有固定。 

  /**
   * 自定義sql分頁(yè)
   * @param page
   * @param queryWrapper 看這里看這里,如果自定義的方法中需要用到wrapper查詢條件,需要這樣寫
   * @return
   */
  IPage<User> selectMyPage(IPage<User> page, @Param(Constants.WRAPPER) Wrapper<User> queryWrapper);
<?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.example.demo.mapper.UserMapper">

  <select id="selectMyPage" resultType="com.example.demo.model.User">
    SELECT * FROM user ${ew.customSqlSegment}
  </select>

</mapper>
  /**
   * 自定義sql分頁(yè)查詢
   */
  @Test
  public void selectByMyPage() {
    QueryWrapper<User> wrapper = new QueryWrapper();
    wrapper.like("name", "雨").lt("age", 40);
    Page<User> page = new Page<>(1,2);
    IPage<User> mapIPage = userMapper.selectMyPage(page, wrapper);

    System.out.println("總頁(yè)數(shù)"+mapIPage.getPages());
    System.out.println("總記錄數(shù)"+mapIPage.getTotal());
    List<User> records = mapIPage.getRecords();
    records.forEach(System.out::println);
  }

五、多表sql分頁(yè)查詢

看評(píng)論有小伙伴反饋多表連接查詢?cè)趺捶猪?yè),其實(shí)道理都是一樣的。

小編以簡(jiǎn)單的為主,sql如下: his_ipd_encounter、his_user 兩張表

<?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.example.demo.mapper.UserMapper">

  <select id="selectByHisName" resultType="java.lang.String">
    select u.realname from his_ipd_encounter e, his_user u where e.his_uid = u.his_uid
  </select>
  

</mapper>

mapepr如下:需要傳入分頁(yè)的參數(shù),返回的類型也需要是分頁(yè)對(duì)象

/**
 * <p>
 * 用戶 Mapper 接口
 * </p>
 *
 * @author IT賤男
 * @since 2019-06-14
 */
public interface UserMapper extends MyMapper<User> {


  /**
   * 多表查詢分頁(yè)
   * @param page
   * @return
   */
  IPage<String> selectByHisName(IPage<User> page);
}

測(cè)試如下:通過(guò)查看日志,執(zhí)行的sql加了分頁(yè)條件的。

  @Test
  public void select(){
    // 創(chuàng)建分頁(yè)參數(shù)
    Page<User> page = new Page<>(1,2);
    IPage<String> result = userMapper.selectByHisName(page);
    // 獲取數(shù)據(jù)
    List<String> records = result.getRecords();
    records.forEach(System.out::println);
    System.out.println("總頁(yè)數(shù) = "+ result.getPages());
  }

ARNWarn: Could not find @TableId in Class: com.example.demo.model.HisUser.
INFOStarted UserMapperTest in 2.428 seconds (JVM running for 2.959)
select u.realname from his_ipd_encounter e, his_user u where e.his_uid = u.his_uid
DEBUG==>  Preparing: SELECT COUNT(1) FROM his_ipd_encounter e, his_user u WHERE e.his_uid = u.his_uid
DEBUG==> Parameters:
TRACE<==    Columns: COUNT(1)
TRACE<==        Row: 117
DEBUG==>  Preparing: select u.realname from his_ipd_encounter e, his_user u where e.his_uid = u.his_uid LIMIT ?,?
DEBUG==> Parameters: 0(Long), 2(Long)
TRACE<==    Columns: realname
TRACE<==        Row: 胡伯云
TRACE<==        Row: 安元慧
DEBUG<==      Total: 2
 Time:20 ms - ID:com.example.demo.mapper.UserMapper.selectByHisName
Execute SQL:
    com.p6spy.engine.wrapper.PreparedStatementWrapper@61bcbcce

胡伯云
安元慧
總頁(yè)數(shù) = 59

到此這篇關(guān)于MyBatis-Plus 分頁(yè)查詢以及自定義sql分頁(yè)的實(shí)現(xiàn)的文章就介紹到這了,更多相關(guān)MyBatis-Plus 自定義sql分頁(yè)內(nèi)容請(qǐng)搜索億速云以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持億速云!

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI