Java详解entity转换到vo过程
作者:ifredom
这篇文章将用实例来和大家介绍一下entity转换到vo的方法过程。文中的示例代码讲解详细,对我们学习Java有一定的帮助,需要的可以参考一下
起因
使用 mybatis-plus 操作后获得的数据类型为 Entity,但是前端界面往往需要展示一些其他的字段数据,此时就需要 将 Entity 转化为 Vo。
那么他们三者的关系是什么呢?面向的使用对象不同
entity: 对应数据库表模型
vo: 对应需要返回到前端的数据模型
dto: 对应后台内部调用的数据模型
package com.springblog.entity.vo; import lombok.Data; import java.io.Serializable; @Data public class BlogVo implements Serializable { private String title; /** * 前端需要展示的其他字段 */ private String otherProperty; }
package com.springblog.entity; import com.baomidou.mybatisplus.annotation.TableName; import com.baomidou.mybatisplus.annotation.IdType; import com.baomidou.mybatisplus.annotation.TableId; import java.time.LocalDateTime; import java.io.Serializable; import lombok.Data; import javax.validation.constraints.NotBlank; @Data @TableName("m_blog") public class BlogEntity implements Serializable { private static final long serialVersionUID = 1L; @TableId(value = "id", type = IdType.AUTO) private Long id; private String title; private String description; private String content; private LocalDateTime created; }
1. 将Entity转化为Vo
@GetMapping("/one/{id}") public R oneDefine(@PathVariable(name = "id") Long id) { BlogEntity blogEntity = blogService.queryBlogById(id); BlogVo blogVo = new BlogVo(); BeanUtil.copyProperties(blogEntity,blogVo); blogVo.setOtherProperty("前端展示额外字段"); return R.ok().put("data", blogVo); }
2. 将List<Entity>转换为List<Vo>
如果采用最简单粗暴的方式,那么这个过程应该是这样的:
- 创建一个临时ArrayList
- 遍历 List ,并在内部调用工具类方法
BeanUtil.copyProperties(source,target)
将每一个Entity转化为vo - 将每一个复制转换后的voItem 通过add()方法添加到临时创建的List中
过于繁琐,这很不好
@GetMapping("/list1") public R list1(@RequestBody Map<String, Object> params) { QueryWrapper<BlogEntity> queryWrapper = new QueryWrapper<>(); List<BlogEntity> list = blogMapper.selectList(queryWrapper); ArrayList<BlogVo> voList = new ArrayList<>(); list.forEach(item->{ BlogVo voItem = new BlogVo(); BeanUtil.copyProperties(item,voItem); voList.add(voItem); }); return R.ok().put("data", voList); }
封装到工具类后使用
封装后,将 Entity 转化为 Vo
@GetMapping("/one/{id}") public R oneDefine(@PathVariable(name = "id") Long id) { BlogEntity blogEntity = blogService.queryBlogById(id); BlogVo blogVo = ConvertUtil.entityToVo(blogEntity, BlogVo.class); blogVo.setOtherProperty("前端展示额外字段"); return R.ok().put("data", blogVo); }
封装后,将 List<Entity> 转换为List<Vo>
@GetMapping("/list1") public R list1(@RequestBody Map<String, Object> params) { QueryWrapper<BlogEntity> queryWrapper = new QueryWrapper<>(); List<BlogEntity> list = blogMapper.selectList(queryWrapper); List<BlogVo> blogVos = ConvertUtil.entityToVoList(list, BlogVo.class); return R.ok().put("data", blogVos); }
性能以及原理
- 使用Spring提供的BeanUtil在日常使用足够了,如果涉及到数据量很大的情况,复制就比较耗时了,推介使用Mapstruct。
- Spring和Apache的BeanUtils则是用到了反射机制,都是浅拷贝
- MapStruct使用注解处理器生成实现类,实现类内部是原生的new对象,然后SetXxx/getXxx方式赋值进行数据拷贝的,类似lombok
- Apache提供的BeanUtils相对使用的较少
ConvertUtil工具类源码
package com.springblog.common.utils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.BeanUtils; import java.util.ArrayList; import java.util.Collection; import java.util.List; /** * @Author ifredom * @Description 类型转换: Entity - Vo转换 * @Date 2022/5/10 15:59 * @Param [params] **/ public class ConvertUtil { public static final Logger logger = LoggerFactory.getLogger(ConvertUtil.class); public static <T> T entityToVo(Object source, Class<T> target) { if (source == null) { return null; } T targetObject = null; try { targetObject = target.newInstance(); BeanUtils.copyProperties(source, targetObject); } catch (Exception e) { e.printStackTrace(); } return targetObject; } public static <T> List<T> entityToVoList(Collection<?> sourceList, Class<T> target) { if (sourceList == null) { return null; } List<T> targetList = new ArrayList<>(sourceList.size()); try { for (Object source : sourceList) { T targetObject = target.newInstance(); BeanUtils.copyProperties(source, targetObject); targetList.add(targetObject); } } catch (Exception e) { logger.error("convert error ", e); } return targetList; } }
到此这篇关于Java详解entity转换到vo过程的文章就介绍到这了,更多相关Java entity转vo内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!