
Java实体映射工具MapStruct
从 VO 中提取 name 和 pass,放入 DTO。 将 DTO 转换为 Entity,再持久化到数据库。
发布日期:2021-05-07 14:47:08
浏览次数:13
分类:精选文章
本文共 3322 字,大约阅读时间需要 11 分钟。
Java 实体映射工具 MapStruct
1. Entity、VO、DTO 的认识与应用
在 Java 开发中,Entity、VO(Value Object)和 DTO(Data Transfer Object)是数据传输和持久化中的三种核心概念,各自承担着不同的角色。
Entity:
Entity 是与数据库对应的实体类,每个字段都映射到数据库中的对应字段。它是数据持久化的核心对象,负责与数据库进行 CRUD 操作。VO:
VO 是面向前端或其他无持久化需求的数据传输类。它的字段与前台页面或其他系统的数据需求完全一致,主要用于数据展示和传输。DTO:
DTO 是将数据从 Entity 转换为 VO,或者从 VO 转换为 Entity 的中间对象。DTO 中的字段应是 Entity 或 VO 的子集,通常用于数据的安全转换或特定业务逻辑处理。示例:
- 前台页面 需要三个字段:name、pass、age。
- 数据库表 只有 name 和 pass 两个字段。
- VO 需要三个字段:name、pass、age。
- Entity 则只有 name 和 pass 两个字段。
在业务逻辑中,若需要验证 age 大于 20 的条件时,可以通过 DTO 进行判断和转换:
2. MapStruct 简介
MapStruct 是一个强大的 Java 属性映射工具,专门解决对象与对象之间的数据转换问题。它通过注解驱动的方式,简化了字段映射、日期转换、表达式执行等复杂操作。
依赖管理
在 Maven 项目中引入 MapStruct 依赖:
1.2.0.Final org.mapstruct mapstruct-jdk8 ${mapstruct.version} org.mapstruct mapstruct-processor ${mapstruct.version}
3. MapStruct 的基本使用
3.1 定义映射接口
@Mapperpublic 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); Listdomain2dto(List people);}
3.2 映射实现
MapStruct 会自动生成实现类,放在 target/classes
目录下。例如,PersonConverterImpl
会自动实现 PersonConverter
接口。
3.3 单元测试
public class PersonConverterTest { @Test public void test() { Person person = new Person(1L, "zhige", "zhige.me@gmail.com", new Date(), new User(1)); PersonDTO personDTO = PersonConverter.INSTANCE.domain2dto(person); // Assert 相关操作... }}
4. MapStruct 的高级功能
4.1 多对一映射
@Mapperpublic interface ItemConverter { ItemConverter INSTANCE = Mappers.getMapper(ItemConverter.class); @Mappings({ @Mapping(source = "sku.id", target = "skuId"), @Mapping(source = "sku.code", target = "skuCode"), @Mapping(source = "sku.price", target = "skuPrice"), @Mapping(source = "item.id", target = "itemId"), @Mapping(source = "item.title", target = "itemName") }) SkuDTO domain2dto(Item item, Sku sku);}
4.2 自定义方法
@Mapperpublic interface PersonConverter { PersonConverter INSTANCE = Mappers.getMapper(PersonConverter.class); default PersonDTO personToPersonDTO(Person person) { // 自定义映射逻辑... } default Boolean convert2Bool(Integer value) { return value != null && value >= 1; } default Integer convert2Int(Boolean value) { return value != null ? value ? 1 : 0 : null; }}
4.3 Spring 集成
@Mapper(componentModel = "spring")public interface PersonConverter { // 映射逻辑类似于上述}
5. MapStruct 的注解关键词
- @Mapper:标记为 MapStruct 映射接口。
- @Mappings:配置多个字段映射。
- @MappingTarget:用于更新目标对象。
- @InheritConfiguration:继承已有配置。
- dateFormat:日期格式转换。
- expression:表达式转换。
通过以上内容,可以清晰地理解 MapStruct 的核心功能及其在实际项目中的应用。
发表评论
最新留言
不错!
[***.144.177.141]2025年03月29日 07时25分27秒
关于作者

喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
《小王子》里一些后知后觉的道理
2019-03-06
《你当像鸟飞往你的山》总结
2019-03-06
《我是猫》总结
2019-03-06
《抗糖化书》总结
2019-03-06
apache虚拟主机配置
2019-03-06
PHP官方网站及PHP手册
2019-03-06
mcrypt加密以及解密过程
2019-03-06
go等待N个线程完成操作总结
2019-03-06
ReactJs入门教程-精华版
2019-03-06
Python 之网络式编程
2019-03-06
MySql5.5安装步骤及MySql_Front视图配置
2019-03-06
Java内存模型(JMM)
2019-03-06
AQS相关
2019-03-06
WCF学习之旅—第三个示例之一(二十七)
2019-03-06
java ThreadPoolExecutor初探
2019-03-06
快速指数算法
2019-03-06
python去除字符串中的特殊字符(爬虫存储数据时会遇到不能作为文件名的字符串)
2019-03-06
SpringCloud微服务(03):Hystrix组件,实现服务熔断
2019-03-06