MyBatis-Plus的主键生成、自动填充、乐观锁、分页查询、逻辑删除

简介

官网:http://mp.baomidou.com/

指南:http://mp.baomidou.com/guide/

MyBatis-Plus(简称 MP)是一个 MyBatis 的增强工具,在 MyBatis 的基础上只做增强不做改变,为简化开发、提高效率而生。

入门

一、 创建数据库

DROP TABLE IF EXISTS USER;

CREATE TABLE USER(
id BIGINT(20) NOT NULL COMMENT '主键ID',
NAME VARCHAR(30) NULL DEFAULT NULL COMMENT '姓名',
age INT(11) NULL DEFAULT NULL COMMENT '年龄',
email VARCHAR(50) NULL DEFAULT NULL COMMENT '邮箱',
PRIMARY KEY (id)
)ENGINE=INNODB DEFAULT CHARSET=utf8 COMMENT='mp测试用户';

DELETE FROM USER;

INSERT INTO USER (id, NAME, age, email) VALUES
(1, 'Jone', 18, 'test1@baomidou.com'),
(2, 'Jack', 20, 'test2@baomidou.com'),
(3, 'Tom', 28, 'test3@baomidou.com'),
(4, 'Sandy', 21, 'test4@baomidou.com'),
(5, 'Billie', 24, 'test5@baomidou.com');

二、 创建工程

  1. 使用idea创建springboot工程
  2. 在pom.xml文件中将springboot版本改为2.2.1
  3. 引入相关依赖(在idea安装lombok插件)
<dependencies>
        <!--springboot-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter</artifactId>
        </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>

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

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

        <!--lombok用来简化实体类-->
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
        </dependency>
    </dependencies>
  1. 配置MySQL数据库的相关配置和开启MyBatis-Plus日志
spring:
  datasource:
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://localhost:3306/mybatis_plus?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=GMT%2B8
    username: root
    password: root
# mybatis-plus日志
mybatis-plus:
  configuration:
    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl

注意:
MySQL5.7 之后的版本建议使用的驱动为com.mysql.cj.jdbc.Driver,之前的com.mysql.jdbc.Driver被弃用并且需要在url中设置时区。

  1. 编写代码
    (1) 创建实体类
package com.jananwang36.mpdemo.entity;

import lombok.Data;

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

(2) 创建mapper接口

package com.jananwang36.mpdemo.mapper;

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.jananwang36.mpdemo.entity.User;

@Repository
public interface UserMapper extends BaseMapper<User> {
}

(3) 创建MybatisPlusConfig配置类 加扫描包注解

package com.jananwang36.mpdemo.config;

import org.mybatis.spring.annotation.MapperScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.transaction.annotation.EnableTransactionManagement;

@EnableTransactionManagement
@MapperScan("com.jananwang36.mpdemo.mapper")
@Configuration
public class MybatisPlusConfig {
}

(4) 测试

package com.jananwang36.mpdemo;

import com.jananwang36.mpdemo.entity.User;
import com.jananwang36.mpdemo.mapper.UserMapper;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;

import java.util.List;

@SpringBootTest
class MpdemoApplicationTests {

    @Autowired
    private UserMapper userMapper;

    // 查询User表中的数据
    @Test
    void selectList() {
        List<User> users = userMapper.selectList(null);
        System.out.println("users = " + users);
    }

}

运行测试方法后控制台输出结果:

SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@36ddaebf] was not registered for synchronization because synchronization is not active
JDBC Connection [HikariProxyConnection@635739314 wrapping com.mysql.cj.jdbc.ConnectionImpl@7f7af971] will not be managed by Spring
==>  Preparing: SELECT id,name,age,email FROM user 
==> Parameters: 
<==    Columns: id, name, age, email
<==        Row: 1, Jone, 18, test1@baomidou.com
<==        Row: 2, Jack, 20, test2@baomidou.com
<==        Row: 3, Tom, 28, test3@baomidou.com
<==        Row: 4, Sandy, 21, test4@baomidou.com
<==        Row: 5, Billie, 24, test5@baomidou.com
<==      Total: 5
Closing non transactional SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@36ddaebf]
users = [User(id=1, name=Jone, age=18, email=test1@baomidou.com), User(id=2, name=Jack, age=20, email=test2@baomidou.com), User(id=3, name=Tom, age=28, email=test3@baomidou.com), User(id=4, name=Sandy, age=21, email=test4@baomidou.com), User(id=5, name=Billie, age=24, email=test5@baomidou.com)]

主键生成策略

在不做任何配置时 MyBatis-Plus默认的主键生成策略根据主键类型来设置
ID_WORKER:主键ID类型为数字类型时 主键默认生成一个19位的数字(雪花算法)
ID_WORKER_STR:主键ID类型为字符类型时 主键默认生成一个19位的数字(雪花算法)
1.更改默认生成策略可以在主键上加@TableId注解

@Data
public class User {

//    @TableId(type = IdType.ID_WORKER) // 雪花算法(数字)
//    @TableId(type = IdType.ID_WORKER_STR) // 雪花算法(字符)
//    @TableId(type = IdType.AUTO) // 自动增长
//    @TableId(type = IdType.NONE) // 未设置主键类型
//    @TableId(type = IdType.INPUT) // 自己输入
//    @TableId(type = IdType.UUID) // UUID
    private Long id;
    
