MybatisPlus 分页插件 Pagination Interceptor

配置分页插件

@Configuration
public class MybatisConfig {
  
    @Bean
    public PaginationInterceptor paginationInterceptor() {
        return new PaginationInterceptor();
    }
}

高版本SpringBoot中,会提示这种写法已过时, 所以采用另一种写法MybatisPlusInterceptor:

@Bean
public MybatisPlusInterceptor mybatisPlusInterceptor() {
    MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
    interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.H2));
    return interceptor;
}

MybatisPlusInterceptor

该插件是核心插件,目前代理了如下方法:

  • Executor#query
  • Executor#update
  • StatementHandler#prepare
private List<InnerInterceptor> interceptors = new ArrayList<>();

InnerInterceptor,我们提供的插件都将基于此接口来实现功能 目前已有的功能:

  • 自动分页: PaginationInnerInterceptor
  • 多租户:TenantLineInnerInterceptor
  • 动态表名: DynamicTableNameInnerInterceptor
  • 乐观锁:OptimisticLockerInnerInterceptor
  • sql性能规范: IllegalSQLInnerInterceptor
  • 防止全表更新与删除: BlockAttackInnerInterceptor

使用多个功能需要注意顺序关系,建议使用如下顺序

  • 多租户
  • 动态表名
  • 分页
  • 乐观锁
  • sql性能规范
  • 防止全表更新与删除

对sql进行单次改造的优先放入,不对sql进行改造的最后放入

Mapper及mapper.xml

@Mapper
public interface UserMapper extends BaseMapper<User> {
    List<User> findPageUsers(Page<User> page);
}
<select id="findPageUsers" resultType="org.wxmx.mybatis_plus_study.entity.User">
    select *
    from `user`
</select>

简单的分页查询

@SpringBootTest
class MybatisPlusStudyApplicationTests {
  
    @Resource
    UserMapper userMapper;
    @Test
    void contextLoads() {
        Page<User> page = new Page<>(1, 3);
        List<User> pageUsers = userMapper.findPageUsers(page);
        page.setRecords(pageUsers);
        System.out.println(page);
    }
}
JsqlParserCountOptimize sql=select *
        from `user`
==>  Preparing: SELECT COUNT(1) FROM `user`
==> Parameters: 
<==    Columns: COUNT(1)
<==        Row: 9
==>  Preparing: select * from `user` LIMIT ?
==> Parameters: 3(Long)
<==    Columns: id, name, age
<==        Row: 39a773890a1b12b8a072c1be02ff3cdc, aaa, 12
<==        Row: 3b25fb904548c28b7ac6882d86c7ae5f, wdh, 12
<==        Row: 8b0397fcdfebe37d1d26175c17ed3725, wdh, 12
<==      Total: 3

带查询条件的分页查询

此方法是使用PaginationInterceptor 作为分页插件.

@Test
void contextLoads() {
    Page<User> page = new Page<>(1, 2);
    QueryWrapper<User> queryWrapper = new QueryWrapper<>();
    queryWrapper.eq("name", "wdh");
    Page<User> page1 = userMapper.selectPage(page, queryWrapper);
   	page.setRecords(page1.getRecords()).getRecords().forEach(System.out::println);
}
JsqlParserCountOptimize sql=SELECT  id,name,age  FROM user 

 WHERE (name = ?)
==>  Preparing: SELECT COUNT(1) FROM user WHERE (name = ?)
==> Parameters: wdh(String)
<==    Columns: COUNT(1)
<==        Row: 5
==>  Preparing: SELECT id,name,age FROM user WHERE (name = ?) LIMIT ?
==> Parameters: wdh(String), 2(Long)
<==    Columns: id, name, age
<==        Row: 3b25fb904548c28b7ac6882d86c7ae5f, wdh, 12
<==        Row: 8b0397fcdfebe37d1d26175c17ed3725, wdh, 12
<==      Total: 2
Closing non transactional SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@6a0f2853]
User(id=3b25fb904548c28b7ac6882d86c7ae5f, name=wdh, age=12)
User(id=8b0397fcdfebe37d1d26175c17ed3725, name=wdh, age=12)

Page

简单分页模型, 有如下几个主要属性

/**
 * 查询数据列表
 */
protected List<T> records = Collections.emptyList();

/**
 * 总数
 */
protected long total = 0;

/**
 * 每页显示条数,默认 10
 */
protected long size = 10;

/**
 * 当前页
 */
protected long current = 1;

注意事项

在编写mapper.xml中的SQL语句的时候, 语句末尾不能使用 ; 结尾,因为做分页时,会在编写的SQL语句后面拼接Limit语句,导致出现SQL语法错误(SQLSyntaxErrorException)。如下:

JsqlParserCountOptimize sql=select *
        from `user`;
==>  Preparing: SELECT COUNT(1) FROM `user`
==> Parameters: 
<==    Columns: COUNT(1)
<==        Row: 9
==>  Preparing: select * from `user`; LIMIT ?
==> Parameters: 3(Long)
org.springframework.jdbc.BadSqlGrammarException: 

### Error querying database.  Cause: java.sql.SQLSyntaxErrorException: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'LIMIT 3' at line 1

### The error may exist in org/wxmx/mybatis_plus_study/mapper/UserMapper.xml

### The error may involve defaultParameterMap

### The error occurred while setting parameters

### SQL: select *         from `user`; LIMIT ?

### Cause: java.sql.SQLSyntaxErrorException: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'LIMIT 3' at line 1

; bad SQL grammar []; nested exception is java.sql.SQLSyntaxErrorException: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'LIMIT 3' at line 1

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要配置MyBatisPlus分页插件以支持达梦数据库,你需要进行以下操作: 首先,在你的MyBatisPlus配置类(比如MybatisPlusConfig)中添加如下代码: ```java @Configuration @MapperScan("com.a.b.mapper.*.mapper*") public class MybatisPlusConfig { @Bean public MybatisPlusInterceptor mybatisPlusInterceptor() { MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor(); PaginationInnerInterceptor paginationInnerInterceptor = new PaginationInnerInterceptor(); paginationInnerInterceptor.setDbType(DbType.DM); // 设置数据库类型为达梦数据库 paginationInnerInterceptor.setOverflow(true); interceptor.addInnerInterceptor(paginationInnerInterceptor); return interceptor; } } ``` 在以上代码中,我们使用了PaginationInnerInterceptor类,并将数据库类型设置为DbType.DM,表示达梦数据库。 接下来,在你的分页查询方法中,你可以直接使用MyBatisPlus提供的分页方法来进行分页查询,如: ```java // 导入必要的类 import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; // 在你的代码中使用分页查询 public IPage<User> getUserList(int currentPage, int pageSize) { // 创建分页对象 Page<User> page = new Page<>(currentPage, pageSize); // 构建查询条件 LambdaQueryWrapper<User> queryWrapper = new LambdaQueryWrapper<>(); // 添加其他查询条件 // 执行分页查询 IPage<User> userPage = userMapper.selectPage(page, queryWrapper); // 返回分页结果 return userPage; } ``` 通过以上的配置和代码,你就可以在MyBatisPlus中使用分页插件来支持达梦数据库的分页查询了。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值