问题引入:
写代码过程中, 往往因为联表查询而多出字段, 导致需要新建Vo类来接收数据库返回的值. 这样就存在Vo和普通Entity实体类的转换.
下面用一个实例来说明:
步骤一: 封装工具类BaseTransfer
package com.myJava.transfer.base;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.BeanUtils;
import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;
import java.util.ArrayList;
import java.util.List;
/**
* entity和vo之间的转换
*/
@Slf4j
public class BaseTransfer<T, VO> {
private Class<T> clazzT;
private Class<VO> clazzVO;
public BaseTransfer() {
Type types = this.getClass().getGenericSuperclass();
Type[] genericType = ((ParameterizedType) types).getActualTypeArguments();
clazzT = (Class<T>) genericType[0];
clazzVO = (Class<VO>) genericType[1];
}
/**
* 转VO
*/
public VO toVO(T t) {
try {
VO vo = clazzVO.newInstance();
//spring内置的工具类 转换entity 和vo BeanUtils.copyProperties(t, vo);
BeanUtils.copyProperties(t, vo);
return vo;
} catch (Exception e) {
log.error("toVO转换错误", t);
}
return null;
}
/**
* 转T
*/
public T toEntity(VO vo) {
try {
T t = clazzT.newInstance();
BeanUtils.copyProperties(vo, t);
return t;
} catch (Exception e) {
log.error("toEntity转换错误", vo);
}
return null;
}
/**
* 转VO
*/
public List<VO> toVO(List<T> list) {
List<VO> list1 = new ArrayList<>();
list.forEach(t -> list1.add(toVO(t)));
return list1;
}
/**
* 转Entity
*/
public List<T> toEntity(List<VO> list) {
List<T> list1 = new ArrayList<>();
list.forEach(vo -> list1.add(toEntity(vo)));
return list1;
}
}
步骤二: 具体的业务AdminTransfer, 继承BaseTransfer
Admin和AdminVo的区别在于, AdminVo多了成员变量sex和deptName, sex由Admin中gender判断得出, deptName需要从dept表中查询得知. 下面只增加了一个方法演示. 可以根据实际需要, 补充更多方法.
package com.myJava.transfer;
import com.myJava.domin.entity.Admin;
import com.myJava.domin.entity.Dept;
import com.myJava.domin.vo.AdminVo;
import com.myJava.mapper.DeptMapper;
import com.myJava.transfer.base.BaseTransfer;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Component;
import java.util.List;
@Component
@RequiredArgsConstructor
public class AdminTransfer extends BaseTransfer<Admin, AdminVo> {
private final DeptMapper deptMapper;
public List<AdminVo> setSexAndDept(List<Admin> list) {
//先转换成vo对象
List<AdminVo> adminVoList = super.toVO(list);
//遍历vo对象
for (int i = 0; i < adminVoList.size(); i++) {
//拿到entity对象
Admin admin = list.get(i);
//非空判断
if (!StringUtils.isEmpty(admin)) {
//对adminvo中的性别进行赋值
if (admin.getGender() == 0) {
adminVoList.get(i).setSex("男");
} else if (admin.getGender() == 1) {
adminVoList.get(i).setSex("女");
} else {
adminVoList.get(i).setSex("未知");
}
}
//拿到admin对象中的dept中的id
Dept dept = deptMapper.selectById(admin.getDeptId());
AdminVo adminVo = adminVoList.get(i);
//判断是否非空 并给部门名称进行赋值
adminVo.setDeptName(dept == null ? "" : dept.getDeptName());
}
return adminVoList;
}
}
步骤三: 测试
这样就得到设置好性别和部门名称的AdminVo集合了.
@Test
void testtt(){
List<Admin> adminList = adminService.selectList();
List<AdminVo> adminVoList = adminTransfer.setSexAndDept(adminList);
adminVoList.forEach(adminVo -> {
System.out.println(adminVo.toString());
});
}