首页 > 编程知识 正文

adobe(webdto)

时间:2023-05-04 00:32:35 阅读:88374 作者:4494

开发过程中有时会使用JPA、通用映射器或MyBatis-Plus查询数据。 这样的框架将返回数据库中与表一一对应的实体。 作为接口的返回值,不需要将整个实体发布到前端。 通常将实体转换为另一个DTO对象并返回。 通常有以下转换方法。

自己写代码手动转换(这种方式代码量大,而且不优雅) beanutils.copy properties (Entity,dto ) )这种方式是通过反射来实现的,一般来说,是通过反射来实现的。 一般来说,反射效率相对较低。 (使用由编译器自动生成转换代码并自动更改原始手动的MapStruct框架比使用反射实现更有效率。)。 )综合比较性能、故障诊断、文档、成熟度、可扩展性等来看,MapStruct是个不错的选择,实体映射转换的各个工具比较https://Java.Liling

MapStruct官方网站地址: http://mapstruct.org/,GitHub示例程序: https://github.com/mapstruct/mapstruct-examples

1. 添加依赖 和 配置插件

注意:如果使用lombok,建议使用尽可能高的版本,maven-compiler-plugin插件也使用较高的版本。 否则,可能会报告这个错误:

错误: (12,5 ) Java :专有名称' XXX ' existsinsourceparameter (s ).Did you mean 'null?

属性

项目.构建.源编码-8/项目.构建.源编码

maven.com piler.source 1.8/maven.com piler.source

maven.com piler.target 1.8/maven.com piler.target

org.mapstruct .版本1.4.1 .最终版/org.mapstruct .版本

org .项目日志.版本1.18.12/org .项目日志.版本

/属性

从属关系

从属关系

组org.mapstruct /组id

影响映射/影响id

版本$ { org.mapstruct .版本} /版本

/从属关系

从属关系

groupid org .项目lombok/groupid

artifactIdlombok/artifactId标识

版本$ { org.project lombok .版本} /版本

范围提供/范围

/从属关系

从属关系

groupid org.Apache.com mons/groupid

artifactidcommons-lang3/artifact标识

/从属关系

/从属关系

大楼

插件管理

插件

插件

groupid org.Apache.maven.plugins/groupid

artifactidmaven-compiler -插件/工件id

版本3.8.1 /版本

<configuration> <source>1.8</source> <target>1.8</target> <annotationProcessorPaths> <path> <groupId>org.mapstruct</groupId> <artifactId>mapstruct-processor</artifactId> <version>${org.mapstruct.version}</version> </path> <path> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <version>${org.projectlombok.version}</version> </path> </annotationProcessorPaths> </configuration> </plugin> </plugins> </pluginManagement> </build>

2. 实体

@Getter public enum UserStatusEnum { NORMAL(0, "正常"), LOCK(1, "锁定"); private Integer code; private String desc; UserStatusEnum(Integer code, String desc) { this.code = code; this.desc = desc; } } @Data public class UserInfo { private String address; private String remark; } @NoArgsConstructor @AllArgsConstructor @Data public class User { private Long id; private String name; private String password; private UserStatusEnum userStatusEnum; private Date createTime; private UserInfo userInfo; }

3. DTO

@NoArgsConstructor @AllArgsConstructor @Data public class UserDTO { private Long id; private String realName; private Integer status; private String address; private String password; private String createTimeFormat; }

4. 实体与DTO属性映射配置

@Mapper(componentModel="spring") public interface UserConverter { @Mappings({ @Mapping(source = "name", target = "realName"), @Mapping(target = "status", expression = "java(user.getUserStatusEnum().getCode())"), @Mapping(source = "createTime", target = "createTimeFormat", dateFormat = "yyyy-MM-dd HH:mm:ss"), @Mapping(source = "userInfo.address", target = "address"), @Mapping(target = "password", ignore = true) }) UserDTO entity2dto(User user); } @Mapper 只有在接口加上这个注解,MapStruct 才会去实现该接口,@Mapper 里有个 componentModel 属性,主要是指定实现类的类型,一般用到两个:default:默认,可以通过 Mappers.getMapper(Class) 方式获取实例对象。spring:在接口的实现类上自动添加注解 @Component,可通过 @Autowired 方式注入。@Mappings:配置多个@Mapping@Mapping:属性映射,若源对象属性与目标对象名字一致,会自动映射对应属性source:源属性target:目标属性dateFormat:String 到 Date 日期之间相互转换,通过 SimpleDateFormat,该值为 SimpleDateFormat的日期格式expression:使用Java方法来格式化值ignore: 忽略这个字段

@Mapper可以单独放在一个类中配置,也可以在JPA或者MyBatis中的Mapper类中来配置。

手工编译(mvn compile)或者启动 IDE 的时候, 会自动在 target/classes 下生成对应的实现类。

5. Test

@SpringBootTest class SpringbootMapstructApplicationTests { @Autowired private UserConverter userConverter; @Test public void testMapStruct() { UserInfo userInfo = new UserInfo(); userInfo.setAddress("上海市"); userInfo.setRemark("此人非常懒"); User user = new User(); user.setId(1L); user.setName("tdxz"); user.setPassword("123456"); user.setUserStatusEnum(UserStatusEnum.LOCK); user.setCreateTime(new Date()); user.setUserInfo(userInfo); UserDTO userDTO = userConverter.entity2dto(user); System.out.println(userDTO); } }

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。