mybatis配置分页插件

举报
JavaEdge 发表于 2022/04/20 23:03:36 2022/04/20
【摘要】 @Configuration public class MybatisConfig { @Bean public PaginationInterceptor paginationInterceptor() { return new PaginationInterceptor(); } }高版本SpringBoot中,会提示这种写法已过时, 所以...


 @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
【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。