MP的扩展功能
1.代码生成
在IDEA上安装MyBatisPlus插件
- 打开Settings(Ctr+Alt+S)

- 搜索并安装插件:MyBatisPlus

- 双击Shift搜索ConfigDatabase进行配置

- 双击Shift搜索CodeGenerator生成相关表的代码

2.静态工具

当出现两个Service出现相互调用可以使用静态的工具Db进行调用,避免循环依赖
比如开发以下业务
1 2 3 4 5 6 7
|
@GetMapping @ApiOperation("根据id批量查询用户接口") public List<UserVO> queryUserById(@ApiParam("用户id集合") @RequestParam("ids") List<Long> ids) { return userService.queryUserAndAddressByIds(ids); }
|
1 2 3
|
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
|
@Override public List<UserVO> queryUserAndAddressByIds(List<Long> ids) { List<User> users = listByIds(ids); if (CollUtil.isEmpty(users)){ return Collections.emptyList(); } List<Long> userIds = users.stream().map(User::getId).collect(Collectors.toList()); List<Address> addresses = Db.lambdaQuery(Address.class).in(Address::getUserId, userIds).list(); List<AddressVO> addressVOList = BeanUtil.copyToList(addresses, AddressVO.class); Map<Long, List<AddressVO>> addressVOMap = new HashMap<>(0); if (CollUtil.isNotEmpty(addressVOList)){ addressVOMap = addressVOList.stream().collect(Collectors.groupingBy(AddressVO::getUserId)); } List<UserVO> list = new ArrayList<>(users.size()); for (User user : users) { UserVO userVO = BeanUtil.copyProperties(user, UserVO.class); list.add(userVO); 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 logic-delete-value: 1 logic-not-delete-value: 0
|
==逻辑删除本身也有自己的问题==,
比如:会导致数据库表垃圾数据越来越多,==影响查询效率==SQL中全都需要对逻辑删除字段做判断,影响查询效率因此,我不太推荐采用逻辑删除功能,如果数据不能删除,可以采用把数据迁移到其它表的办法。
4.枚举处理器
分两步走
- 给枚举对应的成员变量加上对应注解
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; } }
|
- 在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
|
@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处理器
- 使用@TableField注解开启
1 2
| @TableField(typeHandler = JacksonTypeHandler.class) private UserInfo info;
|
- 开启自动的结果集映射
1 2
| @TableName(value = "user", autoResultMap = true) public class User {
|
- 我们把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; @ApiModelProperty("使用状态(1正常 2冻结)") private UserStatus status; @ApiModelProperty("账户余额") private Integer balance; @ApiModelProperty("用户的收获地址") private List<AddressVO> addresses; }
|


海林小盆友
小盆友
本文采用 CC BY-NC-SA 4.0 许可协议