MyBatisPlus笔记06 自动填充、逻辑删除、通用枚举等
coconutnut

https://www.bilibili.com/video/BV1rE41197jR

P55~62

sql注入器

默认的Mapper中方法不够用时,自己扩充BaseMapper中的方法

https://www.bilibili.com/video/BV1rE41197jR?p=55

自动填充

插入或者更新数据时,希望有些字段可以自动填充数据,比如密码、version 等

添加@TableField注解

1
2
3
@Version
@TableField(fill = FieldFill.INSERT)
private Integer version;

FieldFill可选:

  • DEFAULT 默认不处理
  • INSERT 插入试填充字段
  • UPDATE 更新时填充字段
  • INSERT_UPDATE 插入和更新时填充字段

编写MyMetaObjectHandler

1
2
3
4
5
6
7
8
9
10
11
12
13
@Component
public class MyMetaObjectHandler implements MetaObjectHandler {

@Override
public void insertFill(MetaObject metaObject) {
Object version = getFieldValByName("version", metaObject);
if(version == null){
setFieldValByName("version", 1, metaObject);
}
}

}

测试

1
2
3
4
5
6
7
8
9
10
11
12
@Test
public void testInsertFill(){
User user = new User();
user.setName("张四");
user.setUserName("zhangsi");
user.setPassword("123123");
user.setAge(30);
user.setEmail("zhangsi@itast.cn");

int result = this.userMapper.insert(user);
System.out.println("result = " + result);
}

输出

1
2
3
4
5
6
7
8
9
10
 Time:9 ms - ID:com.coconutnut.demo.mapper.UserMapper.insert
Execute SQL:
INSERT
INTO
tb_user
( user_name, password, name, age, email, version )
VALUES
( 'zhangsi', '123123', '张四', 30, 'zhangsi@itast.cn', 1 )

result = 1

逻辑删除

将数据标记为删除,而并非真正删除

查询时需要携带状态条件,确保被标记的数据不被查询到

修改表结构

为tb_user表增加deleted字段,用于表示数据是否被删除,1代表删除,0代表未删除

1
2
ALTER TABLE `tb_user`
ADD COLUMN `deleted` int(1) NULL DEFAULT 0 COMMENT '1代表删除,0代表未删除' AFTER `version`;

修改User实体,增加deleted属性并且添加@TableLogic注解

1
2
@TableLogic
private Integer deleted;

配置

application.properties中

1
2
# 逻辑已删除值(默认为 1) mybatis-plus.global-config.db-config.logic-delete-value=1
# 逻辑未删除值(默认为 0) mybatis-plus.global-config.db-config.logic-not-delete-value=0

直接用默认值可以省略

测试

1
2
3
4
5
6
@Test
public void testDelete() {
User user = new User(); user.setId(2L);
boolean delete = user.deleteById();
System.out.println(delete);
}

输出

1
2
3
4
5
6
7
8
9
10
11
 Time:2 ms - ID:com.coconutnut.demo.mapper.UserMapper.deleteById
Execute SQL:
UPDATE
tb_user
SET
deleted=1
WHERE
id=2
AND deleted=0

true

实际上变成了UPDATE

然后查询

1
2
3
4
5
6
7
@Test
public void testSelectById() {
User user = new User();
user.setId(2L);
User user2 = user.selectById();
System.out.println(user2);
}

输出

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
 Time:5 ms - ID:com.coconutnut.demo.mapper.UserMapper.selectById
Execute SQL:
SELECT
id,
user_name,
password,
name,
age,
email,
version,
deleted
FROM
tb_user
WHERE
id=2
AND deleted=0

null

SQL中添加了deleted=0的条件,没有查到数据

通用枚举

修改表结构

1
2
ALTER TABLE `tb_user`
ADD COLUMN `sex` int(1) NULL DEFAULT 1 COMMENT '1-男,2-女' AFTER `deleted`;

修改User实体类

1
private SexEnum sex;

定义枚举

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
package com.coconutnut.demo.enums;

import com.baomidou.mybatisplus.core.enums.IEnum;

public enum SexEnum implements IEnum<Integer> {

MAN(1,"男"),
WOMAN(2,"女");

private int value;
private String desc;

SexEnum(int value, String desc) {
this.value = value;
this.desc = desc;
}

@Override
public Integer getValue() {
return this.value;
}

@Override
public String toString() {
return this.desc;
}
}

配置

1
2
# 枚举包扫描
mybatis-plus.type-enums-package=com.coconutnut.demo.enums

测试

1
2
3
4
5
6
7
8
9
10
11
12
13
@Test
public void testInsert(){
User user = new User();
user.setName("张五");
user.setAge(30);
user.setPassword("123456");
user.setUserName("zhangwu");
user.setEmail("zhangwu@itcast.cn");
user.setSex(SexEnum.WOMAN);

boolean insert = user.insert();
System.out.println(insert);
}

输出

1
2
3
4
5
6
7
8
9
10
 Time:6 ms - ID:com.coconutnut.demo.mapper.UserMapper.insert
Execute SQL:
INSERT
INTO
tb_user
( user_name, password, name, age, email, sex, version )
VALUES
( 'zhangwu', '123456', '张五', 30, 'zhangwu@itcast.cn', 2, 1 )

true

代码生成器

AutoGenerator 是 MyBatis-Plus 的代码生成器,通过 AutoGenerator 可以快速生成 Entity、Mapper、MapperXML、Service、Controller 等各个模块的代码,提升开发效率

https://www.bilibili.com/video/BV1rE41197jR?p=60

MyBatisX快速开发插件

基于 IDEA 的快速开发插件

安装:File -> Settings -> Plugins,搜索并安装

功能:Java和对应XML跳转;Mapper方法自动生成 XML