MyBatisPlus的使用

MyBatisPlus 的使用

pom 依赖

<?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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <!--由SpringBoot进行版本管理-->
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.6.7</version>
    </parent>

    <groupId>com.guigu</groupId>
    <artifactId>mybatis</artifactId>
    <version>1.0</version>

    <!--自定义内容, 辅助版本管理-->
    <properties>
        <maven.compiler.source>8</maven.compiler.source>
        <maven.compiler.target>8</maven.compiler.target>
        <mybatis-plus-boot-starter.version>3.4.1</mybatis-plus-boot-starter.version>
        <swagger-spring-boot-starter.version>1.9.0.RELEASE</swagger-spring-boot-starter.version>
    </properties>

    <dependencies>
        <!--spring套件-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <exclusions>
                <exclusion>
                    <groupId>org.junit.vintage</groupId>
                    <artifactId>junit-vintage-engine</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-devtools</artifactId>
        </dependency>


        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
        </dependency>

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

        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-boot-starter</artifactId>
            <version>${mybatis-plus-boot-starter.version}</version>
        </dependency>

        <!-- Spring Boot 集成 swagger -->
        <dependency>
            <groupId>com.spring4all</groupId>
            <artifactId>swagger-spring-boot-starter</artifactId>
            <version>${swagger-spring-boot-starter.version}</version>
        </dependency>
    </dependencies>

</project>

配置文件

spring:
  datasource:
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://localhost:3306/mybatis?serverTimezone=GMT%2B8
    username: root
    password: root

# 用于打印 Mybatis 中的日志信息
mybatis-plus:
  configuration:
    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl

CURD 操作

插入操作(涉及主键策略)

手动指定策略:INPUT、NONE

手动指定主键id,如果没有指定则插入失败

INPUT 策略

自动增长策略:AUTO

需要数据库设置了主键自增,否则等同于 INPUT 策略

UUID策略(MyBatisPlus默认):ASSIGN_ID、ASSIGN_UUID

数据库不需要设置主键自增,采用雪花算法分配一个全局唯一的值

  • ASSIGN_ID:支持主键为数值或字符串类型
  • ASSIGN_UUID:主键必须为字符串类型
image-20230322171858227

image-20230322172113623

Redis 生成策略

查询操作

其他常用功能

自动填充

自动填充记录的创建时间和更新时间

  1. 实体类中的属性配置

    自动填充属性的配置
  2. 创建一个处理器,分别绑定插入操作和更新操作,执行相应的方法

    import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler;
    import org.apache.ibatis.reflection.MetaObject;
    import org.springframework.stereotype.Component;
    
    import java.util.Date;
    
    @Component
    public class MPMetaObjectHandler implements MetaObjectHandler {
        /**
         * 使用 Mybatis Plus 进行添加时会执行该方法
         *
         * @param metaObject
         */
        @Override
        public void insertFill(MetaObject metaObject) {
            this.setFieldValByName("createTime", new Date(), metaObject);
            this.setFieldValByName("updateTime", new Date(), metaObject);
        }
    
        /**
         * 使用 Mybatis Plus 进行更新时会执行该方法
         *
         * @param metaObject
         */
        @Override
        public void updateFill(MetaObject metaObject) {
            this.setFieldValByName("updateTime", new Date(), metaObject);
        }
    }
  3. 测试:插入时不需要关心 createTime 和 updateTime 属性的设置

    自动填充不仅仅局限于 createTime 和 updateTime 的设置,通过 setFieldValByName 可以设置任意出现的属性值,例如为乐观锁设置初始值

    image-20230322175737871

乐观锁

  1. 在实体类中进行相应修改

    image-20230322180803058
  2. Spring 中注入乐观锁插件对象

    @Configuration
    public class MybatisPlusConfig {
        /**
         * Mybatis Plus 乐观锁插件配置
         *
         * @return
         */
        @Bean
        public OptimisticLockerInnerInterceptor optimisticLockerInnerInterceptor() {
            return new OptimisticLockerInnerInterceptor();
        }
    }
  3. 使用自动填充插件为版本号设置初始值

    image-20230322181534378 image-20230322181555814
  4. 测试

    乐观锁需要先查询后修改

分页插件(实现分页查询)

  1. 在Spring中注入分页查询插件

    @Configuration
    public class MybatisPlusConfig {
        /**
         * Mybatis Plus 乐观锁插件配置
         *
         * @return
         */
        @Bean
        public OptimisticLockerInnerInterceptor optimisticLockerInnerInterceptor() {
            return new OptimisticLockerInnerInterceptor();
        }
    
        /**
         * 分页查询插件, 这里不能使用新版本的, 否则分页插件不生效, 可能是兼容性问题
         *
         * @return
         */
        @Bean
        public PaginationInterceptor paginationInterceptor() {
            return new PaginationInterceptor();
        }
    }
  2. 分页查询测试

        @Test
        public void pageQueryTest() {
            //SELECT uid AS uIndex,username,password,age,gender AS sex,email,is_delete
            // FROM user
            // WHERE is_delete=0
            // LIMIT ?,?
            Page<User> page = new Page<>(2, 3);
            userMapper.selectPage(page, null);
    
            //获取page对象中的封装的所有数据
            List<User> users = page.getRecords();
            for (User user : users) {
                System.out.println(user);
            }
    
            System.out.println("page.getTotal() = " + page.getTotal());
        }

    分页查询测试

逻辑删除

配置逻辑删除后,通过 MyBatis Plus 调用删除代码时,不会在数据库中实际删除该数据,而是

  1. 实体类修改

  2. 测试效果

    逻辑删除测试效果

性能分析


   转载规则


《MyBatisPlus的使用》 熊水斌 采用 知识共享署名 4.0 国际许可协议 进行许可。
 上一篇
Junit单元测试 Junit单元测试
注解 断言 作用 @BeforeAll 在所有测试方法运行之前,只执行一次 @BeforeEach 在每个测试方法运行之前,都执行一次
2023-03-22
下一篇 
SpringBoot SpringBoot
SpringBoot自动配置 全部加载 127 自动配置类(预先写死) 按照条件装配规则,按需注入 @ConditionalOnClass 注解 保证了在类路径下发现某个类,才会注入Bean对象。而这个“某个类”,需要导入一些特定的包
2023-03-22
  目录