欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Mybatis-Plus中分頁插件PaginationInterceptor的使用

 更新時間:2023年06月21日 15:16:21   作者:互聯(lián)網(wǎng)全棧開發(fā)實(shí)戰(zhàn)  
我們在開發(fā)的過程中,經(jīng)常會遇到分頁操作,本文主要介紹了Mybatis-Plus中分頁插件PaginationInterceptor的使用,文中通過示例代碼介紹的非常詳細(xì),需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧

1. 描述

1.1 MybatisPlusInterceptor

我們在開發(fā)的過程中,經(jīng)常會遇到分頁操作,其分為邏輯分頁和物理分頁,具體可參考我的博文:邏輯分頁和物理分頁

如果你用的是Mybatis-Plus框架,可用MybatisPlusInterceptor按如下配置分頁代碼:

/**
 * @author 念兮為美
 * @datetime 2022/11/28 14:10
 * @desc mybatis plus 配置類
 */
@Configuration
public class MybatisPlusConfig {
  @Bean
  public MybatisPlusInterceptor mybatisPlusInterceptor() {
    MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
    // 設(shè)置為使用 MYSQL 方言
    interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL));
    return interceptor;
  }
}

如果你用的是低版本spring boot,可用PaginationInterceptor按如下配置:

/**
 * @author 念兮為美
 * @datetime 2022/11/27 15:22
 * @desc mybatis plus 配置類
 */
@Configuration
public class MybatisPlusConfig {
    @Bean
    public PaginationInterceptor paginationInterceptor() {
        return new PaginationInterceptor();
    }
}

MybatisPlusInterceptor插件是核心插件,目前代理了Executor#query、Executor#update、StatementHandler#prepare方法,其屬性:

private List<InnerInterceptor> interceptors = new ArrayList<>();

1.2 InnerInterceptor

注意List<InnerInterceptor>泛型中的InnerInterceptor,mybatis-plus提供的插件都將基于此接口來實(shí)現(xiàn)功能,目前已有的功能如下:

  • 自動分頁: PaginationInnerInterceptor
  • 多租戶:TenantLineInnerInterceptor
  • 動態(tài)表名:DynamicTableNameInnerInterceptor
  • 樂觀鎖:OptimisticLockerInnerInterceptor
  • sql性能規(guī)范: IllegalSQLInnerInterceptor
  • 防止全表更新與刪除: BlockAttackInnerInterceptor

【注意】使用多個功能需要注意順序關(guān)系,建議使用如下順序:

  • 多租戶
  • 動態(tài)表名
  • 分頁,樂觀鎖
  • sql性能規(guī)范,防止全表更新與刪除

總結(jié):對sql進(jìn)行單次改造的優(yōu)先放入,不對sql進(jìn)行改造的最后放入。

2. 實(shí)現(xiàn)

2.1 不帶條件的分頁查詢

編寫查詢展示類

/**
 * @author 念兮為美
 * @datetime 2023/2/2 09:58
 * @desc 用戶查詢結(jié)果
 */
@NoArgsConstructor
@Data
@ApiModel(description = "用戶返回結(jié)果")
public class UserPageVo {
  @ApiModelProperty(name = "username", value = "用戶名")
  private String username;
  @ApiModelProperty(name = "nickname", value = "昵稱")
  private String nickname;
  @ApiModelProperty(name = "userType", value = "用戶類型")
  private String userType;
}

編寫mapper

@Mapper
public interface UserMapper extends BaseMapper<User> {
   @Select("select " +
            "username,nickname,user_type as userType " +
          "from " +
            "user " +
          "order by " +
            "create_time desc"
  )
  List<UserPageVo> findPageUsers(Page<UserPageVo> page);
}

編寫service

@Service
public class UserService extends ServiceImpl<UserMapper, User> {
  @Resource private UserMapper userMapper;
  public Page<UserPageVo> findPageUsers() {
    Long currentPage = 4L;
    Long pageSize = 3L;
    Page<UserPageVo> page = new Page<>(currentPage, pageSize);
    List<UserPageVo> pageUsers = userMapper.findPageUsers(page);
    page.setRecords(pageUsers);
    return page;
  }
}

編寫controller

