Springboot整合Dozer实现深度复制的方法

目录
  • Dozer
  • SpringBoot整合Dozer
    • jar依赖引入
    • dozer配置xml引入
    • Dozer的JavaConfig
    • 格式化工厂
  • 使用Demo

Dozer

Dozer是一种Java Bean到Java Bean的映射器,递归地将数据从一个对象复制到另一个对象,它是一个强大的,通用的,灵活的,可重用的和可配置的开源映射框架。

常用于:

  • 代码层与层之间javabean转换, 如dao层PO转前端VO
  • 分布式中, DAO层PO转DTO, DO 以及web层DTO转VO

注意的场景:

  • 由于bean之间的深度复制, 在进行一些类似更新, 插入操作时尤其要注意最终接收到PO的一些关键字段如ID是否是真正需要的. 场景: 传入的DTO A为查出的DTO B复制后的, 这时候A里会有B的ID, 在插入A的时候很有可能造成主键冲突.

建议:

  • 不用Dozer最好, Dozer带来的是性能开销.(这是不可能…)
  • 某些特殊操作可以用切面控制特殊字段进行置空操作

SpringBoot整合Dozer

jar依赖引入

pom.xml加入以下依赖

<dependency>
    <groupId>net.sf.dozer</groupId>
    <artifactId>dozer-spring</artifactId>
    <version>5.5.1</version>
</dependency>
<dependency>
    <groupId>net.sf.dozer</groupId>
    <artifactId>dozer</artifactId>
    <version>5.5.1</version>
</dependency>

dozer配置xml引入

resource文件夹下新建dozer文件夹, 并新建bean-mappings.xml, global-configuration.xml

bean-mappings.xml

<?xml version="1.0" encoding="UTF-8"?>
<mappings xmlns="http://dozer.sourceforge.net" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://dozer.sourceforge.net
          http://dozer.sourceforge.net/schema/beanmapping.xsd">
</mappings>

global-configuration.xml

<?xml version="1.0" encoding="UTF-8"?>
<mappings xmlns="http://dozer.sourceforge.net" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://dozer.sourceforge.net
          http://dozer.sourceforge.net/schema/beanmapping.xsd">
    <configuration>
        <date-format>yyyy-MM-dd HH:mm:ss</date-format>
        <wildcard>true</wildcard>
        <trim-strings>false</trim-strings>
        <!-- 自定义的枚举与Integer转换器, 下节介绍 -->
        <custom-converters>
            <converter type="com.dongao.beacon.ds.web.admin.tookit.EnumIntegerBiDirectionalDozerConverter">
                <class-a>java.lang.Enum</class-a>
                <class-b>java.lang.Integer</class-b>
            </converter>
        </custom-converters>
    </configuration>
</mappings>

Dozer的JavaConfig

用于SpringBoot寻找DozerBeanMapperFactoryBean的配置
新建DozerMapperConfig.java

public class DozerMapperConfig {

    @Bean
    public DozerBeanMapperFactoryBean dozerBeanMapperFactoryBean(@Value("classpath*:dozer/*.xml") Resource[] resources) throws Exception {
        final DozerBeanMapperFactoryBean dozerBeanMapperFactoryBean = new DozerBeanMapperFactoryBean();
        dozerBeanMapperFactoryBean.setMappingFiles(resources);
        return dozerBeanMapperFactoryBean;
    }

}

格式化工厂

建议新建包专门放置Dozer工具

接口定义: 新建IGenerator.java接口

