摘要
AttributeConverter:实体属性类型转换器。主要使用场景:1、持久化enum;2、加解密数据;3、持久化日期。
1、介绍接口AttributeConverter<x, y>
此接口用于转化实体属性的,但id属性和关系属性不可用。它有两个方法:
1、y convertToDatabaseColumn(x) 作用:将实体属性x转化为y存储到数据库中,即插入和更新操作时执行;
2、x convertToEntityAttribute(y) 作用:将数据库中的字段y转化为实体属性x,即查询操作时执行
2、实现的demo
需求:某数据库表中的状态列,1表示“启用”,-1表示“禁用”,-2表示“已删除”。
步骤一:创建StatusEnum,仅列出部分关键代码
1
2
3
4
5
6
7
8
|
public
enum
StatusEnum {
ENABLE(
1
,
"启用"
), DISABLE(-
1
,
"禁用"
), DELETED(-
2
,
"已删除"
);
StatusEnum(Integer value, String description) {
this
.value = value;
this
.description = description;
}
}
|
步骤二:实现AttributeConverter<String, Integer>接口,将代表数字与描述进行转换,其中实体类中的status字段为String类型
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
|
public
class
StatusAttributeConverter
implements
AttributeConverter<String, Integer> {
@Override
public
Integer convertToDatabaseColumn(String status) {
try
{
return
Integer.parseInt(status);
//如果是数字,则直接返回(这里可以遍历StatusEnum的value来进一步验证)
}
catch
(NumberFormatException e) {
for
(StatusEnum type : StatusEnum.values()) {
//如果不是数字,则通过StatusEnum来找到描述对应的数字
if
(status.equals(type.getDescription())) {
return
type.getValue();
}
}
}
throw
new
RuntimeException(
"Unknown StatusEnum: "
+ status);
//如果StatusEnum里不存在代表数字或描述,则抛出异常
}
@Override
public
String convertToEntityAttribute(Integer value) {
for
(StatusEnum type : StatusEnum.values()) {
//将数字转换为描述
if
(value.equals(type.getValue())) {
return
type.getDescription();
}
}
throw
new
RuntimeException(
"Unknown database value: "
+ value);
}
}
|
步骤三:看下实体类
1
2
3
4
5
6
|
@Entity
@Table
(name =
"t_demo"
)
public
class
DemoEntity {
@Convert
(converter = StatusAttributeConverter.
class
)
private
String status;
//状态:1 启用,-1 禁用,-2 已删除
}
|
3、优点
客户端不必再硬编码后台的数字与描述的对应细节。
服务端提供获取StatusEnum的接口,获取到[{"value":1, "description":"启用"}, {"value":-1, "description":"禁用"}, {"value":-2, "description":"已删除"}],客户端直接组装成下拉列表即可。
1
2
3
4
|