eclipse使用Java 实体映射工具 MapStruct

什么是MapStruct

http://mapstruct.org/

平时开发过程中难免会碰到传输对象与数据库实体类相互转换的情况,例如下面两个实例,SaveCustBaseInfIn是我接口接收的参数,UserCustBaseInf是数据库实体,代码截图如下(字段全小写是因为展示需要,请勿在意,如果两个类都是驼峰就不需要斜面mapping定义了)

SaveCustBaseInfIn.java

UserCustBaseInf.java

此时我们开发的时候可能会写下面这样的代码

很啰嗦,也很头疼而且不美观

我们再看下使用MapStruct插件后的代码

首先我们需要定义一个接口Converter,代码如下(举得一个例子,字段不要较真),如果转换对象与被转换对象属性名相同那么久不需要定义@Mapping,否则就像下图定义即可,此处只举一个转换的例字,还有其他的几种转换(例如转换集合之类的)可自行百度搜索或者查看我下方贴出的参考博客。

@Mapper
public interface CustBasicConverter {
	
	CustBasicConverter INSTANCE = Mappers.getMapper(CustBasicConverter.class);
	@Mappings({
		@Mapping(source = "custid", target = "custId"),
		@Mapping(source = "custname", target = "custName"),
		@Mapping(source = "idtype", target = "idType"),
		@Mapping(source = "idnum", target = "idNum"),
		@Mapping(source = "custproperty", target = "custProperty"),
		@Mapping(source = "custscope", target = "custScope"),
		@Mapping(source = "custtype", target = "custType"),
	})
	UserCustBaseInf domain2dto(SaveCustBaseInfIn in);
}

使用时只需要如下图

显然如果字段名称相同的话省去了绝大部分代码。实现原理是因为编译时MapStruct帮我们自动生成了这个接口的实体类,代码大致如下,路径一般在target下

注:字段没有全部对应是因为我为了方便展示随便截的

当然如果不用这样方式也有其他方式,例如https://blog.csdn.net/wuge507639721/article/details/80684402  这篇写的挺不错的。

但是有些会用到反射的不建议使用,影响效率。

关于MapStruct的效率问题,其实MapStruct就是帮你自动生成各种get/set只是不需要开发人员手动写而已,所以效率没问题(本人使用两种源生get/set和MapStruct各循环10000次执行多次发现耗时几乎没有区别)

可能会有误差(例如字段多少问题),但是总体误差不大

如何使用MapStruct

首先pom添加

<properties>
		<mapstruct.version>1.2.0.Final</mapstruct.version>
</properties>
        <dependency>
	      <groupId>org.mapstruct</groupId>
	      <artifactId>mapstruct-jdk8</artifactId>
	      <version>${mapstruct.version}</version>
		</dependency>
	    <dependency>
	      <groupId>org.mapstruct</groupId>
	      <artifactId>mapstruct-processor</artifactId>
	      <version>${mapstruct.version}</version>
	    </dependency>

eclipse的话需要可能会不能自动生成实现类。

首先eclipse需要版本比较新的M2E plug-in.我试过了在market里下载m2e-apt就可以了。 

pom.xml加上

<properties>
        <m2e.apt.activation>jdt_apt</m2e.apt.activation>
</properties>

详情解决方案详情可查看

https://blog.csdn.net/u014519194/article/details/54410391

http://mapstruct.org/documentation/1.1/reference/html/

至此就可以启动项目测试了,启动项目后查看target下是否有实现类。没用的话找下原因,有的话就可以正常测试使用了。

参考文档:

https://blog.csdn.net/zhige_me/article/details/80699784

https://blog.csdn.net/u014519194/article/details/54410391

http://mapstruct.org/documentation/1.1/reference/html/

发布了20 篇原创文章 · 获赞 58 · 访问量 6万+

猜你喜欢

转载自blog.csdn.net/zks_4826/article/details/95612733