public interface IGenerator {
    /**
     * @Description: 单个对象的深度复制及类型转换,vo/domain , po
     * @param s 数据对象
     * @param clz 复制目标类型
     * @return
     * @author banjuer@outlook.com
     * @Time 2018年5月9日 下午3:53:24
     */
    <T, S> T convert(S s, Class<T> clz);
    /**
     * @Description

    : 深度复制结果集(

     ResultSet
    为自定义的分页结果集)
     *
    @param s 数据对象

     <T, S>
    ResultSet
   <T> convert(
   <S> s, Class<T> clz);
  /**
     * @Description: list深度复制
     * @Time 2018年5月9日 下午3:54:08
    <T, S> List<T> convert(List<S> s, Class<T> clz);
     * @Description: set深度复制
     * @Time 2018年5月9日 下午3:54:39
    <T, S> Set<T> convert(Set<S> s, Class<T> clz);
     * @Description: 数组深度复制
     * @Time 2018年5月9日 下午3:54:57
    <T, S> T[] convert(S[] s, Class<T> clz);
}

IGenerator实现

@Component
@Lazy(true)
public class EJBGenerator implements IGenerator {
    @Autowired
    protected Mapper dozerMapper;
    public <T, S> T convert(S s, Class<T> clz) {
        if (s == null) {
            return null;
        }
        return this.dozerMapper.map(s, clz);
    }
     public

    <T, S> 

    ResultSet
   <T>
  convert
   (
   <S> s, Class<T> clz) {

  if (s == null) {
     return null
   ;
     }
    resultSet
    =
  new
   <T>();
  for
    (S vs : s.getResult()) {
   .getResult().add(
  this
   .dozerMapper.map(vs, clz));
   .setTotal(s.getTotal());
   .setExt(s.getExt());
   .setModifyTime(s.getModifyTime());
  return

  public <T, S> List<T> convert(List<S> s, Class<T> clz) {
        List<T> list = new ArrayList<T>();
        for (S vs : s) {
            list.add(this.dozerMapper.map(vs, clz));
        return list;
    public <T, S> Set<T> convert(Set<S> s, Class<T> clz) {
        Set<T> set = new HashSet<T>();
            set.add(this.dozerMapper.map(vs, clz));
        return set;
    public <T, S> T[] convert(S[] s, Class<T> clz) {
        @SuppressWarnings("unchecked")
        T[] arr = (T[]) Array.newInstance(clz, s.length);
        for (int i = 0; i < s.length; i++) {
            arr[i] = this.dozerMapper.map(s[i], clz);
        return arr;
}

使用Demo

一般在公共父类中引入, 此处例子为前端公共Controller引入

@Controller
public class BaseController  {
    @Autowired
    protected EJBGenerator ejbGenerator = new EJBGenerator();
    protected final Logger logger = LoggerFactory.getLogger(getClass());

}
// 个人信息变更记录session
SessionUserDetails userDetails = ejbGenerator.convert(userVo, SessionUserDetails.class);

到此这篇关于Springboot整合Dozer深度复制的文章就介绍到这了,更多相关Springboot整合Dozer内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • 解决复制springboot项目后,启动日志无颜色的问题

    复制springboot项目后,启动日志无颜色 把之前的springboot项目复制到idea后,启动日志无颜色,这是因为复制过来的项目并没有选择springboot模板,需要做下简单的修改. 1,问题图片如下,虽然不影响开发,但是看着就是不爽,改他. 2,点击工具栏的启动设置,如下图: 3,点击左上角"+",然后选择下面的springboot模板 4,选择启动类,然后apply即可.上面的Name随意定义,可以用项目名字 5,重新启动 以上为个人经验,希望能给大家一个参考,也希望大家

  • SpringBoot如何进行对象复制的实践

    目录 为什么需要对象复制 对象复制工具类推荐 Orika基本使用 引入依赖 Orika工具类使用文档 TC1,基础实体映射 TC2,实体映射 - 字段转换 TC3,基础集合映射 TC4,集合映射 - 字段映射 TC5,集合与实体映射 TC6,类类型映射 TC7,多重映射 TC8,MyBaits plus分页映射 小结 首先我们看看为什么需要对象复制? 为什么需要对象复制 如上,是我们平时开发中最常见的三层MVC架构模型,编辑操作时Controller层接收到前端传来的DTO对象,在Service

  • SpringBoot2.x集成Dozer的示例代码

    目录 一.引入依赖 二.实体类 三.编写配置文件 四.创建测试类 五.Dozer的基本使用 代码示例 Dozer是Java Bean到Java Bean的映射器,它以递归的方式将数据从一个对象复制到另一个对象.通常,这些Java Bean将具有不同的复杂类型.它支持简单属性映射,复杂类型映射,双向映射,隐式显式映射,以及递归映射.这包括映射需要在元素层面上进行映射的集合属性.可以将Dozer用作两个对象之间属性转换的工具,使用它可以很方便地对项目中的DO.DTO.VO进行相互转换. 本文主要对S

  • Springboot整合Dozer实现深度复制的方法

    目录 Dozer SpringBoot整合Dozer jar依赖引入 dozer配置xml引入 Dozer的JavaConfig 格式化工厂 使用Demo Dozer Dozer是一种Java Bean到Java Bean的映射器,递归地将数据从一个对象复制到另一个对象,它是一个强大的,通用的,灵活的,可重用的和可配置的开源映射框架. 常用于: 代码层与层之间javabean转换, 如dao层PO转前端VO 分布式中, DAO层PO转DTO, DO 以及web层DTO转VO 注意的场景: 由于b

  • SpringBoot整合Dozer映射框架流程详解

    目录 1. Dozer 介绍 2. 为什么要使用映射框架 Dozer 3. Dozer 映射框架的使用 1. Dozer 介绍 Dozer 是一个 Java Bean 到 Java Bean 的映射器,它递归地将数据从一个对象复制到另一个对象.Dozer 是用来对两个对象之间属性转换的工具,有了这个工具之后,我们将一个对象的所有属性值转给另一个对象时,就不需要再去写重复的调用 set 和 get 方法. 最重要的是,Dozer 可以确保来自数据库的内部域对象不会渗入外部表示层或外部消费者,它还可

  • SpringBoot整合MyCat实现读写分离的方法

    MyCat一个彻底开源的,面向企业应用开发的大数据库集群.基于阿里开源的Cobar产品而研发.能满足数据库数据大量存储:提高了查询性能.文章介绍如何实现MyCat连接MySQL实现主从分离,并集成SpringBoot实现读写分离. MySQL配置主从关系 说明 192.168.0.105 Linux 数据库作为主master数据库 127.0.0.1 Window 作为从slave数据库 master主数据库配置 binlog是Mysql sever层维护的一种二进制日志,主要是用来记录对Mys

  • spring-boot整合ehcache实现缓存机制的方法

    EhCache 是一个纯Java的进程内缓存框架,具有快速.精干等特点,是Hibernate中默认的CacheProvider. ehcache提供了多种缓存策略,主要分为内存和磁盘两级,所以无需担心容量问题. spring-boot是一个快速的集成框架,其设计目的是用来简化新Spring应用的初始搭建以及开发过程.该框架使用了特定的方式来进行配置,从而使开发人员不再需要定义样板化的配置. 由于spring-boot无需任何样板化的配置文件,所以spring-boot集成一些其他框架时会有略微的

  • SpringBoot整合MyBatisPlus配置动态数据源的方法

    MybatisPlus特性 •无侵入:只做增强不做改变,引入它不会对现有工程产生影响,如丝般顺滑 •损耗小:启动即会自动注入基本 CURD,性能基本无损耗,直接面向对象操作 •强大的 CRUD 操作:内置通用 Mapper.通用 Service,仅仅通过少量配置即可实现单表大部分 CRUD 操作,更有强大的条件构造器,满足各类使用需求 •支持 Lambda 形式调用:通过 Lambda 表达式,方便的编写各类查询条件,无需再担心字段写错 •支持多种数据库:支持 MySQL.MariaDB.Ora

  • SpringBoot整合POI导出通用Excel的方法示例

    一.准备工作 1.pom依赖 在pom.xml中加入POI的依赖 <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi-ooxml</artifactId> <version>3.11-beta1</version> </dependency> <dependency> <groupId>org.apache.poi

  • SpringBoot整合Ureport2报表及常见使用方法

    1.Maven 添加依赖 <!--ureport--> <dependency> <groupId>com.syyai.spring.boot</groupId> <artifactId>ureport-spring-boot-starter</artifactId> <version>2.2.9</version> </dependency> 2.编写ureport2 的配置类 配置类实现 Bui

  • springboot整合JPA访问Mysql的实现方法

    1.代码实现: 添加依赖  <dependency>             <groupId>org.springframework.boot</groupId>             <artifactId>spring-boot-starter</artifactId>         </dependency>         <dependency>             <groupId>org

  • SpringBoot整合EasyExcel进行大数据处理的方法详解

    目录 EasyExcel 需要的Maven 基础读案例 操作的excel 实体类 读取监听器 测试 基础写案例 实体类 测试 Excel模板方式 准备模块 实体类 测试 EasyExcel EasyExcel文档 我用过Poi和EasyPoi这些工具总体来说: POI 优点我觉得自由,但是迎来的就是复杂度,和大数据量时候性能的缺点 EasyPoi基于POI 的二次封装,解决了大部分的常用场景,简化了代码,但是特别复杂表格处理还是不行,而且性能的话和poi差不多,简单来说就是简化了Poi的操作,少

  • Springboot 整合shiro实现权限控制的方法

    Author:jeffrey Date:2019-04-08 一.开发环境: 1.mysql - 5.7 2.navicat(mysql客户端管理工具) 3.idea 2017.2 4.jdk8 5.tomcat 8.5 6.springboot2.1.3 7.mybatis 3 8.shiro1.4 9.maven3.3.9 二.数据库设计 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-CB46ByC1-1604249108144)(img/shiro01.pn

随机推荐