MP的扩展功能

MP的扩展功能

1.代码生成

在IDEA上安装MyBatisPlus插件

  1. 打开Settings(Ctr+Alt+S)
    2c280f6ab08d45fa279f5a6fe9acd2a8960d8cae.png
  2. 搜索并安装插件:MyBatisPlus
    4de545cf165a06c5242e2a84fb97f66459105244.png
  3. 双击Shift搜索ConfigDatabase进行配置
    bf9eecb3cd853fc9f793eff5eca96a6bf947d446.png
  4. 双击Shift搜索CodeGenerator生成相关表的代码
    fee649b6b0e4bd4a7f565541bf32859d199af571.png

2.静态工具

8d070983762bf970e8992421d5e33d0fc094ae5f.png
当出现两个Service出现相互调用可以使用静态的工具Db进行调用,避免循环依赖
比如开发以下业务

1
2
3
4
5
6
7
//UserController

@GetMapping
@ApiOperation("根据id批量查询用户接口")
public List<UserVO> queryUserById(@ApiParam("用户id集合") @RequestParam("ids") List<Long> ids) {
return userService.queryUserAndAddressByIds(ids);
}
1
2
3
//IUserService

List<UserVO> queryUserAndAddressByIds(List<Long> ids);
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
28
29
30
31
32
//UserServiceImpl

@Override
public List<UserVO> queryUserAndAddressByIds(List<Long> ids) {
//1.查询用户
List<User> users = listByIds(ids);
if (CollUtil.isEmpty(users)){
return Collections.emptyList();
}
//2.查询用户地址
//2.1 获取用户id集合
List<Long> userIds = users.stream().map(User::getId).collect(Collectors.toList());
//2.2根据用户id查询用户地址
List<Address> addresses = Db.lambdaQuery(Address.class).in(Address::getUserId, userIds).list();
//2.3转换地址VO
List<AddressVO> addressVOList = BeanUtil.copyToList(addresses, AddressVO.class);
//2.4用户地址集合分组处理,相同用户的放入一个集合(组)中
Map<Long, List<AddressVO>> addressVOMap = new HashMap<>(0);
if (CollUtil.isNotEmpty(addressVOList)){
addressVOMap = addressVOList.stream().collect(Collectors.groupingBy(AddressVO::getUserId));
}
//3.转换VO返回
List<UserVO> list = new ArrayList<>(users.size());
for (User user : users) {
//3.1转化User的PO为VO
UserVO userVO = BeanUtil.copyProperties(user, UserVO.class);
list.add(userVO);
//3.2设置地址VO
userVO.setAddresses(addressVOMap.get(user.getId()));
}
return list;
}

3.逻辑删除

逻辑删除就是基于代码逻辑模拟删除效果,但并不会真正删除数据。思路如下:

  • 在表中添加一个字段标记数据是否被删除
  • 当删除数据时把标记置为1
  • 查询时只查询标记为0的数据

MybatisPlus提供了逻辑删除功能,无需改变方法调用的方式,而是在底层帮我们自动修改CRUD的语句。我们要做的就是在application.yaml文件中配置逻辑删除的字段名称和值即可:

1
2
3
4
5
6
mybatis-plus:
global-config:
db-config:
logic-delete-field: flag # 全局逻辑删除的实体字段名,字段类型可以是boolean、integer
logic-delete-value: 1 # 逻辑已删除值(默认为 1)
logic-not-delete-value: 0 # 逻辑未删除值(默认为 0)

==逻辑删除本身也有自己的问题==,
比如:会导致数据库表垃圾数据越来越多,==影响查询效率==SQL中全都需要对逻辑删除字段做判断,影响查询效率因此,我不太推荐采用逻辑删除功能,如果数据不能删除,可以采用把数据迁移到其它表的办法。

4.枚举处理器

分两步走

  1. 给枚举对应的成员变量加上对应注解
1
2
3
4
5
6
7
8
9
10
11
12
13
14
@Getter  
public enum UserStatus {
NORMAL(1, "正常"),
FROZEN(2, "冻结");

@EnumValue
private final int value;
private final String desc;

UserStatus(int value, String desc) {
this.value = value;
this.desc = desc;
}
}
  1. 在yml中配置全局枚举处理器
1
2
3
mybatis-plus:
configuration:
default-enum-type-handler: com.baomidou.mybatisplus.core.handlers.MybatisEnumTypeHandler

案例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
//枚举

@Getter
public enum UserStatus {
NORMAL(1, "正常"),
FROZEN(2, "冻结");

@EnumValue
private final int value;
@JsonValue 给前端返回的是什么类型自己定义就行
private final String desc;

UserStatus(int value, String desc) {
this.value = value;
this.desc = desc;
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
//对应的VO

@Data
@ApiModel(description = "用户VO实体")
public class UserVO {

@ApiModelProperty("用户id")
private Long id;

@ApiModelProperty("用户名")
private String username;

@ApiModelProperty("详细信息")
private String info;

@ApiModelProperty("使用状态(1正常 2冻结)")
private UserStatus status;

@ApiModelProperty("账户余额")
private Integer balance;

@ApiModelProperty("用户的收获地址")
private List<AddressVO> addresses;
}

5.JSON处理器

  1. 使用@TableField注解开启
1
2
@TableField(typeHandler = JacksonTypeHandler.class)  
private UserInfo info;
  1. 开启自动的结果集映射
1
2
@TableName(value = "user", autoResultMap = true)  
public class User {
  1. 我们把PO改了,VO是不是也要改
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
@Data  
@ApiModel(description = "用户VO实体")
public class UserVO {

@ApiModelProperty("用户id")
private Long id;

@ApiModelProperty("用户名")
private String username;

@ApiModelProperty("详细信息")
private UserInfo info; //改成UserInfo的类型

@ApiModelProperty("使用状态(1正常 2冻结)")
private UserStatus status;

@ApiModelProperty("账户余额")
private Integer balance;

@ApiModelProperty("用户的收获地址")
private List<AddressVO> addresses;
}