@Api(tags = "用戶模塊")
@RestController
@RequestMapping("/user")
@Slf4j
@Validated
public class UserController {
  @Autowired private UserService userService;
  @ApiOperationSupport(author = "念兮為美")
  @ApiOperation(value = "用戶查詢接口")
  @GetMapping("/findPageUsers")
  public Page<UserPageVo> findPageUsers() {
    return userService.findPageUsers();
  }
}

測試運(yùn)行結(jié)果

JDBC Connection [com.alibaba.druid.proxy.jdbc.ConnectionProxyImpl@2ce7d43] will not be managed by Spring
==>  Preparing: SELECT COUNT(*) AS total FROM user
==> Parameters: 
<==    Columns: total
<==        Row: 24
<==      Total: 1
==>  Preparing: select username,nickname,user_type as userType from user order by create_time desc LIMIT ?,?
==> Parameters: 9(Long), 3(Long)
<==    Columns: username, nickname, userType
<==        Row: cs, null, admin
<==        Row: lin, null, admin
<==        Row: test3, null, TEST4
<==      Total: 3

2.2 帶條件的分頁查詢

public class UserService extends ServiceImpl<UserMapper, User> {
  @Resource private UserMapper userMapper;
  public Page<User> findPageUsers() {
    Long currentPage = 1L;
    Long pageSize = 3L;
    Page<User> page = new Page<>(currentPage, pageSize);
    QueryWrapper<User> queryWrapper = new QueryWrapper<>();
    queryWrapper.eq("username", "test5");
    Page<User> userPage = userMapper.selectPage(page, queryWrapper);
    return userPage;
  }

運(yùn)行結(jié)果:

JDBC Connection [com.alibaba.druid.proxy.jdbc.ConnectionProxyImpl@475454ae] will not be managed by Spring
==>  Preparing: SELECT COUNT(*) AS total FROM user WHERE deleted = false AND (username = ?)
==> Parameters: test2(String)
<==    Columns: total
<==        Row: 1
<==      Total: 1
==>  Preparing: SELECT username,nickname,user_type FROM user WHERE deleted=false AND (username = ?) LIMIT ?
==> Parameters: test2(String), 3(Long)
<==    Columns: username, nickname, user_type
<==        Row:  test2, null,TEST6
<==      Total: 1

2.3 簡述Page類

簡單分頁模型, 有如下幾個主要屬性

/**
 * 查詢數(shù)據(jù)列表
 */
protected List<T> records = Collections.emptyList();
/**
 * 總數(shù)
 */
protected long total = 0;
/**
 * 每頁顯示條數(shù),默認(rèn) 10
 */
protected long size = 10;
/**
 * 當(dāng)前頁
 */
protected long current = 1;

3. 注意事項

3.1 UncategorizedSQLException異常

在編寫mapper.xml中的SQL語句時,或者使用@select注解編寫SQL語句時,語句末尾不能使用 ; 結(jié)尾,原因是在做分頁的時候會在編寫的SQL語句后面拼接上limit語句, 導(dǎo)致出現(xiàn)SQL語法錯誤(UncategorizedSQLException)。

可以參考我的這篇博文:全網(wǎng)最詳細(xì)的org.springframework.jdbc.UncategorizedSQLException的多種解決方法

3.2 不做記錄總數(shù)的統(tǒng)計

new Page(queryParam.getCurrent(), queryParam.getSize())的兩個參數(shù)表示:當(dāng)前頁和每頁數(shù)量

如果業(yè)務(wù)需求只需要查詢分頁做上下頁切換而不需要記錄總數(shù),可以設(shè)置第三個參數(shù)false就可以不查詢count(),以提高性能,即new Page(queryParam.getCurrent(), queryParam.getSize(), false) ,如下代碼所示:

/**
 * @author 念兮為美
 * @datetime 2022/11/28 14:20
 * @desc 用戶服務(wù)實(shí)現(xiàn)類
 */
@Service
public class UserService extends ServiceImpl<UserMapper, User> {
  @Resource private UserMapper userMapper;
  public Page<UserPageVo> findPageUsers() {
    Long currentPage = 4L;
    Long pageSize = 3L;
    Page<UserPageVo> page = new Page<>(currentPage, pageSize, false);
    List<UserPageVo> pageUsers = userMapper.findPageUsers(page);
    page.setRecords(pageUsers);
    return page;
  }

從輸出結(jié)果看,既沒有count操作,如下所示:

JDBC Connection [com.alibaba.druid.proxy.jdbc.ConnectionProxyImpl@466c39de] will not be managed by Spring
==>  Preparing: select username,nickname,user_type as userType from user order by create_time desc LIMIT ?,?
==> Parameters: 9(Long), 3(Long)
<==    Columns: username, nickname, userType
<==        Row: cs, null, admin
<==        Row: lin, null, admin
<==        Row: test3, null, TEST4
<==      Total: 3

到此這篇關(guān)于Mybatis-Plus中分頁插件PaginationInterceptor的使用的文章就介紹到這了,更多相關(guān)Mybatis-Plus PaginationInterceptor 內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • java判斷遠(yuǎn)程服務(wù)器上的文件是否存在的方法

