侧边栏壁纸
  • 累计撰写 57 篇文章
  • 累计创建 23 个标签
  • 累计收到 4 条评论

MybatisPlus从入门到精通-基础篇

cluski
2022-04-08 / 0 评论 / 2 点赞 / 143 阅读 / 19,325 字
温馨提示:
本文最后更新于 2022-04-09,若内容或图片失效,请留言反馈。部分素材来自网络,若不小心影响到您的利益,请联系我们删除。

MybatisPlus从入门到精通-基础篇

1 概述

MybatisPlus是一款Mybatisi增强工具,用于简化开发,提高效率。它在MyBatis的基础上只做增强不做改

变,为简化开发、提高效率而生。

官网:[MyBatis-Plus (baomidou.com)](https://baomidou.com/)

2 快速入门

2.0 环境准备

2.0.1 准备数据

CREATE TABLE `user`
(
    `id`        BIGINT(20)  NOT NULL AUTO_INCREMENT COMMENT 'id',
    `user_name` VARCHAR(20) NOT NULL COMMENT '用户名',
    `password`  VARCHAR(20) NOT NULL COMMENT '密码',
    `name`      VARCHAR(30)  DEFAULT NULL COMMENT '姓名',
    `age`       INT(11)      DEFAULT NULL COMMENT '年龄',
    `address`   VARCHAR(100) DEFAULT NULL COMMENT '地址',
    PRIMARY KEY (`id`)
) ENGINE = InnoDB
  AUTO_INCREMENT = 5
  DEFAULT CHARSET = utf8mb4;

INSERT INTO `user` (id, user_name, password, name, age, address)
VALUES (1, 'ruiwen', '123', '锐雯', 12, '山东'),
       (2, 'gailun', '1332', '盖伦', 13, '平顶山'),
       (3, 'timu', '123', '提姆', 22, '蘑菇石'),
       (4, 'daji', '1222', '妲己', 221, '狐山')

2.0.2 创建SpringBoot工程

添加依赖
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>com.example</groupId>
    <artifactId>mybatisplus-study</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>mybatisplus-study</name>
    <description>Demo project for Spring Boot</description>

    <properties>
        <java.version>1.8</java.version>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
        <spring-boot.version>2.3.7.RELEASE</spring-boot.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
            <exclusions>
                <exclusion>
                    <groupId>org.junit.vintage</groupId>
                    <artifactId>junit-vintage-engine</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
    </dependencies>

    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-dependencies</artifactId>
                <version>${spring-boot.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>

    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.8.1</version>
                <configuration>
                    <source>1.8</source>
                    <target>1.8</target>
                    <encoding>UTF-8</encoding>
                </configuration>
            </plugin>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <version>2.3.7.RELEASE</version>
                <configuration>
                    <mainClass>com.example.mybatisplusstudy.MybatisplusStudyApplication</mainClass>
                </configuration>
                <executions>
                    <execution>
                        <id>repackage</id>
                        <goals>
                            <goal>repackage</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>

</project>

创建启动类
package com.example.mybatisplusstudy;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class MybatisplusStudyApplication {

    public static void main(String[] args) {
        SpringApplication.run(MybatisplusStudyApplication.class, args);
    }

}

2.0.3 准备实例类

package com.example.mybatisplusstudy.entity;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.NoArgsConstructor;
import lombok.experimental.Accessors;

@Data
@Accessors(chain = true)
@EqualsAndHashCode
@NoArgsConstructor
@AllArgsConstructor
public class User {
    private Long id;
    private String userName;
    private String password;
    private String name;
    private Integer age;
    private String address;
}

2.1 使用MybatisPlus

2.1.1 添加依赖

<dependency>
    <groupId>com.baomidou</groupId>
    <artifactId>mybatis-plus-boot-starter</artifactId>
    <version>3.4.2</version>
</dependency>

<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
</dependency>

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>

2.1.2 配置数据库信息

spring:
  datasource:
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://192.168.31.29/mybatisplus_study?characterEncoding=utf-8&serverTimezone=Asia/Shanghai
    username: root
    password: root

2.1.3 创建Mapper接口

创建Mapper接口集成BaseMapper接口:
package com.example.mapper;

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.example.mybatisplusstudy.entity.User;

public interface UserMapper extends BaseMapper<User> {
}
BaseMapper接口中已经提供了很多常用的方法。所以我们只需要从容器中获取Mapper就可以进行操作了,不需要自己去编写SQL语句。

2.1.4 配置Mapper扫描

@SpringBootApplication
@MapperScan("com.example.mybatisplusstudy.mapper")
public class MybatisplusStudyApplication {

    public static void main(String[] args) {
        SpringApplication.run(MybatisplusStudyApplication.class, args);
    }

}

2.1.5 获取Mapper进行测试

package com.example.mybatisplusstudy;

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.example.mybatisplusstudy.mapper.UserMapper;
import com.example.mybatisplusstudy.entity.User;
import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;

import javax.annotation.Resource;

@SpringBootTest
class MybatisplusStudyApplicationTests {

    @Resource
    private UserMapper userMapper;

    @Test
    public void test1() {
        userMapper.selectList(null).forEach(System.out::println);
    }

}

3 常用设置

3.1 设置表映射规则

默认情况下MP操作的表名就是实体类的类名,但是如果表名和类名不一致就需要我们自己设置映射规则。

3.1.1单独设置

可以在实体类的类名上加上`@TableName`注解进行标识。

例如:

如果表名是`t_user`,而实体类名是User则可以使用以下写法。
@TableName("t_user")
public class User {
    private Long id;
    private String userName;
    private String password;
    private String name;
    private Integer age;
    private String address;
}

3.1.2 全局设置表名前缀

​ 一般一个项目表名的前缀都是统一风格的,这个时候如果一个个设置就太麻烦了。我们可以通过配置来设置全局的表名前缀。

例如:

​ 如果一个项目中所有的表名相比于类名都是多了个前缀:t_。这可以使用如下方式配置:

mybatis-plus:
  global-config:
    db-config:
      # 表名前缀
      table-prefix: t_

3.2 设置主键生成策略

3.2.1 单独设置

​ 默认情况下使用MP插入数据时,如果在我们没有设置主键生成策略的情况下默认的策酪是基于雪花算法的自增
id。

​ 如果我们需要使用别的策路可以在定义实体类时,在代表主键的字段上加上@Tab1eId注解,使用其type属性
指定主键生成策略。

例如:

​ 我们要设置主键自动增长则可以设置如下

@Data
@Accessors(chain = true)
@EqualsAndHashCode
@NoArgsConstructor
@AllArgsConstructor
public class User {
    @TableId(type = IdType.AUTO)
    private Long id;
	// ...
}

全部主键第路定义在了枚举类IdType中,IdType有如下的取值

  • AUTO
    数据库ID自增,依赖于数据库。该类型请确保数据库设置了ID自增否则无效。

  • NONE
    未设置主键类型。若在代码中没有手动设置主键,则会根据主键的全局策略自动生成(默认的主键全局策路是
    基于雪花算法的自增ID)

  • INPUT
    需要手动设置主键,若不设置。插入操作生成SQL语句时,主键这一列的值会是null。

  • ASSIGN_ID
    当没有手动设置主键,即实体类中的主键属性为空时,才会自动填充,使用雪花算法

  • ASSIGN_UUID
    当实体类的主键属性为空时,才会自动填充,使用UUID

3.2.2 全局配置

mybatis-plus:
  global-config:
    db-config:
      # id生成策略,auto为数据库自增
      id-type: auto

3.3设置字段映射关系

​ 默认情况下MP会根据实体类的属性名去映射表的列名。

​ 如果数据库的列表和实体类的属性名不一致了我们可以使用@Tab1eFie1d注解的value属性去设置映射关系。

例如:

​ 如果表中一个列名叫address而实体类中的属性名为addressStr则可以使用如下方式进行配置。

@TableField("address")
private String addressStr;

3.4 设置字段和列名的驼峰映射

​ 默认情况下MP会开启字段名列名的驼峰映射,即从经典数据库列名A_COLUMN(下划线命名)到经典Java属性名aColumn(驼峰命名)的类似映射。

​ 如果需要关闭我们可以使用如下配置进行关闭。

mybatis-plus:
  configuration:
    # 是否开启白动驼峰命名规则(came case)映射,即从经典数据库列名A_COLUMN(下划龙命名)到经典Java属性名aCo1umn(驼峰命名)的类似映射
    map-underscore-to-camel-case: false

3.5 日志

​ 如果需要打印MP操作对应的SQL语句等,可以配置日志输出。

​ 配置方式如下:

mybatis-plus:
  configuration:
    # 日志
    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl

4 基本使用

4.1 插入数据

​ 我们可以使用insert方法来实现数据的插入。

@Test
public void testInsert() {
    User user = new User();
    user.setUserName("wangyf");
    user.setPassword("666");
    int insert = userMapper.insert(user);
    System.out.println(insert);
}

4.2 删除数据

​ 我们可以使用deleteXXX方法来实现数据的删除。

@Test
public void testDeleteBatchIds() {
    System.out.println(userMapper.deleteBatchIds(Arrays.asList(5, 6, 7)));
}

@Test
public void testDeleteById() {
    System.out.println(userMapper.deleteById(8));
}

@Test
public void testDeleteByMap() {
    HashMap<String, Object> map = new HashMap<>();
    map.put("user_name", "wangyf");
    map.put("password", "666");
    System.out.println(userMapper.deleteByMap(map));
}

4.3 更新操作

​ 我们可以使用updateXXX方法来实现数据的更新。

@Test
public void testUpdate() {
    System.out.println(userMapper.updateById(new User().setId(11L).setName("王一飞")));
}

5 条件构造器Warpper

5.1 概述

​ 我们在实际操作数据库的时候会涉及到很多的条件。所以MybatisPlus为我们提供了一个功能强大的条件构造器Wrapper,使用它可以让我们非常方便的构造条件。

​ 其继承体系如下:

image-20220409105451785

​ 在其子类AbstractWrapper中提供了很多用于构造Where条件的方法。

AbstractWrapper的子类QueryWrapper则额外提供了用于针对Select语法的select方法。可以用来设置查询哪些列。

Abstractwrapper的子类UpdateWrapper则额外提供了用于针对SET语法的set方法。可以用来设置对哪些列进行更新。

​ 完整的AbstractWrapper方法可以参照:条件构造器 | MyBatis-Plus (baomidou.com)

​ 介绍是用来干什么的。它的实现类有哪些。QueryWrapper、UpdateWrapper、【LambdaQueryWrapper】

5.2 常用AbstractTrapper方法

eq:equals,等于
gt:greater than,大于>
ge:greater than or equals,大于等于≥
lt:less than,小于<
le:less than or equals,小于等于≤
between:相当于SQL中的BETWEEN
Iike:模糊匹配。Iike("name","黄"),相当于SQL的name like'%黄%'
likeRight:模糊匹配右半边。likeRight("name","黄"),相当于SQL的name like黄%
likeLeft:模糊匹配左半边。likeLeft("name","黄"),相当于SQL的name like'%黄'
notLike:notLike("name","黄"),相当于SQL的name not like'%黄%'
isNull
isNotNull
and:SQL连接符AND
or:SQL连接符OR
in:in("age",{1,2,3})相当于age in(1,2,3)
groupBy:groupBy("id","name")相当于group by id,name
orderByAsc:orderByAsc("id","name")相当于order by id ASC,name ASC
orderByDesc orderByDesc ("id","name")order by id DESC,name DESC

实例一

SQL语句如下:

SELECT id,
       user_name,
       password,
       name,
       age,
       address
FROM user
WHERE age > 18
  AND address = '狐山'

如果使用Wrapper写法如下:

@Test
public void testWrapper() {
    QueryWrapper wrapper = new QueryWrapper<>();
    wrapper.gt("`age`", 18);
    wrapper.eq("`address`", "狐山");
    List<User> users = userMapper.selectList(wrapper);
    System.out.println(users);
}

实例二

SELECT id,
       user_name,
       password,
       name,
       age,
       address
FROM user
WHERE id IN (1, 2, 3)
  AND age BETWEEN 12 AND 29
  AND address LIKE '%山%'

如果使用Wrapper写法如下:

@Test
public void testWrapper2() {
    QueryWrapper<User> wrapper = new QueryWrapper<>();
    wrapper.in("id", 1, 2, 3);
    wrapper.between("age", 12, 29);
    wrapper.like("address", "山");
    List<User> users = userMapper.selectList(wrapper);
    System.out.println(users);
}

实例三

select id, user_name, password, name, age, address
from t_user
where id in (1, 2, 3)
  and age > 10
order by age desc 

如果使用Wrapper写法如下:

@Test
public void testWrapper3() {
    QueryWrapper<User> wrapper = new QueryWrapper<>();
    wrapper.in("id", 1, 2, 3);
    wrapper.gt("age", 10);
    wrapper.orderByDesc("age");
    List<User> users = userMapper.selectList(wrapper);
    System.out.println(users);
}

5.3 常用QueryWrapper方法

​ QueryWrapperf的select可以设皆要查询的列。

实例一

select(String ...sqlSelect)方法的测试为要查询的列名

SQL语句如下:

SELECT id,
       user_name
FROM t_user;

如果使用Wrapper写法如下:

@Test
public void testSelect1() {
    QueryWrapper<User> wrapper = new QueryWrapper<>();
    wrapper.select("id", "user_name");
    List<User> users = userMapper.selectList(wrapper);
    System.out.println(users);
}

实例二

select(Class<T> entityClass, Predicate<TableFieldInfo> predicate)

​ 方法的第一个参数为实体类的字节码对象,第二个参数为Predicate类型,可以使用lambda的写法,过滤要查询的
字段(主键除外)。

SQL语句如下:

SELECT id,
       user_name
FROM t_user;

如果使用Wrapper写法如下:

@Test
public void testSelect2() {
    QueryWrapper<User> wrapper = new QueryWrapper<>();
    wrapper.select(User.class,
            tableFieldInfo -> "id".equals(tableFieldInfo.getColumn()) || "user_name".equals(tableFieldInfo.getColumn()));
    List<User> users = userMapper.selectList(wrapper);
    System.out.println(users);
}

实例三

select(Predicate<TableFieldInfo> predicate)

​ 方法第一个参数为Predicate类型,可以使用lambda的写法,过滤要查询的字段(主键除外)。

​ SQL语句如下:

SELECT id,
       user_name,
       PASSWORD,
       NAME,
       age
FROM t_user

就是不想查询address这列,其他列都查询了

如果使用Wrapper写法如下:

@Test
public void testSelect3() {
    QueryWrapper<User> wrapper = new QueryWrapper<>(new User());
    wrapper.select(tableFieldInfo -> !"address".equals(tableFieldInfo.getColumn()));
    List<User> users = userMapper.selectList(wrapper);
    System.out.println(users);
}

注意只有内部有 entity 才能使用该方法

5.4 常用UpdateWrapper方法

​ 我们前面在使用update方法时需要创建一个实体类对象传入,用来指定要更新的列及对应的值。但是如果需
要更新的列比较少时,创建这么一个对象显的有点麻烦和复杂。

​ 我们可以使用UpdateWrapper的set方法来设置要更新的列及其值。同时这种方式也可以使用Wrapper去指
定更复杂的更新条件。

示例

​ SQL语句如下:

UPDATE
    t_user
SET age = 99
where id > 1

我们想把id大于1的用户的年龄修改为99,则可以使用如下写法:

@Test
public void testUpdate1() {
    UpdateWrapper<User> updateWrapper = new UpdateWrapper<>();
    updateWrapper.set("age", 99);
    updateWrapper.gt("id", 1);
    userMapper.update(null, updateWrapper);
    
    userMapper.selectList(
            new LambdaQueryWrapper<User>()
                    .select(User::getId, User::getAge)
                    .gt(User::getId, 1)
    ).forEach(System.out::println);
}

5.5 Lambda条件构造器

​ 我们前面在使用条件构造器时列名都是用字符中的形式去指定。这种方式无法在编译期确定列名的合法性。

​ 所以MP提供了一个Lambda条件构造器可以让我们直接以实体类的方法引用的形式来指定列名。这样就可以弥
补上述缺陷。

示例

要执行的查询对应的SQL如下

SELECT id,
       user_name,
       PASSWORD,
       NAME,
       age,
       address
FROM t_user
WHERE age > 18
  AND address = '孤山'

如果使用之前的条件构造器写法如下

System.out.println(userMapper.selectList(
        new QueryWrapper<User>()
                .gt("age", 18)
                .eq("address", "狐山")
));

改成LambdaQueryWrapper之后:

System.out.println(userMapper.selectList(
        new LambdaQueryWrapper<User>()
                .gt(User::getAge, 18)
                .eq(User::getAddressStr, "狐山")
));

6 自定义SQL

​ 虽然MP为我们提供了很多常用的方法,并且也提供了条件构造器。但是如果点的遇到了复杂的SQL时,我们还
是需要自己去定义方法,自己去写对应的SQL,这样SQL也更有利于后期维护。

​ 因为MP是对mybatis做了增强,所以还是支特之前Mybatis的方式去自定义方法。

​ 同时也支持在使用Mybatis的自定义方法时使用MP的条件构造器帮助我们进行条件构造。

​ 接下去我们分别来讲讲。

6.0准备工作

6.0.1 准备数据

CREATE TABLE orders
(
    `id`          bigint(20) NOT NULL AUTO_INCREMENT,
    `price`       int(11)         DEFAULT NULL COMMENT '价格',
    `remark`      varchar(100)    DEFAULT NULL COMMENT '备注',
    `user_id`     int(11)         DEFAULT NULL COMMENT '用户id',
    `update_time` timestamp  NULL DEFAULT NULL COMMENT '更新时间',
    `create_time` timestamp  NULL DEFAULT NULL COMMENT '创建时间',
    `version`     int(11)         DEFAULT '1' COMMENT '版本',
    `del_f1ag`    int(1)          DEFAULT ' 0 ' COMMENT ' 逻辑则除标识,0-未删除,1-已删除',
    `create_by`   varchar(100)    DEFAULT NULL COMMENT ' 创建人 ',
    `update_by`   varchar(100)    DEFAULT NULL COMMENT '更新人',
    PRIMARY KEY (`id`)
) ENGINE = InnoDB
  AUTO_INCREMENT = 6
  DEFAULT CHARSET = utf8;
  
INSERT INTO `orders`
(id, price, remark, user_id, update_time, create_time, version, del_f1ag, create_by, update_by)
VALUES (1, 2000, '无', 2, '2021-08-24 21:02:43', '2021-08-24 21:02:46', 1, 0, NULL, NULL),
       (2, 3000, '无', 3, '2021-08-24 21:03:32', '2021-08-24 21:03:35', 1, 0, NULL, NULL),
       (3, 4000, '无', 2, '2021-08-24 21:03:39', '2021-08-24 21:02:41', 1, 0, NULL, NULL);

6.0.2 创建实体类

package com.example.mybatisplusstudy.entity;

import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors;

import java.io.Serializable;
import java.util.Date;

/**
 * @TableName orders
 */
@TableName(value = "orders")
@Data
@Accessors(chain = true)
@EqualsAndHashCode
public class Orders implements Serializable {
    /**
     *
     */
    @TableId(type = IdType.AUTO)
    private Long id;

    /**
     * 价格
     */
    private Integer price;

    /**
     * 备注
     */
    private String remark;

    /**
     * 用户id
     */
    private Integer userId;

    /**
     * 更新时间
     */
    private Date updateTime;

    /**
     * 创建时间
     */
    private Date createTime;

    /**
     * 版本
     */
    private Integer version;

    /**
     * 逻辑则除标识,0-未删除,1-已删除
     */
    private Integer delF1ag;

    /**
     * 创建人
     */
    private String createBy;

    /**
     * 更新人
     */
    private String updateBy;

    @TableField(exist = false)
    private static final long serialVersionUID = 1L;
}

6.1 Mybatis方式

6.1.1 定义方法

在UserMapper中创建一个方法

package com.example.mybatisplusstudy.mapper;

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.example.mybatisplusstudy.entity.User;

public interface UserMapper extends BaseMapper<User> {
    User findMyUser(Long id);
}

6.1.2 创建xml

在resource下创建mapper包,并且新建UserMapper.xml文件

另外在配置文件中,也可以指定以下xml的文件路径

mybatis-plus:
  mapper-locations: classpath*:/mapper/**/*.xml

6.1.3 在xml映射文件中编写sql

创建对应的标签,编写对应的sql语句。

<?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.example.mybatisplusstudy.mapper.UserMapper">

    <select id="findMyUser" resultType="com.example.mybatisplusstudy.entity.User">
        select * from t_user where id = #{id}
    </select>
</mapper>

6.2 MybatisPlus方式结合条件构造器

​ 我们在使用上述方式自定义方法时。如果也希望我们的自定义方法能像MP自带方法一样使用条件构造器来进行
条件构造的话只需要使用如下方式即可。

①方法定义中添加Warpper类型的参数

添加Varpper类型的参数,并且要注意给其指定参数名。

public interface UserMapper extends BaseMapper<User> {
    User findMyUserByWrapper(@Param(Constants.WRAPPER) Wrapper<User> wrapper);
}

②在SQL语句中获取Warpper拼接的SQL片段进行拼接。

<select id="findMyUserByWrapper" resultType="com.example.mybatisplusstudy.entity.User">
    select * from ${ew.CustomSqlSegment}
</select>

7 分页查询

7.1 基本分页查询

① 配置分页查询拦截器

@Configuration
public class PageConfig {

    /**
     * 3.4.0之前的版本
     */
//    @Bean
//    public PaginationInterceptor paginationInnerInterceptor() {
//        return new PaginationInterceptor();
//    }
    /**
     * 3.4.0之后的版本
     * @return
     */
    @Bean
    public MybatisPlusInterceptor mybatisPlusInterceptor() {
        MybatisPlusInterceptor mybatisPlusInterceptor = new MybatisPlusInterceptor();
        mybatisPlusInterceptor.addInnerInterceptor(new PaginationInnerInterceptor());
        return mybatisPlusInterceptor;
    }
}

② 进行分页查询

@Test
public void testPage() {
    IPage<User> page = new Page<>(1, 2);
    IPage<User> page1 = userMapper.selectPage(page, null);
    System.out.println(page.getTotal());
    System.out.println(page1.getRecords());
}

7.2 多表分页查询

​ 如果需要在多表查询时进行分页查询的话,就可以在mapper接口中自定义方法,然后让方法接收Page对象。

示例

  • 需求:

​ 我们需求去查询Orderss表,并且要求查询的时候除了要获取到Orders表中的字段,还要获取到每个订单的下单
用户的用户名。

  • 准备工作

    • SQL准备

      select tu.user_name, o.*
      from t_user tu,
           orders o
      where tu.id = o.user_id
      
    • 实体类修改

      增加一个userName属性

      @TableName(value = "orders")
      @Data
      @Accessors(chain = true)
      @EqualsAndHashCode
      public class Orders implements Serializable {
      
      	// ...
          @TableField(exist = false)
          private String userName;
      
      }
      
    • 实现

      ① 定义接口

      方法第一个参数定义成Page类型

      IPage<Orders> findAllOrders(Page<Orders> page);
      

      sql语句中并不需要什么特殊处理

      ② 使用

      @Test
      public void testPage2() {
          Page<Orders> ordersPage1 = new Page<>(1, 2);
          Page<Orders> ordersPage2 = new Page<>(2, 2);
          IPage<Orders> orders1Page = ordersMapper.findAllOrders(ordersPage1);
          IPage<Orders> orders2Page = ordersMapper.findAllOrders(ordersPage2);
      
          System.out.println(orders1Page.getTotal());
          System.out.println(orders1Page.getCurrent());
          System.out.println(orders1Page.getRecords());
      
          System.out.println(orders2Page.getCurrent());
          System.out.println(orders2Page.getRecords());
      }
      

8 Service层接口

​ MP也为我们提供了Service层的实现。我们只需要编写一个接口,继承IService,并创一个接口实现类继承
ServiceImpl,即可使用。

​ 相比于Mapper接口,Service层主要是支持了更多批量操作的方法。

8.1 基本使用

接口

public interface UserService extends IService<User> {

}

实现类

@Service
public class UserServiceImpl extends ServiceImpl<UserMapper, User>
        implements UserService {

}

使用

@Test
public void testService() {
    System.out.println(userService.list());
    System.out.println(userService.page(new Page<>(1, 2)).getRecords());
    System.out.println(userService.count());
}

2

评论区