在日常项目开发中,需要将数据访问层的Entity转化为数据传输层的DTO,或者将数据传输层的DTO转化为前端的ViewModel,而手写转换方法很烦,而且随着结构的增加,类的增加,代码量会比较大且不利于更新维护,因此需要一款能够自动映射工具帮我们实现这些工作。
我们对映射工具也有如下要求:
转化效率必须高:显然,查询数据只需要0.001毫秒但是映射花费1秒这是我们不能接受的;
配置必须简单甚至无需配置或者自动配置:每次映射都需要进行复杂的配置无异于手动映射让人烦躁;
解决循环引用问题:尤其是数据访问层,由于数据库表之间的关系,我们的Entity会有很多一对一,一对多,多对多的导航属性,类型之间的互相引用必不可少,传统的映射工具无法自动解决该问题,要么进入死循环要么映射效率低下;
该款工具有如下特色:
无需配置:
var user = TestHelper.创建扁平化User(); var newuser = user.RobotMap<User, DTO.User>(); Assert.AreEqual(user.Code, newuser.Code); Assert.AreEqual(user.Id, newuser.Id); Assert.AreEqual(user.Department, newuser.Department); Assert.AreEqual(user.Name, newuser.Name);
解决循环引用
创建一个循环引用User
public static User 创建循环引用User() { Entity.User user = new User() { Code = "Liuhai", Id = "hai.liu", Department = "部门1", Name = "海哥", }; user.Roles.Add(new Role() { Name = "角色1", Users = new List<User>() { new User() { Name = "SB" } } }); return user; }
仍然是自动映射
var user = TestHelper.创建循环引用User(); var newuser = user.RobotMap<User, DTO.User>(); Assert.AreEqual(user.Code, newuser.Code); Assert.AreEqual(user.Id, newuser.Id); Assert.AreEqual(user.Department, newuser.Department); Assert.AreEqual(user.Name, newuser.Name); Assert.IsTrue(newuser.Roles.Count == 1);
支持自定义映射配置:
[TestMethod] public void 测试配置Bind() { Mapper.Initialize(creator => { creator.CreatMap<User, DTO.User>(config => { config.Bind(x => x.User12.Name, y => y.UserName); config.Ignore(y => y.Roles); }); }); }
支持忽略属性:
[TestMethod] public void 测试忽略规则转换() { Mapper.Initialize(creator => { creator.CreatMap<User, DTO.User>(config => { config.Ignore(y => y.Code); config.Ignore("Department", "Name"); }); }); var user = TestHelper.创建扁平化User(); var newuser = user.RobotMap<User, DTO.User>(); Assert.IsNull(newuser.Code); Assert.IsNull(newuser.Department); Assert.IsNull(newuser.Name); }
我有一个对象带有字段
问题内容: 是否有Java等效于.Net的Automapper? 问题答案: 检出推土机项目。 推土机支持简单的属性映射,复杂的类型映射,双向映射,隐式-显式映射以及递归映射。 它利用BeanUtils并对其进行扩展。
我正在使用下面的代码片段映射对象 它没有映射,但当我添加这个时,它工作得很好 但却无法理解它的功能<代码>导入={Instant.class,DateTimeFormatter.class}它如何帮助映射对象?
MapStruct文档对为NullValueMappingStrategy选择的合理默认值有如下说明。返回默认值: Bean映射:将返回一个“空”的目标Bean,除了常量和表达式之外,它们将在出现时填充。 基本体:将返回基本体的默认值,例如,布尔值为false,int值为0。 迭代器/数组:将返回一个空的迭代器。 地图:将返回一个空地图。 问题是,我们希望能够在@Mapper级别上指定,例如,It
本文向大家介绍Mybatis中Mapper映射文件使用详解,包括了Mybatis中Mapper映射文件使用详解的使用技巧和注意事项,需要的朋友参考一下 紧接上文所述,在这篇文章中我将对Mapper映射文件进行详细的说明。 Mapper映射文件是一个xml格式文件,必须遵循相应的dtd文件规范,如ibatis-3-mapper.dtd。我们先大体上看看支持哪些配置?如下所示,从Eclipse里截了个
我正在尝试使用@ManyToOne和@OneToMany映射实体表。映射列位于名为“internal_plan_id”的子表中。根据要求,我不能更改名称。下面是两个实体表:父表 儿童桌: 我得到错误为:错误:关系“financial_plan_subplan”的列“internal_plan_id_internal_plan_id”不存在。 financial_subplan中用于映射的现有列名是