我是靠谱客的博主 优美小虾米,最近开发中收集的这篇文章主要介绍java map对象命名,Java 实体映射工具 MapStruct,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

一、名词解释

DTO(Data Transfer Object):数据传输对象,这个概念来源于J2EE的设计模式,原来的目的是为了EJB的分布式应用提供粗粒度的数据实体,以减少分布式调用的次数,从而提高分布式调用的性能和降低网络负载,但在这里,我泛指用于展示层与服务层之间的数据传输对象。

DO(Domain Object):领域对象,就是从现实世界中抽象出来的有形或无形的业务实体。

说明:在一个成熟的工程中,尤其是现在的分布式系统中,应用与应用之间,还有单独的应用细分模块之后,DO 一般不会让外部依赖,这时候需要在提供对外接口的模块里放 DTO 用于对象传输,也即是 DO 对象对内,DTO对象对外,DTO 可以根据业务需要变更(只需部分字段或字段名不同等),并不需要映射 DO 的全部属性。

这种 对象与对象之间的互相转换,就需要有一个专门用来解决转换问题的工具,毕竟每一个字段都 get/set 会很麻烦。

MapStruct 就是这样的一个属性映射工具,只需要定义一个 Mapper 接口,MapStruct 就会自动实现这个映射接口,避免了复杂繁琐的映射实现。MapStruct官网地址: http://mapstruct.org/

二、maven配置

1.2.0.Final

org.mapstruct

mapstruct-jdk8

${mapstruct.version}

org.mapstruct

mapstruct-processor

${mapstruct.version}

三、基本用法 一对一 DO TO DTO

两个 DO 对象 Person 和 User,其中 user 是 Person 的一个属性 ,一个 DTO 对象 PersonDTO

DO中的使用Lombok省略get/set/构造方法中

@NoArgsConstructor

@AllArgsConstructor

@Data

public class Person {

private Long id;

private String name;

private String email;

private Date birthday;

private User user;

}

@NoArgsConstructor

@AllArgsConstructor

@Data

public class User {

private Integer age;

}

@NoArgsConstructor

@AllArgsConstructor

@Data

public class PersonDTO {

private Long id;

private String name;

/**

* 对应 Person.user.age

*/

private Integer age;

private String email;

/**

* 与 DO 里面的字段名称(birthDay)不一致

*/

private Date birth;

/**

* 对 DO 里面的字段(birthDay)进行拓展,dateFormat 的形式

*/

private String birthDateFormat;

/**

* 对 DO 里面的字段(birthDay)进行拓展,expression 的形式

*/

private String birthExpressionFormat;

}

四、多对一用法

说明:

写一个 Mapper 接口 PersonConverter,其中两个方法,一个是单实体映射,另一个是List映射

对象属性与目标对象属性名字一致

自动映射对应属性,啥也不用改

不一致

1.属性名不一致:

source---target:

2.类型不一致:

3.不映射,可忽略

@Mapper

public interface PersonConverter {

PersonConverter INSTANCE = Mappers.getMapper(PersonConverter.class);

@Mappings({

@Mapping(source = "birthday", target = "birth"),

@Mapping(source = "birthday", target = "birthDateFormat", dateFormat = "yyyy-MM-dd HH:mm:ss"),

@Mapping(target = "birthExpressionFormat", expression = "java(org.apache.commons.lang3.time.DateFormatUtils.format(person.getBirthday(),"yyyy-MM-dd HH:mm:ss"))"),

@Mapping(source = "user.age", target = "age"),

@Mapping(target = "email", ignore = true)

})

PersonDTO domain2dto(Person person);

List domain2dto(List people);

}

五、转换类中添加自定义方法

通过 “默认方法”的方式,为转换接口添加自定方法

// 形式如下

default PersonDTO personToPersonDTO(Person person) {

//hand-written mapping logic

}

// 比如在 PersonConverter 里面加入如下

default Boolean convert2Bool(Integer value) {

if (value == null || value < 1) {

return Boolean.FALSE;

} else {

return Boolean.TRUE;

}

}

default Integer convert2Int(Boolean value) {

if (value == null) {

return null;

}

if (Boolean.TRUE.equals(value)) {

return 1;

}

return 0;

}

六 @InheritConfiguration 继承之前方法的配置

比如在 PersonConverter 里面加入如下,@InheritConfiguration 用于继承刚才domain2dto方法的配置

@InheritConfiguration(name = "domain2dto")

void update(Person person, @MappingTarget PersonDTO personDTO);

七、注入Spring

默认使用方式

PersonConverter INSTANCE = Mappers.getMapper(PersonConverter.class);

注入Spring方式 @Mapper(componentModel="spring")

@Mapper(componentModel="spring")

public interface PersonConverter {

@Mappings({

@Mapping(source = "birthday", target = "birth"),

@Mapping(source = "birthday", target = "birthDateFormat", dateFormat = "yyyy-MM-dd HH:mm:ss"),

@Mapping(target = "birthExpressionFormat", expression = "java(org.apache.commons.lang3.time.DateFormatUtils.format(person.getBirthday(),"yyyy-MM-dd HH:mm:ss"))"),

@Mapping(source = "user.age", target = "age"),

@Mapping(target = "email", ignore = true)

})

PersonDTO domain2dto(Person person);

}

spring 使用

@RunWith(SpringRunner.class)

@SpringBootTest(classes = BaseTestConfiguration.class)

public class PersonConverterTest {

//这里把转换器装配进来

@Autowired

private PersonConverter personConverter;

@Test

public void test() {

Person person = new Person(1L,"zhige","zhige.me@gmail.com",new Date(),new User(1));

PersonDTO personDTO = personConverter.domain2dto(person);

}

}

八、MapStruct常用注解

@Mapper 只有在接口加上这个注解, MapStruct 才会去实现该接口

@Mapper 里有个 componentModel 属性,主要是指定实现类的类型,一般用到两个

default:默认,可以通过 Mappers.getMapper(Class) 方式获取实例对象

spring:在接口的实现类上自动添加注解 @Component,可通过 @Autowired 方式注入

@Mapping:属性映射,若源对象属性与目标对象名字一致,会自动映射对应属性

source:源属性

target:目标属性

dateFormat:String 到 Date 日期之间相互转换,通过 SimpleDateFormat,该值为 SimpleDateFormat 的日期格式

ignore: 忽略这个字段

@Mappings:配置多个@Mapping

@MappingTarget 用于更新已有对象

@InheritConfiguration 用于继承配置

参考

最后

以上就是优美小虾米为你收集整理的java map对象命名,Java 实体映射工具 MapStruct的全部内容,希望文章能够帮你解决java map对象命名,Java 实体映射工具 MapStruct所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(46)

评论列表共有 0 条评论

立即
投稿
返回
顶部