    private String name;
    private Integer age;
    private String email;
}
  1. 在application.yml主配置文件中配置全局
mybatis-plus:
  global-config:
    db-config:
      id-type: id_worker
#      id-type: auto
#      id-type: none
#      id-type: id_worker_str
#      id-type: uuid
#      id-type: input

自动填充

1.在表中添加两个字段

ALTER TABLE `user`
ADD COLUMN create_time datetime COMMENT '创建时间',
Add COLUMN update_time DATETIME COMMENT '更新时间';

2.在实体类中添加属性和自动填充的注解

    @TableField(fill = FieldFill.INSERT)
    private Date createTime;
    
    @TableField(fill = FieldFill.INSERT_UPDATE)
    private Date updateTime;

3.创建类

package com.jananwang36.mpdemo.handler;

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 MyMetaObjectHandler implements MetaObjectHandler {

    // 使用MyBatis-Plus实现添加操作,这个方法会执行
    @Override
    public void insertFill(MetaObject metaObject) {
        this.setFieldValByName("createTime", new Date(), metaObject);
        this.setFieldValByName("updateTime", new Date(), metaObject);
    }
    
    // 使用MyBatis-Plus实现修改操作,这个方法会执行
    @Override
    public void updateFill(MetaObject metaObject) {
        this.setFieldValByName("updateTime", new Date(), metaObject);
    }
}

乐观锁

  1. 在数据库中添加version字段
ALTER TABLE `user` ADD COLUMN `version` INT;

2.(1) 在实体类中添加版本号属性和注解

    @TableField(fill = FieldFill.INSERT)//在添加数据时给version一个默认值1
    @Version
    private Integer version;//版本号

(2)在MyMetaObjectHandler处理器的insertFill方法中使version在实现添加操作时给version一个默认值

    this.setFieldValByName("version", 1, metaObject);
  1. 在配置类MybatisPlusConfig中注册Bean
	 /**
     * 乐观锁插件
     */
    @Bean
    public OptimisticLockerInterceptor optimisticLockerInterceptor() {
        return new OptimisticLockerInterceptor();
    }

4.测试

	/**
     * 测试 乐观锁插件
     */
    @Test
    public void testOptimisticLocker() {

        //查询
        User user = userMapper.selectById(此处填要查询的id);
        //修改数据
        user.setName("此处填要修改的名字");
        user.setEmail("此处填要修改的email");
        //执行更新
        userMapper.updateById(user);
    }

执行后 查看version版本号在之前的基础上+1

分页查询

1.在配置类配置分页插件

	/**
     * 分页插件
     */
    @Bean
    public PaginationInterceptor paginationInterceptor() {
        return new PaginationInterceptor();
    }

2.编写测试分页代码

/**
     * 测试分页
     */
    @Test
    public void testSelectPage() {

        // Page对象参数:current当前页,size每页显示记录数
        Page<User> page = new Page<>(1,5);
        userMapper.selectPage(page, null);

        // page对象封装了所有分页数据
        System.out.println("当前页数据:");
        page.getRecords().forEach(System.out::println);
        System.out.println("当前页:" + page.getCurrent());
        System.out.println("总页数:" + page.getPages());
        System.out.println("每页显示记录数:" + page.getSize());
        System.out.println("总记录数:" + page.getTotal());
        System.out.println("是否有下一页:" + page.hasNext());
        System.out.println("是否有上一页:" + page.hasPrevious());
    }

逻辑删除

逻辑删除(假删除):将对应数据中代表是否被删除字段状态修改为“被删除状态”,之后在数据库中仍旧能看到此条数据记录
MyBatis-Plus官网 逻辑删除.
1.在数据库中添加deleted字段

ALTER TABLE `user` ADD COLUMN `deleted` BOOLEAN;

2.(1)在实体类添加deleted 属性并加上注解

@TableLogic
@TableField(fill = FieldFill.INSERT)
private Integer deleted;

(2)在MyMetaObjectHandler处理器的insertFill方法中使deleted在实现添加操作时给deleted一个默认值

        this.setFieldValByName("deleted", 0, metaObject);

3.在yml中配置逻辑删除

mybatis-plus:
  global-config:
    db-config:
      logic-delete-value: 1 # 逻辑已删除值(默认为 1)
      logic-not-delete-value: 0 # 逻辑未删除值(默认为 0)
  1. 在配置类MybatisPlusConfig中注册Bean
	@Bean
    public ISqlInjector sqlInjector() {
        return new LogicSqlInjector();
    }

5.测试逻辑删除

	/**
     * 测试 逻辑删除
     */
    @Test
    public void testLogicDelete() {

        int result = userMapper.deleteById(此处填要删除的id);
        System.out.println(result);
    }
}

执行方法后 数据库中deleted由0变为1表示逻辑删除成功
MyBatis-Plus中封装的selectList方法会加上条件deleted=0过滤掉逻辑删除的数据

==>  Preparing: SELECT id,name,age,email,create_time,update_time,version,deleted FROM user WHERE deleted=0 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值