简介
Dozer是一款javaBean的映射工具,用于解决一个类到另外一个类的自动适配功能,它即支持简单的映射,也支持复杂类型的双向递归映射(官网)。
示例
举个例子,假设说我们现在有User(用户)、UserDetail(用户详细)两个实体类,但对外公布时,我们发布了UserDto、UserSimpleDto两个传输对象,现在我们来实现他们之间的相互转化:
用户:记录登录名、密码
1 /** 2 * @author X 3 */ 4 public class User { 5 6 private String loginName; //登录名 7 private String password; //登录密码 8 private UserDetail userDetail; //用户详细 9 10 public String getLoginName() { 11 return loginName; 12 } 13 14 public void setLoginName(String loginName) { 15 this.loginName = loginName; 16 } 17 18 public String getPassword() { 19 return password; 20 } 21 22 public void setPassword(String password) { 23 this.password = password; 24 } 25 26 public UserDetail getUserDetail() { 27 return userDetail; 28 } 29 30 public void setUserDetail(UserDetail userDetail) { 31 this.userDetail = userDetail; 32 } 33 }
User.java
用户详情:记录用户的手机
1 /** 2 * @author X 3 */ 4 public class UserDetail { 5 6 private String phoneNumber; //手机号 7 8 public String getPhoneNumber() { 9 return phoneNumber; 10 } 11 12 public void setPhoneNumber(String phoneNumber) { 13 this.phoneNumber = phoneNumber; 14 } 15 }
UserDetail.java
用户传输对象:记录了用户的登录名、用户的手机
1 /** 2 * @author X 3 */ 4 public class UserDto { 5 6 private String userName; //用户名 7 private String userPhone; //用户手机 8 9 public String getUserName() { 10 return userName; 11 } 12 13 public void setUserName(String userName) { 14 this.userName = userName; 15 } 16 17 public String getUserPhone() { 18 return userPhone; 19 } 20 21 public void setUserPhone(String userPhone) { 22 this.userPhone = userPhone; 23 } 24 }
UserDto.java
用户简单传输对象:记录了用户的登录名
1 /** 2 * @author X 3 */ 4 public class UserSimpleDto { 5 private String loginName; //登录名 6 7 public String getLoginName() { 8 return loginName; 9 } 10 11 public void setLoginName(String loginName) { 12 this.loginName = loginName; 13 } 14 }
UserSimpleDto.java
User->UserSimpleDto
这个很简单,因为值相同,无需多余的配置,代码如下:
import org.dozer.DozerBeanMapper; import org.dozer.Mapper; /** * @author X */ public class Run { public static void main(String[] args) { //给目标对象赋值 User user = new User(); user.setLoginName("shaguar"); user.setPassword("123456"); //转换 Mapper mapper = new DozerBeanMapper(); UserSimpleDto dto = mapper.map(user, UserSimpleDto.class); System.out.println(dto.getLoginName()); } }
Run.java
运行结果:
User->UserDto
这个相对来说就复杂一些,因为UserDto中不仅包含了User的name,也涉及到了UserDetail中的PhoneNumber,那就需要我们手动配置来解决Map的问题。
第一种:添加多个配置文件
映射配置
1 <?xml version="1.0" encoding="UTF-8"?> 2 <mappings xmlns="http://dozer.sourceforge.net" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 3 xsi:schemaLocation="http://dozer.sourceforge.net 4 http://dozer.sourceforge.net/schema/beanmapping.xsd"> 5 <mapping> 6 <class-a>User</class-a> 7 <class-b>UserDto</class-b> 8 <field> 9 <a>UserDetail.phoneNumber</a> 10 <b>userPhone</b> 11 </field> 12 <field> 13 <a>loginName</a> 14 <b>userName</b> 15 </field> 16 </mapping> 17 </mappings>
UserToUserDetailConfig.xml
调用方式(只需要在映射之前先设置好配置文件即可。)
1 import org.dozer.DozerBeanMapper; 2 import org.dozer.Mapper; 3 4 import java.util.ArrayList; 5 import java.util.List; 6 7 /** 8 * @author X 9 */ 10 public class Run { 11 public static void main(String[] args) { 12 //给目标对象赋值 13 User user = new User(); 14 user.setLoginName("shaguar"); 15 user.setPassword("123456"); 16 UserDetail userDetail = new UserDetail(); 17 userDetail.setPhoneNumber("1881234567890"); 18 user.setUserDetail(userDetail); 19 20 List mappingFile = new ArrayList(); 21 mappingFile.add("UserToUserDtoConfig.xml"); 22 DozerBeanMapper mapper = new DozerBeanMapper(); 23 mapper.setMappingFiles(mappingFile); 24 UserDto dto = mapper.map(user, UserDto.class); 25 System.out.println(dto.getUserName()); 26 System.out.println(dto.getUserPhone()); 27 28 } 29 }
Run.java
第二种:添加默认配置文件(多个Mapping)
当然,你如果不想每次都load一个配置文件,也可以按照dozer的约定,写入命名为dozerBeanMapping.xml的配置中,并将其放入根目录下,这样使用如下方式去创建dozer的Mapper即可:
1 import org.dozer.DozerBeanMapper; 2 import org.dozer.DozerBeanMapperSingletonWrapper; 3 import org.dozer.Mapper; 4 5 import java.util.ArrayList; 6 import java.util.List; 7 8 /** 9 * @author X 10 */ 11 public class Run { 12 public static void main(String[] args) { 13 //给目标对象赋值 14 User user = new User(); 15 user.setLoginName("shaguar"); 16 user.setPassword("123456"); 17 UserDetail userDetail = new UserDetail(); 18 userDetail.setPhoneNumber("1881234567890"); 19 user.setUserDetail(userDetail); 20 21 Mapper mapper= DozerBeanMapperSingletonWrapper.getInstance(); 22 UserDto dto = mapper.map(user, UserDto.class); 23 System.out.println(dto.getUserName()); 24 System.out.println(dto.getUserPhone()); 25 } 26 }
Run.java
两种方式均可以得到如下结果:
同spring集成
且容我研究一番(未完待续……)
时间: 2024-10-10 11:32:52