1、介绍接口AttributeConverter<x, y>
此接口用于转化实体属性的,但id属性和关系属性不可用。它有两个方法:
1、y convertToDatabaseColumn(x) 作用:将实体属性x转化为y存储到数据库中,即插入和更新操作时执行;
2、x convertToEntityAttribute(y) 作用:将数据库中的字段y转化为实体属性x,即查询操作时执行
2、实现的demo
需求:某数据库表中的状态列,1表示“启用”,-1表示“禁用”,-2表示“已删除”。
步骤一:创建StatusEnum,仅列出部分关键代码
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类型
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); } }
步骤三:看下实体类
@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":"已删除"}],客户端直接组装成下拉列表即可。
copyright = { "作者": "墨衣夜行", "本文链接": "http://my.oschina.net/letao/blog/524487" }
时间: 2024-10-05 09:52:04