阿里巴巴规范值得所有软件工程师参考 如不使用枚举 命名规范等
个人理解
DTO(Data Transfer Object) 数据传输对象 性别为0 1
VO(View Object) 显示层对象 性别为男 女
Query 数据查询对象 查询参数 性别为0 1 禁止使用Map
- 前端查询(Query) -> controller(把Query转为DTO) -> service(把DTO转为DO) -> dao查询DO
- dao查询DO -> service(把DO转为DTO) -> controller(把DTO转为VO) -> 返回前端
话不多说 如下为常用的几种实体转化工具及性能对比 更多细节&完整源码点击此处
操作类型 | 调用100万次 | 描述 |
---|---|---|
get/set | 18ms | 手动调用 |
BeanCopiers | 10ms | 修改字节码 |
BeanUtils | 2020ms | 反射 |
Dozer | 17729ms | 反射 |
PropertyUtils | 23715ms | 反射 |
@SpringBootTest(classes = DozerApplication.class)
public class ConvertTest {
@Test
public void test() throws IllegalAccessException, NoSuchMethodException, InvocationTargetException {
BeanCopier beanCopier = BeanCopier.create(User.class, UserDTO.class, false);
Mapper mapper = DozerBeanMapperBuilder.buildDefault();
User user = new User() {{
setUserName("李磊");
setPassword("密码");
}};
long number = 1000_1000;
long begin = System.currentTimeMillis();
for (long i = 0L; i < number; i++) {
UserDTO userDTO = new UserDTO();
userDTO.setUserName(user.getUserName());
userDTO.setPassword(user.getPassword());
}
System.out.println(System.currentTimeMillis() - begin);
begin = System.currentTimeMillis();
for (long i = 0L; i < number; i++) {
beanCopier.copy(user, new UserDTO(), null);
}
System.out.println(System.currentTimeMillis() - begin);
begin = System.currentTimeMillis();
for (long i = 0L; i < number; i++) {
BeanUtils.copyProperties(user, new UserDTO());
}
System.out.println(System.currentTimeMillis() - begin);
begin = System.currentTimeMillis();
for (long i = 0L; i < number; i++) {
mapper.map(user, UserDTO.class);
}
System.out.println(System.currentTimeMillis() - begin);
begin = System.currentTimeMillis();
for (long i = 0L; i < number; i++) {
PropertyUtils.copyProperties(new UserDTO(), user);
}
System.out.println(System.currentTimeMillis() - begin);
}
}