# conversion-tool
**Repository Path**: li_sicheng/conversion-tool
## Basic Information
- **Project Name**: conversion-tool
- **Description**: 常用java类转换工具使用案例
- **Primary Language**: Unknown
- **License**: Not specified
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 0
- **Forks**: 0
- **Created**: 2021-06-17
- **Last Updated**: 2021-06-23
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
## MapStrut和Dozer的使用与区别
### *MapStrut*:apple:
***
##### 0. 准备
***
> 添加依赖
```xml
org.mapstruct
mapstruct
org.mapstruct
mapstruct-processor
```
> 实体对象
```java
public class User {
/**
* 用户ID
*/
private Long id;
/**
* 用户名称
*/
private String name;
/**
* 用户年龄
*/
private Integer age;
/**
* 用户性别
*/
private Integer sex;
/**
* 手机号码
*/
private String mobile;
/**
* 账号
*/
private String account;
/**
* 密码
*/
private String password;
/**
* 注册时间
*/
private LocalDateTime createTime;
// getter setter
}
```
```java
public class Order {
private Long id;
private BigDecimal price;
// getter setter
}
```
> 枚举
```java
public enum SexEnum {
/**
* 性别枚举
*/
MALE(1, "男"),
FEMALE(2, "女");
SexEnum(int code, String desc) {
this.code = code;
this.desc = desc;
}
private int code;
private String desc;
public static SexEnum getSexEnumByCode(int code) {
for (SexEnum sexEnum : SexEnum.values()) {
if (sexEnum.getCode() == code) {
return sexEnum;
}
}
return null;
}
// getter
}
```
> DTO
```java
public class UserDTO {
private Long id;
private String time;
// getter setter
}
```
> VO
```java
public class UserVO {
/**
* 用户ID
*/
private Long id;
/**
* 用户名称
*/
private String name;
/**
* 用户年龄
*/
private Integer age;
/**
* 手机号码
*/
private String mobile;
/**
* 注册时间
*/
private LocalDateTime registrationTime;
// getter setter
}
```
```java
public class AddSexUserVO {
/**
* 用户ID
*/
private Long id;
/**
* 用户名称
*/
private String name;
/**
* 用户年龄
*/
private Integer age;
/**
* 手机号码
*/
private String mobile;
/**
* 注册时间
*/
private LocalDateTime registrationTime;
/**
* 用户性别
*/
private SexEnum sex;
// getter setter
}
```
```java
public class OrderVO {
private Long id;
private String price;
// getter setter
}
```
##### 1. 基本使用
***
###### 1.1 构建方法
- 在转换接口使用`Mappers.getMapper()`获取实例对象
```java
BasicConvert INSTANCE = Mappers.getMapper(BasicConvert.class);
```
- 指定注解`componentModel`属性为spring,表示将类注入到spring容器中
```java
@Mapper(componentModel = "spring")
```
###### 1.2 基本使用
```java
// 构建方式1
@Mapper(componentModel = "spring",
// 导入类,后面会用到,这里先忽略
imports = {LocalDateTime.class, SexEnum.class})
public interface BasicConvert {
/**
* 构建方式2
*/
BasicConvert INSTANCE = Mappers.getMapper(BasicConvert.class);
/**
* 基本使用
*
* @param user 源对象
* @return 转换对象
*/
UserVO userToUserVO(User user);
}
```
> 编写测试代码:tada:
```java
@SpringBootTest
class BasicConvertTest {
@Resource
private BasicConvert basicConvert;
private final User user = new User(1L, "小明", 18, 1, "17673109969", "17673109969", "123456", LocalDateTime.now());
private final LocalDateTime localDateTime = LocalDateTime.of(1970, 1, 1, 0, 0, 0);
@Test
void example() {
UserVO userVO = null;
Assertions.assertNull(userVO);
// 构建方式1使用方式
// userVO = basicConvert.userToUserVO(user);
// 构建方式2使用方式
userVO = BasicConvert.INSTANCE.userToUserVO(user);
Assertions.assertNotNull(userVO);
Assertions.assertEquals(user.getMobile(), userVO.getMobile());
Assertions.assertEquals(user.getName(), userVO.getName());
System.out.println("Uer:" + JSON.toJSONString(user));
System.out.println("UserVO:" + JSON.toJSONString(userVO));
}
}
```
> 运行结果:shell:
```json
Uer:{"account":"17673109969","age":18,"createTime":"2021-06-17T10:47:30.005","id":1,"mobile":"17673109969","name":"小明","password":"123456","sex":1}
UserVO:{"age":18,"id":1,"mobile":"17673109969","name":"小明"}
```
###### 1.3 属性名不相同
```java
/**
* 属性名不相同
*
* @param user 源对象
* @return 转换对象
*/
@Mapping(source = "createTime", target = "registrationTime")
UserVO notFiledNameToUserVO(User user);
```
> 测试代码:taco:
```java
@Test
void notFiledNameToUserVOTest() {
UserVO userVO = basicConvert.notFiledNameToUserVO(user);
Assertions.assertEquals(userVO.getRegistrationTime(), user.getCreateTime());
System.out.println("Uer:" + JSON.toJSONString(user));
System.out.println("UserVO:" + JSON.toJSONString(userVO));
}
```
> 运行结果:rabbit:
```json
Uer:{"account":"17673109969","age":18,"createTime":"2021-06-17T10:56:32.344","id":1,"mobile":"17673109969","name":"小明","password":"123456","sex":1}
UserVO:{"age":18,"id":1,"mobile":"17673109969","name":"小明","registrationTime":"2021-06-17T10:56:32.344"}
```
###### 1.4 为属性设置常量值
```java
/**
* 为属性设置常量值
*
* @param user 源对象
* @return 创建对象
*/
@Mapping(target = "name", constant = "小红")
UserVO constant(User user);
```
> 测试代码:tophat:
```java
@Test
void constantTest() {
UserVO userVO = basicConvert.constant(user);
Assertions.assertNotNull(userVO);
Assertions.assertEquals("小红", userVO.getName());
System.out.println("Uer:" + JSON.toJSONString(user));
System.out.println("UserVO:" + JSON.toJSONString(userVO));
}
```
> 运行结果:rabbit2:
```java
Uer:{"account":"17673109969","age":18,"createTime":"2021-06-17T10:59:23.629","id":1,"mobile":"17673109969","name":"小明","password":"123456","sex":1}
UserVO:{"age":18,"id":1,"mobile":"17673109969","name":"小红"}
```
###### 1.5 忽略字段转换
```java
/**
* 忽略字段转换
*
* @param user 源对象
* @return 转换对象
*/
@Mappings({
@Mapping(target = "sex", ignore = true),
@Mapping(target = "id", ignore = true)
})
AddSexUserVO ignore(User user);
```
> 测试代码:tanabata_tree:
```java
@Test
void ignoreTest() {
AddSexUserVO userVO = basicConvert.ignore(user);
Assertions.assertNull(userVO.getSex());
Assertions.assertNull(userVO.getId());
System.out.println("Uer:" + JSON.toJSONString(user));
System.out.println("UserVO:" + JSON.toJSONString(userVO));
}
```
> 运行结果:racehorse:
```json
Uer:{"account":"17673109969","age":18,"createTime":"2021-06-17T11:01:58.314","id":1,"mobile":"17673109969","name":"小明","password":"123456","sex":1}
UserVO:{"age":18,"mobile":"17673109969","name":"小明"}
```
###### 1.6 设置默认值
```java
/**
* 原字段值为null,设置默认值
*
* @param user 源对象
* @return 转换对象
*/
@Mapping(target = "id", defaultValue = "1")
UserVO defaultValue(User user);
```
> 测试代码:tangerine:
```java
@Test
void defaultValueTest() {
User user = this.user;
user.setId(null);
UserVO userVO = basicConvert.defaultValue(user);
Assertions.assertNull(user.getId());
Assertions.assertEquals(userVO.getId(), 1L);
System.out.println("Uer:" + JSON.toJSONString(user));
System.out.println("UserVO:" + JSON.toJSONString(userVO));
}
```
> 运行结果:racing_car:
```json
Uer:{"account":"17673109969","age":18,"createTime":"2021-06-17T11:05:13.157","mobile":"17673109969","name":"小明","password":"123456","sex":1}
UserVO:{"age":18,"id":1,"mobile":"17673109969","name":"小明"}
```
###### 1.7 日期字段格式化
**mapstrut支持date,localdate/datetime/time 互相换行**
```java
/**
* 时间格式化为字符串
*
* @param dateTime localdatetime
* @return 转换对象
*/
@Mapping(target = "time", source = "dateTime", dateFormat = "yyyy-MM-dd")
UserDTO localDateTimeFormat(LocalDateTime dateTime);
/**
* 时间格式化为字符串
*
* @param dateTime date
* @return 转换对象
*/
@Mapping(target = "time", source = "dateTime", dateFormat = "yyyy-MM-dd")
UserDTO dateFormat(Date dateTime);
```
> 测试代码:taurus:
```java
@Test
void localDateTimeFormatTest() {
UserDTO userDTO = basicConvert.localDateTimeFormat(localDateTime);
Assertions.assertEquals(userDTO.getTime(), "1970-01-01");
System.out.println("Uer:" + JSON.toJSONString(user));
System.out.println("userDTO:" + JSON.toJSONString(userDTO));
}
@Test
void dateFormatTest() throws ParseException {
String dateTime = "2021-06-03";
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd");
Date date = simpleDateFormat.parse(dateTime);
UserDTO userDTO = basicConvert.dateFormat(date);
Assertions.assertEquals(userDTO.getTime(), dateTime);
System.out.println("Uer:" + JSON.toJSONString(user));
System.out.println("userDTO:" + JSON.toJSONString(userDTO));
}
```
> 运行结果:radio:
```java
Uer:{"account":"17673109969","age":18,"createTime":"2021-06-17T11:09:48.303","id":1,"mobile":"17673109969","name":"小明","password":"123456","sex":1}
userDTO:{"time":"1970-01-01"}
/* ------------------------------- */
Uer:{"account":"17673109969","age":18,"createTime":"2021-06-17T11:10:13.775","id":1,"mobile":"17673109969","name":"小明","password":"123456","sex":1}
userDTO:{"time":"2021-06-03"}
```
###### 1.8 数字格式化
```java
/**
* 将数字格式化
*
* @param order 源对象
* @return 转换对象
*/
@Mapping(target = "price", source = "price", numberFormat = "0.00")
OrderVO numberFormat(Order order);
```
数字格式化规则[参考](https://www.jianshu.com/p/b3699d73142e)
> 测试代码:taxi:
```java
@Test
void numberFormatTest() {
Order order = new Order(1L, new BigDecimal("3.14159265432"));
OrderVO orderVO = basicConvert.numberFormat(order);
Assertions.assertEquals(orderVO.getPrice(), "3.14");
System.out.println("order:" + JSON.toJSONString(order));
System.out.println("orderVO:" + JSON.toJSONString(orderVO));
}
```
> 运行结果:radio_button:
```json
order:{"id":1,"price":3.14159265432}orderVO:{"id":1,"price":"3.14"}
```
###### 1.9 多参数转换
```java
/**
* 多参数转换
*
* @param user 源对象
* @param registrationTime 注册时间
* @return 转换对象
*/
@Mapping(source = "registrationTime", target = "registrationTime")
UserVO doubleFiledToUserVO(User user, LocalDateTime registrationTime);
```
> 测试代码:tea:
```java
@Test
void doubleFiledToUserVOTest() {
UserVO userVO = basicConvert.doubleFiledToUserVO(user, localDateTime);
Assertions.assertEquals(userVO.getRegistrationTime(), localDateTime);
System.out.println("Uer:" + JSON.toJSONString(user));
System.out.println("UserVO:" + JSON.toJSONString(userVO));
}
```
> 运行结果:radioactive:
```java
Uer:{"account":"17673109969","age":18,"createTime":"2021-06-17T11:19:57.584","id":1,"mobile":"17673109969","name":"小明","password":"123456","sex":1}
UserVO:{"age":18,"id":1,"mobile":"17673109969","name":"小明","registrationTime":"1970-01-01T00:00:00"}
```
###### 1.10 更新对象
```java
/**
* 更新对象
*
* @param user 源对象
* @param userVO 被更新
*/
void updateUserVO(User user, @MappingTarget UserVO userVO);
```
> 测试代码:telephone:
```java
@Test
void updateUserVOTest() {
UserVO userVO = new UserVO();
userVO.setRegistrationTime(localDateTime);
basicConvert.updateUserVO(user, userVO);
Assertions.assertEquals(userVO.getRegistrationTime(), localDateTime);
Assertions.assertEquals(userVO.getMobile(), user.getMobile());
System.out.println("Uer:" + JSON.toJSONString(user));
System.out.println("UserVO:" + JSON.toJSONString(userVO));
}
```
> 运行结果:rage:
```json
Uer:{"account":"17673109969","age":18,"createTime":"2021-06-17T11:22:36.555","id":1,"mobile":"17673109969","name":"小明","password":"123456","sex":1}
UserVO:{"age":18,"id":1,"mobile":"17673109969","name":"小明","registrationTime":"1970-01-01T00:00:00"}
```
###### 1.11 自定义表达式转换
上面提到的暂时忽略的代码,在这里体现了。在表达式中用到的类需要在imports中导入(这里只用到了`SexEnum`)
```java
/**
* 自定义表达式转换
*
* 需要在@Mapper中加入 imports = {LocalDateTime.class, SexEnum.class}
*
* @param user 源对象
* @return 转换对象
*/
@Mapping(target = "sex", expression = "java(SexEnum.getSexEnumByCode(user.getSex()))")
AddSexUserVO customExpressionToAddSexUserVO(User user);
```
> 测试代码:telephone_receiver:
```java
@Test
void customExpressionToAddSexUserVOTest() {
AddSexUserVO addSexUserVO = basicConvert.customExpressionToAddSexUserVO(user);
Assertions.assertNotNull(addSexUserVO.getSex());
System.out.println("Uer:" + JSON.toJSONString(user));
System.out.println("AddSexUserVO:" + JSON.toJSONString(addSexUserVO));
}
```
> 运行结果:railway_car:
```json
Uer:{"account":"17673109969","age":18,"createTime":"2021-06-17T11:26:41.229","id":1,"mobile":"17673109969","name":"小明","password":"123456","sex":1}
AddSexUserVO:{"age":18,"id":1,"mobile":"17673109969","name":"小明","sex":"MALE"}
```
###### 1.12 自定义函数转换
```java
/**
* 自定义函数转换
* 1. 根据目标字段类型(也就是函数返回值)
* 2. 根据参数长度(等于1),类型(会做基本转换)
* 3. 匹配本类的自定义函数
*
* @param user 源对象
* @return 转换对象
*/
@Mapping(target = "sex", source = "sex")
AddSexUserVO customFunctionToAddSexUserVO(User user);
/**
* 构建性别枚举
*
* @param sex 性别code
* @return 性别枚举
*/
default SexEnum buildSexEnum(int sex) {
return SexEnum.getSexEnumByCode(sex);
}
```
> 测试代码:telescope:
```java
@Test
void customToAddSexUserVOTest() {
AddSexUserVO addSexUserVO = basicConvert.customFunctionToAddSexUserVO(user);
Assertions.assertNotNull(addSexUserVO.getSex());
System.out.println("Uer:" + JSON.toJSONString(user));
System.out.println("AddSexUserVO:" + JSON.toJSONString(addSexUserVO));
}
```
> 运行结果:railway_track:
```json
Uer:{"account":"17673109969","age":18,"createTime":"2021-06-17T11:30:58.501","id":1,"mobile":"17673109969","name":"小明","password":"123456","sex":1}
AddSexUserVO:{"age":18,"id":1,"mobile":"17673109969","name":"小明","sex":"MALE"}
```
基本使用完结撒花:yum:
##### 2. 进阶用法
***
###### 2.0 工具类准备
```java
@Component
@Named("ConvertUtil")
public class ConvertUtil {
private final DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
private final DateTimeFormatter dateFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");
private final DateTimeFormatter timeFormatter = DateTimeFormatter.ofPattern("HH:mm:ss");
@Named("toJsonStr")
public String toJsonStr(Object o) {
return JSONObject.toJSONString(o);
}
@Named("toTrim")
public String toTrim(String str) {
if (str == null) {
return null;
}
return str.trim();
}
@Named("toMap")
public Map toMap(Object o) {
if (o == null) {
return Collections.emptyMap();
}
return JSON.parseObject(JSON.toJSONString(o), new TypeReference