您现在的位置是:首页 > 后台技术 > JavaJava
代码简洁之道-mapstruct(图文)
第十三双眼睛2022-03-05【Java】人已围观
简介mapstruct的简单介绍及使用
要使用mapstruct,请确保你的jdk版本是1.8+。
官网:https://mapstruct.org/
1:导入依赖
2:准备几个实体类
定义一个映射器
定义一个定时任务,我们来测试一下
结果成功输出了
UserAddParam(name=张三, age=1, birthday=Sat Mar 05 12:27:10 CST 2022, salary=5434.56,
houseList=[HouseAddParam(estateName=缤纷东苑, address=杭州滨江区, building=3, unit=1, floor=4, houseCode=401)])
提示:8种基本类型和String可以自动转换
数字格式化:
我们现在把目标对象的薪资属性salary改为字符串,并且要保留一位小数,做如下配置就可以做到
日期格式化
我们现在把目标对象的生日属性birthday改为字符串,格式要求2012-12-12 12:12:12这种 做如下配置就可以做到
我们首先需要将源对象的生日属性birthday类型改为Date
忽略目标对象的某个属性赋值
自定义处理方法
@AfterMapping 注解的作用是,当UserAddRequest 到 UserAddParam 转换方法完成后,会来调用这个方法
@MappingTarget 注解用来标记目标对象
当属性很多,并且名字都相同,但是只想映射少量属性时该怎么办呢,如果一个一个设置忽略,则会很多。用如下注解就可以解决
@BeanMapping(ignoreByDefault = true)
此注解的作用是,先禁用默认映射。再手动设置我们想映射的属性就可以了。
@InheritConfiguration
MapStruct允许对映射关系进行继承,使用@InheritConfiguration标记当前方法继承其他映射方法的映射关系。会自动查找相同类型映射源、映射目标的方法进行继承,如果存在多个相同类型的方法,则需要手工指定
@InheritInverseConfiguration
除了正向继承规则外,还可以进行规则逆向继承,从被继承方法的目标对象映射到源对象
只会继承@Mapping 不会继承@BeanMapping
官网:https://mapstruct.org/
1:导入依赖
<dependency> <groupId>org.mapstruct</groupId> <artifactId>mapstruct-processor</artifactId> <version>1.2.0.Final</version> </dependency> <dependency> <groupId>org.mapstruct</groupId> <artifactId>mapstruct</artifactId> <version>${mapstruct.version}</version> </dependency> |
public class UserAddRequest { private String name; private Integer age; private Long birthday; private Double salary; private List<HouseAddRequest> houseList; } |
public class HouseAddRequest { private String estateName; private String address; private Integer building; private Integer unit; private Integer floor; private String houseNumber; } |
public class UserAddParam { private String name; private Integer age; private Date birthday; private Double salary; private List<HouseAddParam> houseList; } |
public class HouseAddParam { private String estateName; private String address; private Integer building; private Integer unit; private Integer floor; private String houseCode; } |
@Mapper(componentModel = "spring") public abstract class HouseConverter { @Mappings({ @Mapping(target = "houseCode",source = "houseNumber") }) public abstract HouseAddParam request2param(HouseAddRequest request); } |
@Mapper(componentModel ="spring",imports = {Date.class}) public abstract class UserConverter { @Autowired private HouseConverter houseConverter; @Mappings({ @Mapping(target = "birthday",expression = "java(new Date(request.getBirthday()))") }) public abstract UserAddParam request2param(UserAddRequest request); public HouseAddParam houseRequest2param(HouseAddRequest request){ return houseConverter.request2param(request); } } |
@Scheduled(cron = "0/10 * * * * *") public void converterUserAddRequest2AddParam(){ UserAddRequest userAddRequest = new UserAddRequest(); userAddRequest.setName("张三"); userAddRequest.setAge(1); userAddRequest.setBirthday(new Date().getTime()); userAddRequest.setSalary(5434.56); List<HouseAddRequest> houseAddRequestList = new ArrayList<>(); HouseAddRequest houseAddRequest1 = new HouseAddRequest(); houseAddRequest1.setAddress("杭州滨江区"); houseAddRequest1.setEstateName("缤纷东苑"); houseAddRequest1.setBuilding(3); houseAddRequest1.setUnit(1); houseAddRequest1.setFloor(4); houseAddRequest1.setHouseNumber("401"); houseAddRequestList.add(houseAddRequest1); userAddRequest.setHouseList(houseAddRequestList); UserAddParam userAddParam = userConverter.request2param(userAddRequest); System.out.println("================================================="); System.out.println(userAddParam); } |
UserAddParam(name=张三, age=1, birthday=Sat Mar 05 12:27:10 CST 2022, salary=5434.56,
houseList=[HouseAddParam(estateName=缤纷东苑, address=杭州滨江区, building=3, unit=1, floor=4, houseCode=401)])
提示:8种基本类型和String可以自动转换
数字格式化:
我们现在把目标对象的薪资属性salary改为字符串,并且要保留一位小数,做如下配置就可以做到
@Mapping(target = "salary",source = "salary",numberFormat = "#0.0") |
我们现在把目标对象的生日属性birthday改为字符串,格式要求2012-12-12 12:12:12这种 做如下配置就可以做到
我们首先需要将源对象的生日属性birthday类型改为Date
@Mapping(target = "birthday",dateFormat = "yyyy-MM-dd HH:mm:ss") |
忽略目标对象的某个属性赋值
@Mapping(target = "age",ignore = true) |
自定义处理方法
@AfterMapping public void afterMapping(@MappingTarget UserAddParam userAddParam,UserAddRequest request){ } |
@MappingTarget 注解用来标记目标对象
当属性很多,并且名字都相同,但是只想映射少量属性时该怎么办呢,如果一个一个设置忽略,则会很多。用如下注解就可以解决
@BeanMapping(ignoreByDefault = true)
此注解的作用是,先禁用默认映射。再手动设置我们想映射的属性就可以了。
@InheritConfiguration
MapStruct允许对映射关系进行继承,使用@InheritConfiguration标记当前方法继承其他映射方法的映射关系。会自动查找相同类型映射源、映射目标的方法进行继承,如果存在多个相同类型的方法,则需要手工指定
@InheritInverseConfiguration
除了正向继承规则外,还可以进行规则逆向继承,从被继承方法的目标对象映射到源对象
只会继承@Mapping 不会继承@BeanMapping
Tags:
很赞哦! ()
相关文章
随机图文
redis类型转换异常(图文)
在开发的过程中,偶然遇到一次将一个对象放入redis,然后取出来,进行类型转换却报错,按道理说不应该,网上查了好多资料都不对,最好找到了答案,记录一下springboot实现不同业务的日志打印到不同的文件中(图文)
这几天有个项目的日志信息比较多,需要把不同业务的日志打印到不同的文件中去,今天在公司搞了很久都没搞定,晚上回来搞,终于搞定了,记录一下。微服务springcloud(图文)
微服务就是由一系列围绕自己业务开发的微小服务构成,他们独立部署运行在自己的进程里,基于分布式的管理 微服务是一种架构方式: 将单一应用基于业务拆分多个微小服务,他们独立运行 独立部署 每个服务运行在自己计算机进程里面 对于这些服务都是分布式管理。 这种架构是将单个的整体应用程序分割成更小的项目关联的独立的服务。一个服务通常实现一组独立的特性或功能,包含自己的业务逻辑和适配器。各个微服务之间的关联通过暴露api来实现(http)。这些独立的微服务不需要部署在同一个虚拟机,同一个系统和同一个应用服务器中JAVA定时备份数据库(图文)
定时备份数据库非常重要,记录一下,以后用的时候随时来找