注:详细请看2.X博客中,3.X直接上代码。

建议装一个MybatisX插件,可以在Mapper和Xml来回切换

  • pom.xml

  1. <dependencies>
  2. <dependency>
  3. <groupId>org.springframework.boot</groupId>
  4. <artifactId>spring-boot-starter</artifactId>
  5. </dependency>
  6. <dependency>
  7. <groupId>com.baomidou</groupId>
  8. <artifactId>mybatis-plus-boot-starter</artifactId>
  9. <version>3.2.0</version>
  10. </dependency>
  11. <dependency>
  12. <groupId>org.projectlombok</groupId>
  13. <artifactId>lombok</artifactId>
  14. </dependency>
  15. <dependency>
  16. <groupId>com.h2database</groupId>
  17. <artifactId>h2</artifactId>
  18. <scope>runtime</scope>
  19. </dependency>

  20. <dependency>
  21. <groupId>com.alibaba</groupId>
  22. <artifactId>fastjson</artifactId>
  23. <version>1.2.49</version>
  24. <scope>test</scope>
  25. </dependency>
  26. <!-- for testing -->
  27. <dependency>
  28. <groupId>org.springframework.boot</groupId>
  29. <artifactId>spring-boot-starter-test</artifactId>
  30. <scope>test</scope>
  31. </dependency>
  32. </dependencies>
  • 配置类

    1. @Configuration
    2. @MapperScan("com.mp.pagination.mapper")
    3. public class MybatisPlusConfig {

    4. /**
    5. * 分页插件
    6. */
    7. @Bean
    8. public PaginationInterceptor paginationInterceptor() {
    9. // 开启 count 的 join 优化,只针对 left join !!!
    10. return new PaginationInterceptor().setCountSqlParser(new JsqlParserCountOptimize(true));
    11. }
    12. }
  • application.yml

    1. # DataSource Config
    2. spring:
    3. datasource:
    4. driver-class-name: org.h2.Driver
    5. url: jdbc:h2:tcp://192.168.180.115:19200/~/mem/test
    6. username: root
    7. password: test

    8. # Logger Config
    9. logging:
    10. level:
    11. com.mp.pagination: debug

    12. mybatis-plus:
    13. mapper-locations: classpath:/mapper/*Mapper.xml
  • 实体类

    1. @Data
    2. public class Children {
    3. private Long id;
    4. private String name;
    5. private Long userId;
    6. }

    7. @Data
    8. public class User {
    9. private Long id;
    10. private String name;
    11. private Integer age;
    12. private String email;
    13. }
  • Dao层

    1. public interface UserMapper extends BaseMapper<User> {

    2. /**
    3. * 3.x 的 page 可以进行取值,多个入参记得加上注解
    4. * 自定义 page 类必须放在入参第一位
    5. * 返回值可以用 IPage<T> 接收 也可以使用入参的 MyPage<T> 接收
    6. * <li> 3.1.0 之前的版本使用注解会报错,写在 xml 里就没事 </li>
    7. * <li> 3.1.0 开始支持注解,但是返回值只支持 IPage ,不支持 IPage 的子类</li>
    8. *
    9. * @param myPage 自定义 page
    10. * @return 分页数据
    11. */
    12. // @Select("select * from user where (age = #{pg.selectInt} and name = #{pg.selectStr}) or (age = #{ps.yihao} and name = #{ps.erhao})")
    13. MyPage<User> mySelectPage(@Param("pg") MyPage<User> myPage, @Param("ps") ParamSome paramSome);


    14. @ResultMap("userChildrenMap")
    15. @Select("<script>select u.id,u.name,u.email,u.age,c.id as \"c_id\",c.name as \"c_name\",c.user_id as \"c_user_id\" " +
    16. "from user u " +
    17. "left join children c on c.user_id = u.id " +
    18. "<where>" +
    19. "<if test=\"selectInt != null\"> " +
    20. "and u.age = #{selectInt} " +
    21. "</if> " +
    22. "<if test=\"selectStr != null and selectStr != ''\"> " +
    23. "and c.name = #{selectStr} " +
    24. "</if> " +
    25. "</where>" +
    26. "</script>")
    27. MyPage<UserChildren> userChildrenPage(MyPage<UserChildren> myPage);


    28. MyPage<User> mySelectPageMap(@Param("pg") MyPage<User> myPage, @Param("map") Map param);

    29. List<User> mySelectMap(Map param);

    30. List<User> myPageSelect(MyPage<User> myPage);

    31. List<User> iPageSelect(IPage<User> myPage);

    32. List<User> rowBoundList(RowBounds rowBounds, Map map);
    33. }
  • model层

    1. @Data
    2. @Accessors(chain = true)
    3. @EqualsAndHashCode(callSuper = true)
    4. public class MyPage<T> extends Page<T> {
    5. private static final long serialVersionUID = 5194933845448697148L;

    6. private Integer selectInt;
    7. private String selectStr;
    8. private String name;

    9. public MyPage(long current, long size) {
    10. super(current, size);
    11. }
    12. }

    13. @Data
    14. @NoArgsConstructor
    15. @AllArgsConstructor
    16. public class ParamSome {

    17. private Integer yihao;
    18. private String erhao;
    19. }

    20. @Data
    21. @ToString(callSuper = true)
    22. @EqualsAndHashCode(callSuper = true)
    23. public class UserChildren extends User {

    24. private List<Children> c;
    25. }
  • xml

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

    4. <resultMap id="userChildrenMap" type="com.mp.pagination.model.UserChildren">
    5. <id column="id" property="id"/>
    6. <result column="age" property="age"/>
    7. <result column="email" property="email"/>
    8. <result column="name" property="name"/>
    9. <collection property="c" ofType="com.mp.pagination.entity.Children" columnPrefix="c_">
    10. <id column="id" property="id"/>
    11. <result column="name" property="name"/>
    12. <result column="user_id" property="userId"/>
    13. </collection>
    14. </resultMap>

    15. <select id="mySelectPage" resultType="com.mp.pagination.entity.User">
    16. select *
    17. from user
    18. where (age = #{pg.selectInt} and name = #{pg.selectStr})
    19. or (age = #{ps.yihao} and name = #{ps.erhao})
    20. </select>

    21. <select id="mySelectPageMap" resultType="com.mp.pagination.entity.User">
    22. select * from user
    23. <where>
    24. <if test="map.name!=null and map.name!=''">
    25. name like #{map.name}
    26. </if>
    27. </where>
    28. </select>

    29. <select id="mySelectMap" resultType="com.mp.pagination.entity.User">
    30. select * from user
    31. <where>
    32. <if test="name!=null and name!=''">
    33. name like #{name}
    34. </if>
    35. </where>
    36. </select>

    37. <select id="myPageSelect" resultType="com.mp.pagination.entity.User">
    38. select * from user
    39. <where>
    40. <if test="name!=null and name!=''">
    41. name like '%'||#{name}||'%'
    42. </if>
    43. </where>
    44. </select>

    45. <select id="iPageSelect" resultType="com.mp.pagination.entity.User">
    46. select * from user
    47. <where>
    48. <if test="name!=null and name!=''">
    49. name like #{name}
    50. </if>
    51. </where>
    52. </select>

    53. <select id="rowBoundList" resultType="com.mp.pagination.entity.User">
    54. select * from user
    55. <where>
    56. <if test="name!=null and name!=''">
    57. name like #{name}
    58. </if>
    59. </where>
    60. </select>
    61. </mapper>
  • 测试类

    注:这里的MyPage对Page做了一层嵌套,其实一般不用,都是通过实体类的参数带到SQL中

    1. @RunWith(SpringRunner.class)
    2. @SpringBootTest
    3. class PaginationApplicationTests {

    4. @Resource
    5. private UserMapper mapper;

    6. @Test
    7. public void lambdaPagination() {
    8. Page<User> page = new Page<>(1, 3);
    9. QueryWrapper<User> wrapper = new QueryWrapper<>();
    10. wrapper.lambda().ge(User::getAge, 1).orderByAsc(User::getAge);
    11. IPage<User> result = mapper.selectPage(page, wrapper);
    12. System.out.println(result.getTotal());
    13. Assert.assertTrue(result.getTotal() > 3);
    14. Assert.assertEquals(3, result.getRecords().size());
    15. }

    16. @Test
    17. public void tests1() {
    18. System.out.println("----- baseMapper 自带分页 ------");
    19. Page<User> page = new Page<>(1, 5);
    20. IPage<User> userIPage = mapper.selectPage(page, new QueryWrapper<User>()
    21. .eq("age", 20).eq("name", "Jack"));
    22. // assertThat(page).isSameAs(userIPage);
    23. System.out.println("总条数 ------> " + userIPage.getTotal());
    24. System.out.println("当前页数 ------> " + userIPage.getCurrent());
    25. System.out.println("当前每页显示数 ------> " + userIPage.getSize());
    26. print(userIPage.getRecords());
    27. System.out.println("----- baseMapper 自带分页 ------");

    28. System.out.println("json 正反序列化 begin");
    29. String json = JSON.toJSONString(page);
    30. Page<User> page1 = JSON.parseObject(json, Page.class);
    31. print(page1.getRecords());
    32. System.out.println("json 正反序列化 end");

    33. System.out.println("----- 自定义 XML 分页 ------");
    34. MyPage<User> myPage = new MyPage<User>(1, 5).setSelectInt(20).setSelectStr("Jack");
    35. ParamSome paramSome = new ParamSome(20, "Jack");
    36. MyPage<User> userMyPage = mapper.mySelectPage(myPage, paramSome);
    37. //assertThat(myPage).isSameAs(userMyPage);
    38. System.out.println("总条数 ------> " + userMyPage.getTotal());
    39. System.out.println("当前页数 ------> " + userMyPage.getCurrent());
    40. System.out.println("当前每页显示数 ------> " + userMyPage.getSize());
    41. print(userMyPage.getRecords());
    42. System.out.println("----- 自定义 XML 分页 ------");
    43. }

    44. @Test
    45. public void tests2() {
    46. /* 下面的 left join 不会对 count 进行优化,因为 where 条件里有 join 的表的条件 */
    47. MyPage<UserChildren> myPage = new MyPage<>(1, 5);
    48. myPage.setSelectInt(18).setSelectStr("Jack");
    49. MyPage<UserChildren> userChildrenMyPage = mapper.userChildrenPage(myPage);
    50. List<UserChildren> records = userChildrenMyPage.getRecords();
    51. records.forEach(System.out::println);

    52. /* 下面的 left join 会对 count 进行优化,因为 where 条件里没有 join 的表的条件 */
    53. myPage = new MyPage<UserChildren>(1, 5).setSelectInt(18);
    54. userChildrenMyPage = mapper.userChildrenPage(myPage);
    55. records = userChildrenMyPage.getRecords();
    56. records.forEach(System.out::println);
    57. }

    58. private <T> void print(List<T> list) {
    59. if (!CollectionUtils.isEmpty(list)) {
    60. list.forEach(System.out::println);
    61. }
    62. }


    63. @Test
    64. public void testMyPageMap() {
    65. MyPage<User> myPage = new MyPage<User>(1, 5).setSelectInt(20).setSelectStr("Jack");
    66. Map map = new HashMap(1);
    67. map.put("name", "%a");
    68. mapper.mySelectPageMap(myPage, map);
    69. myPage.getRecords().forEach(System.out::println);
    70. }

    71. @Test
    72. public void testMap() {
    73. Map map = new HashMap(1);
    74. map.put("name", "%a");
    75. mapper.mySelectMap(map).forEach(System.out::println);
    76. }

    77. @Test
    78. public void myPage() {
    79. MyPage<User> page = new MyPage<>(1, 5);
    80. page.setName("a");
    81. mapper.myPageSelect(page).forEach(System.out::println);
    82. }

    83. @Test
    84. public void iPageTest() {
    85. IPage<User> page = new Page<User>(1, 5) {
    86. private String name = "%";

    87. public String getName() {
    88. return name;
    89. }

    90. public void setName(String name) {
    91. this.name = name;
    92. }
    93. };

    94. List<User> list = mapper.iPageSelect(page);
    95. System.out.println("list.size=" + list.size());
    96. System.out.println("page.total=" + page.getTotal());
    97. }

    98. @Test
    99. public void rowBoundsTest() {
    100. RowBounds rowBounds = new RowBounds(0, 5);
    101. Map map = new HashMap(1);
    102. map.put("name", "%");
    103. List<User> list = mapper.rowBoundList(rowBounds, map);
    104. System.out.println("list.size=" + list.size());
    105. }

    106. }
    1.  

SpringBoot整合MybatisPlus3.X之分页插件(四)的更多相关文章

  1. SpringBoot-07:SpringBoot整合PageHelper做多条件分页查询

    ------------吾亦无他,唯手熟尔,谦卑若愚,好学若饥------------- 本篇博客讲述如何在SpringBoot中整合PageHelper,如何实现带多个条件,以及PageInfo中的 ...

  2. SpringBoot整合PageHelper做多条件分页查询

    https://yq.aliyun.com/articles/619586 本篇博客讲述如何在SpringBoot中整合PageHelper,如何实现带多个条件,以及PageInfo中的属性的中文解释 ...

  3. SpringBoot整合MyBatis-Plus3.1详细教程

    作者:Sans_ juejin.im/post/5cfa6e465188254ee433bc69 一.说明 Mybatis-Plus是一个Mybatis框架的增强插件,根据官方描述,MP只做增强不做改 ...

  4. SpringBoot 整合Mybatis + PageHelper 实现分页

    前言: 现在公司大多数都实现了前后端分离,前端使用Vue.React.AngularJS 等框架,不用完全依赖后端.但是如果对于比较小型的项目,没必要前后端分离,而SpringBoot也基本抛弃了Js ...

  5. SpringBoot+MyBatis多数据源使用分页插件PageHelper

    之前只用过单数据源下的分页插件,而且几乎不用配置.一个静态方法就能搞定. PageHelper.startPage(pageNum, pageSize); 后来使用了多数据源(不同的数据库),Page ...

  6. springboot整合mybatis增删改查(四):完善增删改查及整合swgger2

    接下来就是完成增删改查的功能了,首先在config包下配置Druid数据连接池,在配置之前先把相关配置在application.preperties中完善 application.preperties ...

  7. SpringBoot整合MybatisPlus3.X之SQL执行分析插件(十四)

    pom.xml <dependencies> <dependency> <groupId>org.springframework.boot</groupId& ...

  8. 5、SpringBoot+MyBaits+Maven+Idea+pagehelper分页插件

    1.为了我们平时方便开发,我们可以在同一个idea窗口创建多个项目模块,创建方式如下 2.项目中pom.xm文件的内容如下 <?xml version="1.0" encod ...

  9. springboot整合es客户端操作elasticsearch(四)

    对文档查询,在实际开发中,对文档的查询也是偏多的,记得之前在mou快递公司,做了一套事实的揽件数据操作,就是通过这个来存储数据的,由于一天的数据最少拥有3500万数据 所以是比较多的,而且还要求查询速 ...

随机推荐

  1. redis-分布式锁-刷新信号量

    为什么需要刷新信号量呢,因为信号量有过期时间: 为什么信号量需要过期时间呢,因为需要利用超时特性,解决分布式锁存在的一些固有缺陷. 而对于类似流式API来说,一般10秒的过期时间是远远不够的.因此我们 ...

  2. 激突要塞代码解阵算法+用C++/Python处理代码

    激突要塞的代码长度为6的倍数,其中每6个字符代表着一个单位,这六个字符中,第一位代表着单位的种类,后五位则包含着单位角度.X值.Y值的信息. 那么这个第一位究竟代表什么呢?一图以示之. 那么在代码中就 ...

  3. python process

    原文:https://www.cnblogs.com/LY-C/p/9145729.html 使用process模块可以创建进程 from multiprocessing import Process ...

  4. 五 mysql之多表查询

    目录 一 介绍 二 多表连接查询 1.交叉连接:不适用任何匹配条件.生成笛卡尔积 2.内连接:只连接匹配的行 3 .外链接之左连接:优先显示左表全部记录 4 .外链接之右连接:优先显示右表全部记录 5 ...

  5. 自己动手实现智能家居之温湿度数据采集存储(DHT11,MySql)

    [前言] 一个热爱技术的人一定向往有一个科技感十足的环境吧,那何不亲自实践一下属于技术人的座右铭:"技术改变世界". 就让我们一步步动手搭建一个属于自己的"智能家居平台& ...

  6. NAT网络下tcp_tw_recycle参数引起的故障

    记录一次阿里云服务器故障排查思路 公司网络是nat 环境 问题: 同一个服务有两台服务器 172.19.19.252 172.19.19.187 两台服务器 要连node5 发现172.19.19.2 ...

  7. Java 学习笔记之 Stop停止线程

    Stop停止线程: 使用stop()方法停止线程是非常暴力的,会抛出java.lang.ThreadDeath Error,但是我们无需显示捕捉, 以下捕捉只是为了看得更清晰. public clas ...

  8. 《Java语言程序设计》编程练习8.9(游戏:#字游戏)

    8.9 (游戏:#字游戏)在并字游戏中,两个玩家使用各自的标志(一方用X则另一方就用O),轮流填写3x3的网格中的某个空格.当一个玩家在网格的水平方向.垂直方向或者对角线方向上出 现了三个相同的X或三 ...

  9. 设计模式---结构型模式之适配器模式(Adapter Pattern)

    适配器模式定义 将一个类的接口,转换成客户期望的另外一个接口.适配器让原本接口不兼容的类可以合作无间. 适配器模式主要有两种类型:对象适配器和类适配器. 在详细解释这两种类型时,解释部分重要角色.生活 ...

  10. POJ 3784 Running Median (模拟水过带翻译)

    Description Moscow is hosting a major international conference, which is attended by n scientists fr ...