Java实体映射工具MapStruct使用详解

这篇具有很好参考价值的文章主要介绍了Java实体映射工具MapStruct使用详解。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1.序

通常在后端开发中经常不直接返回实体Entity类,经过处理转换返回前端,前端提交过来的对象也需要经过转换Entity实体才做存储;通常使用的BeanUtils.copyProperties方法也比较粗暴,不仅效率低下(使用反射)而且仅映射相同名的属性,多数情况下还需要手动编写对应的转换方法实现。
插件MapStruct以接口方法结合注解优雅实现对象转换,MapStruct生成器生成代码以更贴近原生的Setter、Getter方法处理属性映射更为高效。

2.简单用例

实体对象User

@Data
@AllArgsConstructor
public class User {
    private int id;
    private String name;
    private int age;
    private String address;
}

转换对象UserVO

@Data
public class UserVO {
    private String userName;
    private int age;
}

转换接口

@Mapper
public interface UserConvert {
    UserConvert INSTANCE = Mappers.getMapper(UserConvert.class);
    @Mapping(source = "name", target = "userName")
    UserVO toVO(User entity);
}

使用示例

@Test
public void contextLoads() {
    User user = new User(0, "Tester", 1, "上海市徐汇区");
    UserVO userVO = UserConvert.INSTANCE.toVO(user);
}

3.使用详解

1)关于接口注解@Mapper几种属性用法详解

uses 使用其他手动编写的或者其他Mapper接口覆写相关的转换方法,不能循环引用

@Mapper(uses=DateMapper.class)

imports 引用相关类,允许通过mapping.expression()mapping.defaultExpression()直接使用这些类型

@Mapper(imports = DateUtil.class)
public interface UserConvert {
    UserConvert INSTANCE = Mappers.getMapper(UserConvert.class);
    @Mappings({
            @Mapping(source = "name", target = "userName"),
            // 以指定方法转换属性,这里如果不使用imports,则需要写全引用类包路径
            @Mapping(target = "birthday", expression = "java(DateUtil.formatDate(entity.getBirthday()))")
    })
    UserVO toVO(User entity);
}

unmappedSourcePolicyunmappedTargetPolicy 针对源类型/目标类型中未映射属性的反馈策略
typeConversionPolicy 针对有损转换的反馈策略,例如Long转Integer
反馈策略主要有三种:IGNORE,默认值,忽略未映射的字段。WARN,警告。ERROR,报错

@Mapper(unmappedSourcePolicy = ReportingPolicy.ERROR)

componentModel 指定生成映射器实例的模式,主要有四种:
default,不主动生成实例,通常以Mappers.getMapper(Class)实例化。
cdi,以CDI标准实例化映射器,使用@Inject注入相关实例,
spring,Spring Bean方式实例化,
jsr330,jsr330标准实例化

@Mapper(componentModel = "spring")
public interface UserConvert {
    @Mapping(source = "name", target = "userName")
    UserVO toVO(User entity);
}
@Autowired
private UserConvert userConvert;

implementationName 指定实现类名称,映射生成器接口会自动生成实现类<CLASS_NAME>Impl,使用此属性可避免类冲突
implementationPackage 指定实现类包路径

config 指定配置类,由指定的@MapperConfig配置类,config导入相关配置
配置类

@MapperConfig(
        uses = DateUtil.class,
        unmappedSourcePolicy = ReportingPolicy.WARN
)
public interface UserConfig {
}

导入配置类

@Mapper(componentModel = "spring", config = UserConfig.class)

collectionMappingStrategy 集合映射策略,这里注意集合映射时,如果集合中的类型已有对应转换方法,集合转换时会优先使用

@Mappings({
        @Mapping(source = "name", target = "userName"),
        @Mapping(target = "birthday", expression = "java(DateUtil.formatDate(entity.getBirthday()))")
})
UserVO toVO(User entity);
List<UserVO> collectionCvt(List<User> entities);

GENERATED CODE 生成器生成代码

public List<UserVO> collectionCvt(List<User> entities) {
    if (entities == null) {
        return null;
    } else {
        List<UserVO> list = new ArrayList(entities.size());
        Iterator var3 = entities.iterator();

        while(var3.hasNext()) {
            User user = (User)var3.next();
            // 集合转换时优先使用了已定义的toVO方法
            list.add(this.toVO(user));
        }

        return list;
    }
}

nullValueMappingStrategy null作为源值映射策略;RETURN_NULL默认返回null, RETURN_DEFAULT返回默认值,对于对象会通过构造器自动构造对象返回,集合会返回空集合

当值为RETURN_DEFAULT时,如果映射规则中包含Mapping.expression、Mapping.constant必须手动判空处理,否则NPE

@MapperConfig(nullValueMappingStrategy = NullValueMappingStrategy.RETURN_DEFAULT)

NullValuePropertyMappingStrategy null作为源属性映射策略;SET_TO_NULL默认返回null,SET_TO_DEFAULT返回默认值,IGNORE 忽略该值,以目标对象已存在的值为准

MappingInheritanceStrategy 继承方法级映射配置策略:EXPLICIT 显示使用InheritConfiguration生效。AUTO_INHERIT_FROM_CONFIG 自动继承正向转换的配置。AUTO_INHERIT_REVERSE_FROM_CONFIG 自动继承反向转换的配置。AUTO_INHERIT_ALL_FROM_CONFIG 都继承

