MapStruct使用
来源:互联网 发布:网络教育 会计 上海 编辑:程序博客网 时间:2024/06/11 19:32
MapStruct介绍:在一个成熟可维护的工程中,细分模块后,domian工程最好不要被其他工程依赖,但是实体类一般存于domain之中,这样其他工程想获取实体类数据时就需要在各自工程写model,自定义model可以根据自身业务需要而并不需要映射整个实体属性。
mapstruct这个插件就是用来处理domin实体类与model类的属性映射,定义mapper接口,mapstruct就会自动的帮我们实现这个映射接口,避免了麻烦复杂的映射实现。
Github地址:https://github.com/mapstruct/mapstruct/
使用例子:https://github.com/mapstruct/mapstruct-examples
MapStrcut与其它工具对比以及使用说明:http://www.tuicool.com/articles/uiIRjai
pom文件读者自己查一下吧
如何使用(重点)
Mapper基本类:BasicObjectMapper,BasicObjectMapper包含了4个基本方法,单个和集合以及反转的单个和集合。
开发中如需要对象转换操作可直接新建interface并继承BasicObjectMapper,并在新建的接口上加上 @Mapper(componentModel = “spring”),
如果是属性中包含其它类以及该类已经存在Mapper则注解中加上 users = {类名.class},具体如何使用以及其他各种用法在此不再赘述(本文的重点是看标题,看标题,看标题),google不行可以找度娘,
componentModel = “spring”该配置表示生成的实现类默认加上spring @Component注解,使用时可直接通过@Autowire进行注入,
//// Source code recreated from a .class file by IntelliJ IDEA// (powered by Fernflower decompiler)//package com.ampmind.framework.map;import java.util.List;import org.mapstruct.InheritConfiguration;import org.mapstruct.InheritInverseConfiguration;import org.mapstruct.Mappings;public interface BasicObjectMapper<SOURCE, TARGET> { @Mappings({}) @InheritConfiguration TARGET to(SOURCE var1); @InheritConfiguration List<TARGET> to(List<SOURCE> var1); @InheritInverseConfiguration SOURCE from(TARGET var1); @InheritInverseConfiguration List<SOURCE> from(List<TARGET> var1);}
下面是两个不同的例子:
先贴一下两个Model类
package com.ampmind.service.skumng.domain;public class ProductCategory { /** * 类别编码 */ private String categoryCode; /** * 类别名称 */ private String categoryName; public String getCategoryCode() { return categoryCode; } public void setCategoryCode(String categoryCode) { this.categoryCode = categoryCode; } public String getCategoryName() { return categoryName; } public void setCategoryName(String categoryName) { this.categoryName = categoryName; }}
CategoryVo
package com.ampmind.service.api.protocol.vo;public class ProductCategory { private String code; private String name; public Integer getParentId() { return parentId; } public void setParentId(Integer parentId) { this.parentId = parentId; } public String getCode() { return code; } public void setCode(String code) { this.code = code; } public String getName() { return name; } public void setName(String name) { this.name = name; }}
1.如何与Spring配合
CategoryMapper
package com.ampmind.service.skumng.api.mapper;import com.ampmind.framework.api.base.BasicObjectMapper;import com.ampmind.service.api.protocol.vo.CategoryVo;import com.ampmind.service.domain.ProductCategory;import org.mapstruct.Mapper;import org.mapstruct.Mapping;import org.mapstruct.Mappings;/** * */@Mapper(componentModel = "spring")public interface CategoryMapper extends BasicObjectMapper<CategoryVo, ProductCategory> { @Mappings({ @Mapping(source = "code", target = "categoryCode"), @Mapping(source = "name", target = "categoryName") }) ProductCategory to(CategoryVo source);}
上面重写了to方法,注意如果属性名一样可以不用重写。保持接口空的就行,有不一样的需要重写to方法,并在方法上加上 @Mappings注解和子注解
spring注入并使用
@Componentpublic class Test { @Autowired private CategoryMapper categoryMapper; public void test() { CategoryVo vo = new CategoryVo; vo.setCategoryCode("0000"); vo.setCategoryName("属性名称"); ProductCategory pc = categoryMapper.to(vo);// 通过to方法得到 ProductCategory CategoryVo vo1 = categoryMapper.form(pc);// 通过from方法得到CategoryVo,既反转to方法。 List<ProductCategory> pcList = categoryMapper.to(Arrays.asList(vo, vo1));// 通过to方法从集合得到转换后的集合 List<CategoryVo> voList = categoryMapper.from(pcList); // 反转集合 }}
2.如何直接使用
CategoryMapper
package com.ampmind.service.skumng.api.mapper;import com.ampmind.framework.api.base.BasicObjectMapper;import com.ampmind.service.skumng.api.protocol.vo.CategoryVo;import com.ampmind.service.skumng.domain.ProductCategory;import org.mapstruct.Mapper;import org.mapstruct.Mapping;import org.mapstruct.Mappings;import org.mapstruct.factory.Mappers;/** * */@Mapperpublic interface CategoryMapper extends BasicObjectMapper<CategoryVo, ProductCategory> { CategoryMapper MAPPER = Mappers.getMapper(CategoryMapper.class); @Mappings({ @Mapping(source = "code", target = "categoryCode"), @Mapping(source = "name", target = "categoryName") }) ProductCategory to(CategoryVo source);}
直接可以通过main方法进行测试
public class Test { public static void main(String[] args) { CategoryVo vo = new CategoryVo; vo.setCategoryCode("0000"); vo.setCategoryName("属性名称"); ProductCategory pc = CategoryMapper.MAPPER.to(vo);// 通过to方法得到 ProductCategory CategoryVo vo1 = CategoryMapper.MAPPER.form(pc);// 通过from方法得到CategoryVo,既反转to方法。 List<ProductCategory> pcList = CategoryMapper.MAPPER.to(Arrays.asList(vo, vo1));// 通过to方法从集合得到转换后的集合 List<CategoryVo> voList = CategoryMapper.MAPPER.from(pcList); // 反转集合 }}
- MapStruct使用
- Mapstruct的简单配置使用
- 使用MapStruct处理javabean之间的转换
- 使用Mapstruct来进行PO与VO之间的映射
- Mapstruct使用问题Couldn't retrieve @Mapper annotation
- MapStruct处理Java中枚举Enum类型使用与举例
- MapStruct处理Java实体的高级进阶使用
- 使用Mapstruct来进行实体与模型之间的映射操作
- MapStruct实体间转换
- 使用Mapstruct来进行domain实体与Entity模型之间的映射操作,减少类之间代码转化
- MapStruct 代替BeanUtil 和ModelMapper
- MapStruct 代替BeanUtil 和ModelMapper
- Mapstruct简介和简单例子
- 对象属性值copy-Mapstruct
- 关于mapstruct转换list的问题
- MapStruct实体间转换快速入门
- mapstruct在eclipse生成不了mapper的实现类的问题
- MapStruct处理Java中实体与模型间不匹配属性转换
- 关于Springmvc的参数传递方法
- logback配置详解(含示例源码)
- unity vr抓取 触碰高亮及颜色变换
- c++关于局域网,路由器。
- 【疑难杂症】C# ajax get请求不到Api方法数据
- MapStruct使用
- Ubuntu虚拟机 与 windows主机共享文件夹
- nginx lua
- 在Spring中配置Shiro
- Java多线程系列--“JUC线程池”01之 线程池架构
- 趣图:和离职程序员做工作交接
- 在O(1)时间复杂度删除链表节点 -LintCode
- 清华竟然不敌上交大!全球高校计算机专业排名出炉
- react-native 极光推送android篇