MybatisPlus扩展功能

1.MP的代码生成

使用MybatisPlus的基本步骤:

  • 准备实体类,并且在实体类上加上注解。例如:@TableName,@TableId()等
  • 准备实体类Mapper,Mapper继承BaseMapper并指定泛型
  • 准备实体类Service接口,继承IService接口并指定泛型
  • 准备实体类Service实现类并继承ServiceImpl指定泛型(所需Mapper以及实体类),并且实现Service接口

上述的步骤都是比较固定的,只是表名,接口名等信息不同。因此可以使用MP的代码生成通过表明生成类。

MP代码生成官网信息使用MP官网提供的方法还是需要写很多代码,这并不方便,我们可以使用MP官方退出的插件MybatisX快速开发插件

这里我们使用的是MybatisPlus(插件名).

1.1 插件的使用

上图是利用插件并且数据库连接成功后的页面

上图相关配置解析

上图为配置完成后的信息

点击code generatro后会发现实体类已经生成

2.MP的静态工具

2.1静态工具方法总结

上述的方法与IService中的方法名是相同的,不同的是IService中的方法是非静态的.

和IService不同的是,IService在定义的时候就需要指定泛型,但是DB静态方法是在调用的时候传入对象的字节码

举例:

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
/**
* 根据userid查询用户以及地址
* @param id
* @return
*/
@Override
public UserVO queryUserAndAddressByUserId(Long id) {
// 查询用户
User user = userMapper.selectById(id);
if (user == null || user.getStatus().equals(UserContants.USER_STATUS_NOT_NORMAL)){
throw new RuntimeException("用户查询失败");
}

// 查询地址
List<Address> addresses = Db.lambdaQuery(Address.class).eq(Address::getUserId, id).list();

// 封装VO
// 转UserPo 为 UserVo
UserVO userVO = BeanUtil.copyProperties(user, UserVO.class);

if (CollUtil.isNotEmpty(addresses)){
// 这里使用的是BeanUtil工具的拷贝功能,也可以对集合进行拷贝
List<AddressVO> addressVOS = BeanUtil.copyToList(addresses, AddressVO.class);
userVO.setAddress(addressVOS);
}
return userVO;
}

3.MP的枚举处理器

场景说明:

User类中有一个用户状态字段:private Integer status(1:正常,2冻结),我们可以使用枚举来表示状态

1
2
3
4
5
6
7
8
9
10
11
12
@Getter
public enum UserStatus{
NORMAL(1,"正常"),
FREEZE(2,"冻结");
private final int value;
private final String desc;

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

于是上述的用户状态字段改为:private UserStatus status,这样代码中就不会出现魔法值1,2,可以使用NORMAL等枚举来代替。

但是这样的方法带来的另外一个问题,数据库表中的状态为int,但是枚举类的类型为UserStatus.于是出现了枚举类型和数据类型的相互转换.例如Java数据类型和数据库表的数据类型的相互转换.底层是由Mybatis来处理的.

MybatisPlus提供了类型转换的方法

1.准备枚举类,给枚举类添加注解

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
@Getter
public enum UserStatus{
/**
* 枚举字段
*/
NORMAL(1,"正常"),
FREEZE(2,"冻结");

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

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

2.配置枚举处理器

1
2
3
4
mybatis-plus:
mapper-locations: classpath*:mapper/*.xml
configuration:
default-enum-type-handler: com.baomidou.mybatisplus.core.handlers.MybatisEnumTypeHandler

3.更改业务处理代码

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
/**
* 根据userid查询用户以及地址
* @param id
* @return
*/
@Override
public UserVO queryUserAndAddressByUserId(Long id) {
// 查询用户
User user = userMapper.selectById(id);
if (user == null || user.getStatus() == UserStatus.FREEZE){
throw new RuntimeException("用户查询失败");
}

// 查询地址
List<Address> addresses = Db.lambdaQuery(Address.class).eq(Address::getUserId, id).list();

// 封装VO
// 转UserPo 为 UserVo
UserVO userVO = BeanUtil.copyProperties(user, UserVO.class);

if (CollUtil.isNotEmpty(addresses)){
List<AddressVO> addressVOS = BeanUtil.copyToList(addresses, AddressVO.class);
userVO.setAddress(addressVOS);
}
return userVO;
}

以这种方法返回给前端的数据展示为NORMAL或者为FREEZE,这样并不直观,于是使用@JsonValue进行设置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
@Getter
public enum UserStatus{
/**
* 枚举字段
*/
NORMAL(1,"正常"),
FREEZE(2,"冻结");

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

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

其中@JsonValue注解写在value上就返回数字,写在desc上就返回文字

4.MP的JSON处理器

在数据库中往往有一些JSON数据格式的数据,但是JAVA中并没有JSON数据类型。于是出现了在java中想要取出JSON中的数据却无法实现,MP的JSON处理器便可以处理这个问题.

1.创建JSON实体类

1
2
3
4
5
6
7
8
@Data
@AllArgsConstructor
@NoArgsConstructor(staticName = "of")
public class UserInfo {
private Integer age;
private String intro;
private String gender;
}

其中staticName = "of"

  • @AllArgsConstructor 是 Lombok 提供的一个注解,它会为类生成一个包含所有参数的构造函数。
  • staticName = "of"@AllArgsConstructor 注解的一个参数,用于指定生成的静态工厂方法的名称。在这个例子中,指定了静态工厂方法的名称为 of
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
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
@Data
@TableName(value = "user",autoResultMap = true)
public class User {

/**
* 用户id
*/
private Long id;

/**
* 用户名
*/
private String username;

/**
* 密码
*/
private String password;

/**
* 注册手机号
*/
private String phone;

/**
* 详细信息
*/
@TableField(typeHandler = JacksonTypeHandler.class)
private UserInfo info;

/**
* 使用状态(1正常 2冻结)
*/
private UserStatus status;

/**
* 账户余额
*/
private Integer balance;

/**
* 创建时间
*/
private LocalDateTime createTime;

/**
* 更新时间
*/
private LocalDateTime updateTime;
}

在指定JSON属性上添加@TableField(typeHandler = JacksonTypeHandler.class)注解,在类上添加注解@TableName(value = “user”,autoResultMap = true).

  • Copyright: Copyright is owned by the author. For commercial reprints, please contact the author for authorization. For non-commercial reprints, please indicate the source.
  • Copyrights ©本博客所有文章除特别声明外,著作权归作者所有。转载请注明出处! yang
  • Visitors: | Views:

请我喝杯咖啡吧~

支付宝
微信