@MapperConfig(
        mappingInheritanceStrategy = MappingInheritanceStrategy.EXPLICIT
)
@InheritConfiguration
void cvtVO(User entity, @MappingTarget UserVO vo);

nullValueCheckStrategy 空值监测策略

2) 其他方法级别注解

@InheritInverseConfiguration 反向转换时继承映射规则

@Mapping 配置类型属性的映射规则;
dateFormat 格式化日期

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

numberFormat 数字格式化

@Mapping(target = "price", numberFormat = "$#.00")

constant 常量文章来源地址https://www.toymoban.com/news/detail-444823.html

@Mapping(target = "age", constant = "0")

到了这里,关于Java实体映射工具MapStruct使用详解的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Java中使用MapStruct实现对象转换时使用@Mapping的expression表达式实现自定义转换规则(多对一、获取当前Date)

    Java中使用MapStruct实现对象转换/实体属性赋值/Bean属性映射,避免大量setter和getter: Java中使用MapStruct实现对象转换/实体属性赋值/Bean属性映射,避免大量setter和getter_霸道流氓气质的博客-CSDN博客 上面介绍了mapstruct的简单使用,某些场景下需要自定义转换规则,比如记录时间字

    2024年02月14日
    浏览(28)
  • 从 JSON 转 Java 实体的多种方法详解

    将 JSON 数据转换为 Java 对象是现代应用程序开发中常见的任务。在 Java 中,有多种方法可以实现这一目标。本文将详细介绍几种常见的方法,以及它们的优缺点。 1. 手动映射(Manual Mapping) 手动映射是最基础的方法之一,通过使用原生的 Java 核心库或第三方库手动将 JSON 字段

    2024年02月05日
    浏览(30)
  • JVM之jmap java内存映射工具

    jdk安装后会自带一些小工具, jmap 命令( Memory Map for Java )是其中之一。主要用于打印指定Java进程(或核 心文件、远程调试服务器)的共享对象内存映射或堆内存细节。 jmap命令可以获得运行中的jvm的堆的快照,从而可以离线分析堆,以检查内存泄漏,检查一些严重影响性能的 大

    2024年02月04日
    浏览(36)
  • ES简单教程(一)创建ES映射实体对象,即索引

    声明 :本教程可能并不完善,没有一个总览的规划,各个模块都相对独立,做到哪写到哪,仅供参考,共同学习。 ES的Java映射实体类主要与ES的索引匹配,跟传统的数据库稍微有点区别:ES的索引就相当于是表,ES的文档就相当于表里的每一条数据,大致可以这么理解作为上

    2024年02月12日
    浏览(28)
  • 【MyBatis】1、MyBatis 核心配置文件、多表查询、实体映射文件 ......

    SSM( S pring、 S pringMVC、 M yBatis) Apache Shiro SpringBoot 事务 :若将 N 个 数据库操作 (CRUD)放到同一个事务中,则这 N 个数据库操作最终要么全都生效,要么全都不生效 🍀 开启事务【 START TRANSACTION 】 🍀 回滚事务:若事务中的某个数据库操作失败,其他所有数据库操作都需要

    2024年02月08日
    浏览(65)
  • IDEA好用插件:MybatisX快速生成接口实体类mapper.xml映射文件

    目录  1、在Idea中找到下载插件,Install,重启Idea  2、一个测试java文件,里面有com包  3、在Idea中添加数据库 --------以Oracle数据库为例  4、快速生成entity-service-mapper方法  5、查看生成的代码  6、自动生成(增删查改)在TestMapper中快速编写代码 1、在Idea中找到下载插件,Ins

    2024年02月02日
    浏览(42)
  • 测试开发-后端开发do实体类创建

    创建user表实体类 新增do目录下创建user_entity.py和init.py 在do的init.py文件写入create_all()方法来初始化创建表 执行创建表 查看数据库中是否创建成功 user表以及字段创建成功啦,以此类推所有的实体类一次性写好一起创建

    2024年02月11日
    浏览(28)
  • c#后端获实体类多列最大值

            过去一直都是用的循环对比,没有进行归纳,或者就是最笨的办法 那怎么写会更简单便捷呢?而不是每次使用这个实体,我们都要进行循环比较呢? 好吧,直接贴图吧~~~ 看不懂的记得补课。

    2024年02月12日
    浏览(23)
  • [学习笔记]解决因C#8.0的语言特性导致EFCore实体类型映射的错误

    今天下午在排查一个EF问题时,遇到了个很隐蔽的坑,特此记录。 使用ef执行Insert对象到某表时报错,此对象的Address为空: 检查数据库和迁移文件时发现Address这个字段被意外设置成 nullable: false ,而其它的字段却正常,按理来说对于string类型的属性,EFCore在codefirst模式下应该

    2024年02月05日
    浏览(25)
  • Mapstruct的具体介绍与使用

    我是 ABin-阿斌:写一生代码,创一世佳话,筑一览芳华。 如果小伙伴们觉得我的文章不错,记得一键三连哦 mapstruct是一种 实体类 映射框架,能够通过Java注解将一个实体类的属性安全地赋值给另一个实体类。有了mapstruct,只需要定义一个映射器接口,声明需要映射的方法,

    2024年02月16日
    浏览(20)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包