1.概述
即在JavaBean到JavaBean之间进行递归数据复制,并且这些JavaBean可以是不同的复杂的类型。Dozer把对象中名称相同的属性进行复制,对于名称不相同或类型不一样,则可以在xml中进行定义。
其最大的优势在于对象中不同的名称之前只要配置了映射,就可以进行复制,减少大量使用get和set方法。而BeanUtils.copyProperties
只能复制对象中名称且类型相同的属性。
2.实战演练
2.1环境准备
新建一个SpringBoot的项目,导入需要的依赖
<dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> </dependency>
2.2引入dozer
1)导入依赖
<dependency> <groupId>com.github.dozermapper</groupId> <artifactId>dozer-spring-boot-starter</artifactId> <version>6.5.2</version> </dependency>
2)创建对象UserDto,作为源对象
@Data public class UserDto { private Integer userId; private String userName; private String address; private Integer age; private String birthday; }
3)创建对象UserEntity,作为目标对象
@Data public class UserEntity { private Integer id; private String name; private String addr; private Integer age; private Date birthday; }
4)创建dozer全局的配置文件
在资源目录下新建dozer目录,新建文件dozer-config.xml:
<?xml version="1.0" encoding="UTF-8"?> <mappings xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://dozermapper.github.io/schema/bean-mapping" xsi:schemaLocation="http://dozermapper.github.io/schema/bean-mapping http://dozermapper.github.io/schema/bean-mapping.xsd"> <!--全局配置--> <configuration> <date-format>yyyy-MM-dd</date-format> </configuration> </mappings>
5)创建对象映射文件。在dozer中新建user.dozer.xml:
<?xml version="1.0" encoding="UTF-8"?> <mappings xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://dozermapper.github.io/schema/bean-mapping" xsi:schemaLocation="http://dozermapper.github.io/schema/bean-mapping http://dozermapper.github.io/schema/bean-mapping.xsd"> <!--配置对象中属性的对应关系,相同的属性无需映射--> <mapping date-format="yyyy-MM-dd"> <class-a>com.zys.example.entity.UserEntity</class-a> <class-b>com.zys.example.entity.UserDto</class-b> <field> <a>id</a> <b>userId</b> </field> <field> <a>name</a> <b>userName</b> </field> <field> <a>addr</a> <b>address</b> </field> </mapping> </mappings>
6)新建接口UserController。由于需要Spring管理,直接使用controller进行测试:
package com.zys.example.controller; import com.github.dozermapper.core.Mapper; import com.zys.example.entity.UserDto; import com.zys.example.entity.UserEntity; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; @RestController @RequestMapping("/user") public class UserController1 { @Autowired private Mapper mapper; @GetMapping("/send") public UserEntity sendMsg(Integer id, String msg) { UserDto userDto = new UserDto(); userDto.setUserId(123); userDto.setUserName("admin"); userDto.setAddress("武汉"); userDto.setAge(20); userDto.setBirthday("2001-12-15"); UserEntity user = mapper.map(userDto, UserEntity.class); return user; } }
7)测试。启动项目,输入http://localhost:8080/user/send,即可看到返回的值,说明这两个对象转换成功。