为了实现代码的规范,降低代码中的get set方法的重复出现,未来便于代码维护,引入实体转换接口为Convert,假设是一个用户中存在的各种实体类型转化,设置其接口为UserConvert。
@Mapper
public interface UserConvert {
UserConvert MAPPER = Mappers.getMapper(UserConvert.class);
UserModel createReqToModel(CreateUserReq req);
UserModel editReqToModel(EditUserReq req);
}
当导入了一下代码之后,框架会自动将两个实体中对应的属性一一赋值过去其中假设UserModel:
@Data
@TableName("sys_user")
public class UserModel implements Serializable {
@TableId
private Long userId;
private String userName;
private Integer userGender;
private String userCard;
private String userPhone;
}
CreateUserReq为:
@Data
@ApiModel("用户创建入参")
public class CreateUserReq implements Serializable {
@ApiModelProperty("员工姓名")
@NotNull(message = "缺少员工姓名")
private String userName;
@ApiModelProperty("员工性别")
@NotNull(message = "缺少员工性别")
private Integer userGender;
@ApiModelProperty("身份证号")
@NotNull(message = "缺少身份证号")
private String userCard;
@ApiModelProperty("手机号")
@NotNull(message = "缺少手机号")
private String userPhone;
}
其中调用为:
//其中req的类型为CreateUserReq
UserModel userModel = UserConvert.MAPPER.createReqToModel(req);
以上所述的是当两边的属性的类型和名称都是一致的时候可以直接这样转化。减少了书写get set自己赋值的重复步骤。
假设其中有对应的属性不一致那么就会导致两边映射不上去。无论是名字还是属性不一致都不会自动映射上去。
假设,存在这样一个样例。我再外部导入数据的时候,导入商品价格表。表中的价格属性是Double元为单位的两位小数,但是我在后端数据库中需要存储的是分为单位的Integer属性。在转换过程中就存在。
ShopGoodsPriceModel:
@TableName("t_shop_goods_price")
@Data
public class ShopGoodsPriceModel implements Serializable {
@TableId
private Long goodsPriceId;
private Long shopId;
private Integer code;
private String goodsName;
private String goodsCode;
private Integer goodsPrice;
private LocalDateTime createTime;
private LocalDateTime updateTime;
private String createUser;
private String updateUser;
private Integer isDeleted;
}
ShopGoodsPriceImportDTO:
@Data
@ApiModel("门店商品价格批量导入")
public class ShopGoodsPriceImportDTO {
@ApiModelProperty("商品价格ID")
private Long goodsPriceId;
@ExcelProperty("门店ID")
@ApiModelProperty("门店ID")
private Long shopId;
@ExcelProperty("门店codes")
@ApiModelProperty("门店codes")
private Integer codes;
@ExcelProperty("商品名称")
@ApiModelProperty("商品名称")
private String goodsName;
@ExcelProperty("商品条码")
@ApiModelProperty("商品条码")
private String goodsCode;
@ExcelProperty("商品价格")
@ApiModelProperty("商品价格")
private Double goodsPrice;
//是否为错误数据 1:是 0:否
private Integer isFail = 0;
@ExcelProperty("失败原因")
@ApiModelProperty("失败原因")
private String failReason;
}
如果直接使用转化就会实现精度丢失。如果传入0.9,存入后端的就会是0;
@Mapper
public interface ShopConvert {
ShopConvert MAPPER = Mappers.getMapper(ShopConvert.class);
@Mapping(source = "code",target = "codes")
@Mapping(target = "goodsPrice", expression = "java(shopGoodsPriceImportDTO.getGoodsPrice() != null ? (int)(shopGoodsPriceImportDTO.getGoodsPrice() * 100D) : null)")
ShopGoodsPriceModel shopGoodsPriceImportDTOToModel(ShopGoodsPriceImportDTO shopGoodsPriceImportDTO);
}
由于在转换过程中需要将元转化为分,因此就需要使用、
expression = "java(shopGoodsPriceImportDTO.getGoodsPrice() != null ? (int)(shopGoodsPriceImportDTO.getGoodsPrice() * 100D) : null)"
将他转换为分之后,然后再将double类型转换为int类型即可。他会在编译过程中执行转化。