最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

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

Dozer

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

常用于:

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

注意的場(chǎng)景:

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

建議:

  • 不用Dozer最好, Dozer帶來(lái)的是性能開(kāi)銷.(這是不可能…)
  • 某些特殊操作可以用切面控制特殊字段進(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: 單個(gè)對(duì)象的深度復(fù)制及類型轉(zhuǎn)換,vo/domain , po
     * @param s 數(shù)據(jù)對(duì)象
     * @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
    為自定義的分頁(yè)結(jié)果集)
     *
    @param s 數(shù)據(jù)對(duì)象
  
     <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實(shí)現(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());

}
// 個(gè)人信息變更記錄session
SessionUserDetails userDetails = ejbGenerator.convert(userVo, SessionUserDetails.class);

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

相關(guān)文章

  • Java?獲取Zookeeper節(jié)點(diǎn)下所有數(shù)據(jù)詳細(xì)步驟

    Java?獲取Zookeeper節(jié)點(diǎn)下所有數(shù)據(jù)詳細(xì)步驟

    本文介紹了如何使用Java獲取ZooKeeper節(jié)點(diǎn)下所有數(shù)據(jù),實(shí)際應(yīng)用示例中,我們演示了如何從ZooKeeper節(jié)點(diǎn)下獲取配置信息并輸出到控制臺(tái),ZooKeeper是一個(gè)開(kāi)源的分布式協(xié)調(diào)服務(wù),適用于分布式系統(tǒng)中的數(shù)據(jù)同步、配置管理、命名服務(wù)等功能,感興趣的朋友一起看看吧
    2024-11-11
  • 淺析Java中的 new 關(guān)鍵字

    淺析Java中的 new 關(guān)鍵字

    java中的new關(guān)鍵字是實(shí)例化對(duì)象,接下來(lái)本文通過(guò)一個(gè)案例給大家講解Java中的 new 關(guān)鍵字,感興趣的朋友可以參考下
    2016-08-08
  • java定義通用返回結(jié)果類ResultVO使用示例詳解

    java定義通用返回結(jié)果類ResultVO使用示例詳解

    這篇文章主要為大家介紹了java定義通用返回結(jié)果類ResultVO使用示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-09-09
  • Intellij IDEA 如何通過(guò)數(shù)據(jù)庫(kù)表生成帶注解的實(shí)體類(圖文詳細(xì)教程)

    Intellij IDEA 如何通過(guò)數(shù)據(jù)庫(kù)表生成帶注解的實(shí)體類(圖文詳細(xì)教程)

    這篇文章主要介紹了Intellij IDEA 如何通過(guò)數(shù)據(jù)庫(kù)表生成帶注解的實(shí)體類(圖文詳細(xì)教程),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-11-11
  • maven子模塊相互依賴打包時(shí)報(bào)錯(cuò)找不到類的解決方案

    maven子模塊相互依賴打包時(shí)報(bào)錯(cuò)找不到類的解決方案

    本文主要介紹了maven子模塊相互依賴打包時(shí)報(bào)錯(cuò)找不到類的解決方案,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2023-06-06
  • try catch finally的執(zhí)行順序深入分析

    try catch finally的執(zhí)行順序深入分析

    首先執(zhí)行try,如果有異常執(zhí)行catch,無(wú)論如何都會(huì)執(zhí)行finally,當(dāng)有return以后,函數(shù)就會(huì)把這個(gè)數(shù)據(jù)存儲(chǔ)在某個(gè)位置,然后告訴主函數(shù),我不執(zhí)行了,接下來(lái)你執(zhí)行吧,所以函數(shù)就會(huì)推出
    2013-09-09
  • Maven在Windows中的配置以及IDE中的項(xiàng)目創(chuàng)建(圖文教程)

    Maven在Windows中的配置以及IDE中的項(xiàng)目創(chuàng)建(圖文教程)

    這篇文章主要介紹了Maven在Windows中的配置以及IDE中的項(xiàng)目創(chuàng)建(圖文教程),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-09-09
  • 使用SkyWalking監(jiān)控Java服務(wù)的過(guò)程

    使用SkyWalking監(jiān)控Java服務(wù)的過(guò)程

    這篇文章主要介紹了使用SkyWalking監(jiān)控Java服務(wù),介紹一個(gè)對(duì)源碼0入侵的Java服務(wù)監(jiān)控方式,SkyWalking Agent,只需要啟動(dòng)Java程序的時(shí)候加幾個(gè)參數(shù),就能對(duì)Java服務(wù)進(jìn)行可視化監(jiān)控,需要的朋友可以參考下
    2023-08-08
  • 在mybatis中使用mapper進(jìn)行if條件判斷

    在mybatis中使用mapper進(jìn)行if條件判斷

    這篇文章主要介紹了在mybatis中使用mapper進(jìn)行if條件判斷,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2021-01-01
  • Java實(shí)現(xiàn)自定義枚舉值校驗(yàn)器的示例代碼

    Java實(shí)現(xiàn)自定義枚舉值校驗(yàn)器的示例代碼

    這篇文章主要為大家詳細(xì)介紹了Java實(shí)現(xiàn)自定義枚舉值校驗(yàn)器的相關(guān)資料,文中的示例代碼講解詳細(xì),具有一定的借鑒價(jià)值,需要的可以參考一下
    2023-02-02

最新評(píng)論

奎屯市| 龙泉市| 鄂托克旗| 吉木乃县| 福安市| 鹤峰县| 宜阳县| 襄樊市| 淄博市| 富平县| 视频| 商南县| 新绛县| 乌苏市| 江孜县| 甘德县| 加查县| 梁平县| 浙江省| 七台河市| 隆尧县| 丰都县| 临江市| 瓮安县| 平江县| 清徐县| 临高县| 东光县| 桂东县| 景东| 南岸区| 台东市| 津市市| 威信县| 商丘市| 三明市| 谢通门县| 江北区| 宣威市| 泊头市| 海伦市|