    java判斷遠(yuǎn)程服務(wù)器上的文件是否存在的方法

    java判斷遠(yuǎn)程服務(wù)器上的文件是否存在的方法,需要的朋友可以參考一下
    2013-03-03
  • Springboot獲取前端反饋信息并存入數(shù)據(jù)庫的實(shí)現(xiàn)代碼

    Springboot獲取前端反饋信息并存入數(shù)據(jù)庫的實(shí)現(xiàn)代碼

    這篇文章主要介紹了Springboot獲取前端反饋信息并存入數(shù)據(jù)庫的實(shí)現(xiàn)代碼,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-03-03
  • Java遍歷Json的簡單實(shí)例

    Java遍歷Json的簡單實(shí)例

    這篇文章主要介紹了Java遍歷Json的簡單實(shí)例,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-07-07
  • Spring?Boot超大文件上傳實(shí)現(xiàn)秒傳功能

    Spring?Boot超大文件上傳實(shí)現(xiàn)秒傳功能

    這篇文章主要介紹了Spring?Boot超大文件上傳實(shí)現(xiàn)秒傳功能,在實(shí)現(xiàn)分片上傳的過程,需要前端和后端配合,比如前后端的上傳塊號的文件大小,前后端必須得要一致,否則上傳就會有問題,需要的朋友可以參考下
    2022-12-12
  • SpringCloud OpenFeign與Ribbon客戶端配置詳解

    SpringCloud OpenFeign與Ribbon客戶端配置詳解

    在springcloud中,openfeign是取代了feign作為負(fù)載均衡組件的,feign最早是netflix提供的,他是一個輕量級的支持RESTful的http服務(wù)調(diào)用框架,內(nèi)置了ribbon,而ribbon可以提供負(fù)載均衡機(jī)制,因此feign可以作為一個負(fù)載均衡的遠(yuǎn)程服務(wù)調(diào)用框架使用
    2022-11-11
  • 如何使用ActiveMQ中間件方式發(fā)送郵件

    如何使用ActiveMQ中間件方式發(fā)送郵件

    這篇文章主要介紹了如何使用ActiveMQ中間件方式發(fā)送郵件的操作,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-07-07
  • Java編程long數(shù)據(jù)類型的使用問題

    Java編程long數(shù)據(jù)類型的使用問題

    這篇文章主要介紹了Java編程數(shù)據(jù)類型long的使用問題,涉及長整型數(shù)據(jù)的取值范圍和不同整數(shù)類型的表示方法,需要的朋友可以參考下
    2017-09-09
  • Java8新特性Lambda表達(dá)式的一些復(fù)雜用法總結(jié)

    Java8新特性Lambda表達(dá)式的一些復(fù)雜用法總結(jié)

    lambda表達(dá)式是JAVA8中提供的一種新的特性,它支持Java也能進(jìn)行簡單的“函數(shù)式編程”。 下面這篇文章主要給大家介紹了關(guān)于Java8新特性Lambda表達(dá)式的一些復(fù)雜用法的相關(guān)資料,需要的朋友可以參考借鑒,下面來一起看看吧。
    2017-07-07
  • Java解除文件占用即Dom4j操作后實(shí)現(xiàn)xml關(guān)流

    Java解除文件占用即Dom4j操作后實(shí)現(xiàn)xml關(guān)流

    這篇文章主要介紹了Java解除文件占用即Dom4j操作后實(shí)現(xiàn)xml關(guān)流,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-04-04
  • java并發(fā)之原子操作類和非阻塞算法

    java并發(fā)之原子操作類和非阻塞算法

    這篇文章主要為大家詳細(xì)介紹了java并發(fā)之原子操作類和非阻塞算法,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-11-11

最新評論