欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Springboot整合Dozer實現(xiàn)深度復(fù)制的方法

 更新時間:2022年03月06日 12:01:54   作者:banjuer  
Dozer是一種Java?Bean到Java?Bean的映射器,遞歸地將數(shù)據(jù)從一個對象復(fù)制到另一個對象,它是一個強(qiáng)大的,通用的,靈活的,可重用的和可配置的開源映射框架,本文給大家介紹Springboot整合Dozer的相關(guān)知識,感興趣的朋友跟隨小編一起看看吧

Dozer

Dozer是一種Java Bean到Java Bean的映射器,遞歸地將數(shù)據(jù)從一個對象復(fù)制到另一個對象,它是一個強(qiáng)大的,通用的,靈活的,可重用的和可配置的開源映射框架。

常用于:

  • 代碼層與層之間javabean轉(zhuǎn)換, 如dao層PO轉(zhuǎn)前端VO
  • 分布式中, DAO層PO轉(zhuǎn)DTO, DO 以及web層DTO轉(zhuǎn)VO

注意的場景:

  • 由于bean之間的深度復(fù)制, 在進(jìn)行一些類似更新, 插入操作時尤其要注意最終接收到PO的一些關(guān)鍵字段如ID是否是真正需要的. 場景: 傳入的DTO A為查出的DTO B復(fù)制后的, 這時候A里會有B的ID, 在插入A的時候很有可能造成主鍵沖突.

建議:

  • 不用Dozer最好, Dozer帶來的是性能開銷.(這是不可能…)
  • 某些特殊操作可以用切面控制特殊字段進(jìn)行置空操作

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轉(zhuǎn)換器, 下節(jié)介紹 -->
        <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: 單個對象的深度復(fù)制及類型轉(zhuǎn)換,vo/domain , po
     * @param s 數(shù)據(jù)對象
     * @param clz 復(fù)制目標(biāo)類型
     * @return
     * @author banjuer@outlook.com
     * @Time 2018年5月9日 下午3:53:24
     */
    <T, S> T convert(S s, Class<T> clz);
    /**
     * @Description
   
    : 深度復(fù)制結(jié)果集(
    
     ResultSet
    為自定義的分頁結(jié)果集)
     *
    @param s 數(shù)據(jù)對象
  
     <T, S> 
    ResultSet
   <T> convert(
   <S> s, Class<T> clz);
  /** 
     * @Description: list深度復(fù)制
     * @Time 2018年5月9日 下午3:54:08
    <T, S> List<T> convert(List<S> s, Class<T> clz);
     * @Description: set深度復(fù)制
     * @Time 2018年5月9日 下午3:54:39
    <T, S> Set<T> convert(Set<S> s, Class<T> clz);
     * @Description: 數(shù)組深度復(fù)制
     * @Time 2018年5月9日 下午3:54:57
    <T, S> T[] convert(S[] s, Class<T> clz);
}

IGenerator實現(xiàn)

@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);

到此這篇關(guān)于Springboot整合Dozer深度復(fù)制的文章就介紹到這了,更多相關(guān)Springboot整合Dozer內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 詳解Feign的實現(xiàn)原理

    詳解Feign的實現(xiàn)原理

    Feign是Netflix開發(fā)的聲明式、模板化的HTTP客戶端, Feign可以幫助我們更快捷、優(yōu)雅地調(diào)用HTTP API
    2021-06-06
  • Spring自定義配置Schema可擴(kuò)展(一)

    Spring自定義配置Schema可擴(kuò)展(一)

    本教程主要介紹如何擴(kuò)展Spring的xml配置,讓Spring能夠識別我們自定義的Schema和Annotation,,需要的朋友可以參考下
    2016-01-01
  • IDEA 2020.2 +Gradle 6.6.1 + Spring Boot 2.3.4 創(chuàng)建多模塊項目的超詳細(xì)教程

    IDEA 2020.2 +Gradle 6.6.1 + Spring Boot 2.3.4 創(chuàng)建多模塊項目的超詳細(xì)教程

    這篇文章主要介紹了IDEA 2020.2 +Gradle 6.6.1 + Spring Boot 2.3.4 創(chuàng)建多模塊項目的教程,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-09-09
  • Java并發(fā)之Phaser的全面解析詳解

    Java并發(fā)之Phaser的全面解析詳解

    Phaser是Java中一個靈活的同步工具,其優(yōu)點在于支持多階段的任務(wù)拆分與同步,并且能夠動態(tài)地注冊與注銷參與者,下面我們就來深入了解一下Phaser的應(yīng)用吧
    2024-02-02
  • 一篇文章帶你了解java數(shù)據(jù)庫連接

    一篇文章帶你了解java數(shù)據(jù)庫連接

    這篇文章主要介紹了Java基于連接數(shù)據(jù)庫及顯示數(shù)據(jù)操作,結(jié)合實例形式分析了Java使用jdbc進(jìn)行mysql數(shù)據(jù)庫連接與數(shù)據(jù)讀取、顯示等相關(guān)操作技巧,需要的朋友可以參考下
    2021-08-08
  • java非公平鎖知識點實例詳解

    java非公平鎖知識點實例詳解

    在本篇文章里小編給大家整理了一篇關(guān)于java非公平鎖知識點實例詳解,有興趣的朋友們可以學(xué)習(xí)參考下。
    2021-10-10
  • 使用maven對springboot項目進(jìn)行瘦身分離jar的多種處理方案

    使用maven對springboot項目進(jìn)行瘦身分離jar的多種處理方案

    springboot項目打包一般我們都使用它自帶的spring-boot-maven-plugin插件,這個插件默認(rèn)情況下,會把所有的依賴包全部壓縮到一個jar里面,今天給大家分享幾種方案來如何減小我們的打包文件,需要的朋友可以參考下
    2024-02-02
  • java實現(xiàn)水果超市管理系統(tǒng)

    java實現(xiàn)水果超市管理系統(tǒng)

    這篇文章主要為大家詳細(xì)介紹了java實現(xiàn)水果超市管理系統(tǒng),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-01-01
  • MyBatis Mapper代理使用方法詳解

    MyBatis Mapper代理使用方法詳解

    本文是小編日常收集整理的關(guān)于mybatis mapper代理使用方法知識,通過本文還給大家提供有關(guān)開發(fā)規(guī)范方面的知識點,本文介紹的非常詳細(xì),具有參考借鑒價值,感興趣的朋友一起看下吧
    2016-08-08
  • Vue.Js及Java實現(xiàn)文件分片上傳代碼實例

    Vue.Js及Java實現(xiàn)文件分片上傳代碼實例

    這篇文章主要介紹了Vue.Js及Java實現(xiàn)文件分片上傳代碼實例,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-06-06

最新評論