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

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

  • pom.xml

<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.2.0</version>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
<dependency>
<groupId>com.h2database</groupId>
<artifactId>h2</artifactId>
<scope>runtime</scope>
</dependency>

<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.49</version>
<scope>test</scope>
</dependency>
<!-- for testing -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
  • 配置类

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

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

    # DataSource Config
    spring:
    datasource:
    driver-class-name: org.h2.Driver
    url: jdbc:h2:tcp://192.168.180.115:19200/~/mem/test
    username: root
    password: test

    # Logger Config
    logging:
    level:
    com.mp.pagination: debug

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

    @Data
    public class Children {
    private Long id;
    private String name;
    private Long userId;
    }

    @Data
    public class User {
    private Long id;
    private String name;
    private Integer age;
    private String email;
    }
  • Dao层

    public interface UserMapper extends BaseMapper<User> {

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


    @ResultMap("userChildrenMap")
    @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\" " +
    "from user u " +
    "left join children c on c.user_id = u.id " +
    "<where>" +
    "<if test=\"selectInt != null\"> " +
    "and u.age = #{selectInt} " +
    "</if> " +
    "<if test=\"selectStr != null and selectStr != ''\"> " +
    "and c.name = #{selectStr} " +
    "</if> " +
    "</where>" +
    "</script>")
    MyPage<UserChildren> userChildrenPage(MyPage<UserChildren> myPage);


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

    List<User> mySelectMap(Map param);

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

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

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

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

    private Integer selectInt;
    private String selectStr;
    private String name;

    public MyPage(long current, long size) {
    super(current, size);
    }
    }

    @Data
    @NoArgsConstructor
    @AllArgsConstructor
    public class ParamSome {

    private Integer yihao;
    private String erhao;
    }

    @Data
    @ToString(callSuper = true)
    @EqualsAndHashCode(callSuper = true)
    public class UserChildren extends User {

    private List<Children> c;
    }
  • xml

    <?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.mp.pagination.mapper.UserMapper">

    <resultMap id="userChildrenMap" type="com.mp.pagination.model.UserChildren">
    <id column="id" property="id"/>
    <result column="age" property="age"/>
    <result column="email" property="email"/>
    <result column="name" property="name"/>
    <collection property="c" ofType="com.mp.pagination.entity.Children" columnPrefix="c_">
    <id column="id" property="id"/>
    <result column="name" property="name"/>
    <result column="user_id" property="userId"/>
    </collection>
    </resultMap>

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

    <select id="mySelectPageMap" resultType="com.mp.pagination.entity.User">
    select * from user
    <where>
    <if test="map.name!=null and map.name!=''">
    name like #{map.name}
    </if>
    </where>
    </select>

    <select id="mySelectMap" resultType="com.mp.pagination.entity.User">
    select * from user
    <where>
    <if test="name!=null and name!=''">
    name like #{name}
    </if>
    </where>
    </select>

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

    <select id="iPageSelect" resultType="com.mp.pagination.entity.User">
    select * from user
    <where>
    <if test="name!=null and name!=''">
    name like #{name}
    </if>
    </where>
    </select>

    <select id="rowBoundList" resultType="com.mp.pagination.entity.User">
    select * from user
    <where>
    <if test="name!=null and name!=''">
    name like #{name}
    </if>
    </where>
    </select>
    </mapper>
  • 测试类

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

    @RunWith(SpringRunner.class)
    @SpringBootTest
    class PaginationApplicationTests {

    @Resource
    private UserMapper mapper;

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

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

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

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

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

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

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


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

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

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

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

    public String getName() {
    return name;
    }

    public void setName(String name) {
    this.name = name;
    }
    };

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

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

    }
     

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. 在Debian上用FVWM做自己的桌面

    用FVWM做自己的桌面 Table of Contents 1. 前言 2. 学习步骤 3. 准备 3.1. 软件包 3.2. 字体 3.3. 图片 3.4. 参考资料 4. 环境 5. 布局 6. ...

  2. 痞子衡嵌入式:MCUBootUtility v2.0来袭,i.MXRT1010哪里逃

    -- 恩智浦半导体从2017年10月开始正式推出业内首款跨界处理器-i.MX RT系列,如今距离该系列第一款i.MXRT1050发布已过去近2年,i.MX RT系列在行业里应用越来越广泛,i.MX R ...

  3. java8 base64使用

    java 1.8中引入了Base64,不在需要引入第三方库就可以使用base64了. 在需要用到base64进行加密解密的时候就可以使用了 String text = "base64 in ...

  4. Flask基础(05)-->路由的基本定义

    # 导入Flask from flask import Flask # 创建Flask的应用程序 app = Flask(__name__) # http://127.0.0.1:5000/123或者 ...

  5. C# 读取控制台的Console.Write

    一个程序去调用另一个xxx.exe的时候,需要记录下这个exe里面的console.write的输出 public static string InvokeExcute(string Command) ...

  6. request.getAttribute()和request.getParameter()

    request.getParameter()取得是通过容器的实现来取得通过类似post,get等方式传入的数据,request.setAttribute()和getAttribute()只是在web容 ...

  7. Spring Cloud 入门系列(一)

    前言 Spring Could作为目前最流行基于Java开发的构建微服务的完整框架.发现目前相关系列教程太少,本文是基于官网教程做的一套翻译. 何为Spring Cloud? Spring Cloud ...

  8. 并发新构件之CountDownLatch

    CountDownLatch译为倒计时锁存器:JDK描述     :允许一个或多个线程等待直到在其他线程中执行的一组操作完成的同步辅助. A CountDownLatch用给定的计数初始化. awai ...

  9. MySQL基础(五)常见运算符

    MySQL常见运算符 运算符连接表达式中各个操作数,其作用是用来指明对操作数所进行的运算.常见的运算有数学计算.比较运算.位运算以及逻辑运算.运用运算符可以更加灵活地使用表中的数据,常见的运算符类型有 ...

  10. ride工具使用

    1.新建project,suite, testcase (1) 新建project:file->new project  ,输入工程名,选择Type选directory,选择工程存放路径,ok ...