我的编程空间,编程开发者的网络收藏夹
学习永远不晚

SpringBoot2.x集成Dozer的示例代码

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

SpringBoot2.x集成Dozer的示例代码

Dozer是Java Bean到Java Bean的映射器,它以递归的方式将数据从一个对象复制到另一个对象。通常,这些Java Bean将具有不同的复杂类型。它支持简单属性映射,复杂类型映射,双向映射,隐式显式映射,以及递归映射。这包括映射需要在元素层面上进行映射的集合属性。可以将Dozer用作两个对象之间属性转换的工具,使用它可以很方便地对项目中的DO、DTO、VO进行相互转换。

本文主要对SpringBoot2.x集成Dozer及其基本使用进行简单总结,其中SpringBoot使用的2.4.5版本。

一、引入依赖


<dependency>
    <groupId>com.github.dozermapper</groupId>
    <artifactId>dozer-spring-boot-starter</artifactId>
    <version>6.5.0</version>
</dependency>
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-test</artifactId>
    <scope>test</scope>
</dependency>
<!-- lombok插件 -->
<dependency>
    <groupId>org.projectlombok</groupId>
    <artifactId>lombok</artifactId>
    <version>1.18.8</version>
</dependency>

二、实体类

User类:


package com.rtxtitanv.model;

import lombok.Data;
import lombok.experimental.Accessors;

import java.util.Date;


@Accessors(chain = true)
@Data
public class User {
    private Long id;
    private String name;
    private Integer age;
    private String gender;
    private String email;
    private Date birthday;
}

UserDTO类:


package com.rtxtitanv.model;

import lombok.Data;
import lombok.experimental.Accessors;


@Accessors(chain = true)
@Data
public class UserDTO {
    private Long userId;
    private String userName;
    private Integer userAge;
    private String gender;
    private String email;
    private String birthday;
}

三、编写配置文件

resources/dozer/目录下创建Dozer的全局配置文件global-dozer.xml


<?xml version="1.0" encoding="UTF-8"?>
<mappings xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
          xmlns="http://dozermapper.github.io/schema/bean-mapping"
          xsi:schemaLocation="http://dozermapper.github.io/schema/bean-mapping
                              http://dozermapper.github.io/schema/bean-mapping.xsd">
    <!-- 全局配置:<date-format>表示日期格式 -->
    <configuration>
        <date-format>yyyy/MM/dd HH:mm:ss</date-format>
    </configuration>
</mappings>

resources/dozer/目录下创建Dozer的映射文件dozer.xml


<?xml version="1.0" encoding="UTF-8"?>
<mappings xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
          xmlns="http://dozermapper.github.io/schema/bean-mapping"
          xsi:schemaLocation="http://dozermapper.github.io/schema/bean-mapping
                             http://dozermapper.github.io/schema/bean-mapping.xsd">
    <!-- 描述两个类中属性的对应关系,对于两个类中同名的属性可以不映射 -->
    <mapping date-format="yyyy/MM/dd HH:mm:ss">
        <class-a>com.rtxtitanv.model.User</class-a>
        <class-b>com.rtxtitanv.model.UserDTO</class-b>
        <field>
            <a>id</a>
            <b>userId</b>
        </field>
        <field>
            <a>name</a>
            <b>userName</b>
        </field>
        <field>
            <a>age</a>
            <b>userAge</b>
        </field>
    </mapping>
</mappings>

resources目录下创建application.yml配置文件:


dozer:
  # 指定Dozer的映射配置文件位置
  mapping-files:
    - classpath:dozer/global-dozer.xml
    - classpath:dozer/dozer.xml

四、创建测试类

创建单元测试类DozerTest


package com.rtxtitanv;

import com.github.dozermapper.core.Mapper;
import com.rtxtitanv.model.*;
import lombok.extern.slf4j.Slf4j;
import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;

import javax.annotation.Resource;


@Slf4j
@SpringBootTest
class DozerTest {

    @Resource
    private Mapper mapper;

    @Test
    void test1() {
        UserDTO userDTO = new UserDTO();
        userDTO.setUserId(1L).setUserName("ZhaoYun").setGender("男").setUserAge(20).setEmail("zhaoyun@xxx.com")
            .setBirthday("2001/8/18 18:05:32");
        User user = mapper.map(userDTO, User.class);
        log.info(user.toString());
        UserDTO userDTO2 = mapper.map(user, UserDTO.class);
        log.info(userDTO2.toString());
    }
}

执行测试方法,发现User和UserDTO相互转换成功:

1

五、Dozer的基本使用

下面对Dozer的一些基本使用进行总结。Dozer支持注解、API、XML三种映射配置方式,XML方式比较常用,前面使用的也是XML映射配置方式。XML映射配置中mapping元素的map-id属性可以设置该映射的标识,通过此标识来确定使用该映射关系。

dozer.xml中新增以下配置:


<!-- map-id:映射的标识,通过此标识来确定使用该映射关系 -->
<mapping date-format="yyyy/MM/dd HH:mm:ss" map-id="user">
    <class-a>com.rtxtitanv.model.User</class-a>
    <class-b>com.rtxtitanv.model.UserDTO</class-b>
    <field>
        <a>id</a>
        <b>userId</b>
    </field>
    <field>
        <a>name</a>
        <b>userName</b>
    </field>
    <field>
        <a>age</a>
        <b>userAge</b>
    </field>
</mapping>

新增以下测试方法:


@Test
void test2() {
    UserDTO userDTO = new UserDTO();
    userDTO.setUserId(2L).setUserName("MaChao").setGender("男").setUserAge(21).setEmail("machao@xxx.com")
        .setBirthday("2000/6/15 08:45:20");
    User user = mapper.map(userDTO, User.class, "user");
    log.info(user.toString());
}

执行测试方法,发现转换成功:

2

在调用map方法时也可以直接指定要转换的目标对象。新增以下测试方法:


@Test
void test3() {
    UserDTO userDTO = new UserDTO();
    userDTO.setUserId(3L).setUserName("LiuBei").setGender("男").setUserAge(30).setEmail("liubei@xxx.com")
        .setBirthday("1991/1/20 13:36:55");
    User user = new User();
    mapper.map(userDTO, user, "user");
    log.info(user.toString());
}

执行测试方法,发现转换成功:

3

通过field-exclude标签可以设置不想进行转换的属性,这些属性在进行转换时会被自动排除。

dozer.xml中新增以下配置:


<mapping date-format="yyyy/MM/dd HH:mm:ss" map-id="user-exclude">
    <class-a>com.rtxtitanv.model.User</class-a>
    <class-b>com.rtxtitanv.model.UserDTO</class-b>
    <field>
        <a>id</a>
        <b>userId</b>
    </field>
    <field>
        <a>name</a>
        <b>userName</b>
    </field>
    <field>
        <a>age</a>
        <b>userAge</b>
    </field>
    <field-exclude>
        <a>email</a>
        <b>email</b>
    </field-exclude>
</mapping>

新增以下测试方法:


@Test
void test4() {
    UserDTO userDTO = new UserDTO();
    userDTO.setUserId(1L).setUserName("ZhaoYun").setGender("男").setUserAge(20).setEmail("zhaoyun@xxx.com")
        .setBirthday("2001/8/18 18:05:32");
    User user = mapper.map(userDTO, User.class, "user-exclude");
    log.info(user.toString());
}

执行测试方法,发现email属性被成功排除:

4

Dozer中的映射方式默认都是双向映射,如果想让转换不可逆,即只需要单向转换,可以设置mapping元素的type属性为one-way来开启单向映射。

dozer.xml中新增以下配置:


<!-- type="one-way"将映射设置为单向映射 -->
<mapping date-format="yyyy/MM/dd HH:mm:ss" map-id="user-oneway" type="one-way">
    <class-a>com.rtxtitanv.model.UserDTO</class-a>
    <class-b>com.rtxtitanv.model.User</class-b>
    <field>
        <a>userId</a>
        <b>id</b>
    </field>
    <field>
        <a>userName</a>
        <b>name</b>
    </field>
    <field>
        <a>userAge</a>
        <b>age</b>
    </field>
</mapping>

新增以下测试方法:


@Test
void test5() {
    UserDTO userDTO = new UserDTO();
    userDTO.setUserId(1L).setUserName("ZhaoYun").setGender("男").setUserAge(20).setEmail("zhaoyun@xxx.com")
        .setBirthday("2001/8/18 18:05:32");
    User user = mapper.map(userDTO, User.class, "user-oneway");
    log.info(user.toString());
    UserDTO userDTO2 = mapper.map(user, UserDTO.class, "user-oneway");
    log.info(userDTO2.toString());
}

执行测试方法,发现只有UserDTO转换为User成功:

5

当两个实体类中都嵌套有能够互相转换的实体类型属性时,也可以进行相互转换。

创建Order类:


package com.rtxtitanv.model;

import lombok.Data;
import lombok.experimental.Accessors;


@Accessors(chain = true)
@Data
public class Order {
    private Long id;
    private String number;
    private String description;
    private User user;
}

创建OrderDTO类:


package com.rtxtitanv.model;

import lombok.Data;
import lombok.experimental.Accessors;


@Accessors(chain = true)
@Data
public class OrderDTO {
    private Long orderId;
    private String orderNumber;
    private String orderDescription;
    private UserDTO userDTO;
}

dozer.xml中新增以下配置:


<mapping date-format="yyyy/MM/dd HH:mm:ss" map-id="order">
    <class-a>com.rtxtitanv.model.Order</class-a>
    <class-b>com.rtxtitanv.model.OrderDTO</class-b>
    <field>
        <a>id</a>
        <b>orderId</b>
    </field>
    <field>
        <a>number</a>
        <b>orderNumber</b>
    </field>
    <field>
        <a>description</a>
        <b>orderDescription</b>
    </field>
    <field>
        <a>user</a>
        <b>userDTO</b>
    </field>
</mapping>

新增以下测试方法:


@Test
void test6() {
    OrderDTO orderDTO = new OrderDTO();
    UserDTO userDTO = new UserDTO().setUserId(6L).setUserName("DiaoChan").setGender("女").setUserAge(18)
        .setEmail("diaochan@xxx.com").setBirthday("2003/12/27 23:10:36");
    orderDTO.setOrderId(1L).setOrderNumber("78956328").setOrderDescription("二两麻辣牛肉面").setUserDTO(userDTO);
    Order order = mapper.map(orderDTO, Order.class, "order");
    log.info(order.toString());
    OrderDTO orderDTO2 = mapper.map(order, OrderDTO.class, "order");
    log.info(orderDTO2.toString());
}

执行测试方法,发现Order和OrderDTO相互转换成功:

6

Dozer还可以对深层属性进行映射,即深度映射。例如一个对象中的String类型属性可以与另一个对象中嵌套的对象的属性进行映射。

创建UserInfo类:


package com.rtxtitanv.model;

import lombok.Data;
import lombok.experimental.Accessors;


@Accessors(chain = true)
@Data
public class UserInfo {
    private String gender;
    private String email;
    private String birthday;
}

创建UserInfoDTO类:


package com.rtxtitanv.model;

import lombok.Data;
import lombok.experimental.Accessors;


@Accessors(chain = true)
@Data
public class UserInfoDTO {
    private Long userId;
    private String userName;
    private Integer userAge;
    private UserInfo userInfo;
}

dozer.xml中新增以下配置:


<mapping date-format="yyyy/MM/dd HH:mm:ss" map-id="user-deep-mapping">
    <class-a>com.rtxtitanv.model.UserInfoDTO</class-a>
    <class-b>com.rtxtitanv.model.User</class-b>
    <field>
        <a>userId</a>
        <b>id</b>
    </field>
    <field>
        <a>userName</a>
        <b>name</b>
    </field>
    <field>
        <a>userAge</a>
        <b>age</b>
    </field>
    <field>
        <a>userInfo.gender</a>
        <b>gender</b>
    </field>
    <field>
        <a>userInfo.email</a>
        <b>email</b>
    </field>
    <field>
        <a>userInfo.birthday</a>
        <b>birthday</b>
    </field>
</mapping>

新增以下测试方法:


@Test
void test7() {
    UserInfo userInfo = new UserInfo();
    userInfo.setGender("男").setEmail("zhaoyun@xxx.com").setBirthday("2001/8/18 18:05:32");
    UserInfoDTO userInfoDTO = new UserInfoDTO();
    userInfoDTO.setUserId(1L).setUserName("ZhaoYun").setUserAge(20).setUserInfo(userInfo);
    User user = mapper.map(userInfoDTO, User.class, "user-deep-mapping");
    log.info(user.toString());
}

执行测试方法,发现UserInfoDTO成功转换为User:

7

Dozer还支持注解方式配置映射,使用@Mapping注解可以进行一些简单的映射处理。

创建UserEntity类:


package com.rtxtitanv.model;

import com.github.dozermapper.core.Mapping;
import lombok.Data;
import lombok.experimental.Accessors;


@Accessors(chain = true)
@Data
public class UserEntity {
    @Mapping(value = "userId")
    private Long id;
    @Mapping(value = "userName")
    private String name;
    @Mapping(value = "userAge")
    private Integer age;
    private String gender;
    private String email;
    private String birthday;
}

@Mapping只需要在源类中指定目标类中对应的属性即可。

创建UserVO类:


package com.rtxtitanv.model;

import lombok.Data;
import lombok.experimental.Accessors;

import java.util.Date;


@Accessors(chain = true)
@Data
public class UserVO {
    private Long userId;
    private String userName;
    private Integer userAge;
    private String gender;
    private String email;
    private Date birthday;
}

新增以下测试方法:


@Test
void test8() {
    UserEntity userEntity = new UserEntity();
    userEntity.setId(1L).setName("ZhaoYun").setGender("男").setAge(20).setEmail("zhaoyun@xxx.com")
        .setBirthday("2001/8/18 18:05:32");
    UserVO userVO = mapper.map(userEntity, UserVO.class);
    log.info(userVO.toString());
}

执行测试方法,发现转换成功:

8

代码示例

Github:https://github.com/RtxTitanV/springboot-learning/tree/master/springboot2.x-learning/springboot-dozer

Gitee:https://gitee.com/RtxTitanV/springboot-learning/tree/master/springboot2.x-learning/springboot-dozer

到此这篇关于SpringBoot2.x 集成 Dozer的文章就介绍到这了,更多相关SpringBoot2.x 集成 Dozer内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

SpringBoot2.x集成Dozer的示例代码

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

springboot2.x中默认使用代理是cglib代理的操作示例

小编给大家分享一下springboot2.x中默认使用代理是cglib代理的操作示例,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!背景因为项目优化,打算写个日志的
2023-06-20

SpringBoot集成Druid实现监控功能的示例代码

本文详细介绍了如何在SpringBoot应用程序中集成Druid以实现监控功能。Druid提供了一个控制台,用于监控数据库性能、SQL查询和系统资源。通过添加Druid依赖项、配置数据源、创建配置文件、启用控制台和运行应用程序,开发人员可以轻松启用Druid监控。Druid提供实时监控、SQL查询监控和系统资源监控等优点,帮助识别和优化数据库性能。
SpringBoot集成Druid实现监控功能的示例代码
2024-04-02

PHP生成饼图的示例代码

这篇文章主要为大家详细介绍了如何利用PHP实现饼图的绘制,文中的示例代码讲解详细,具有一定的借鉴价值,感兴趣的小伙伴可以跟随小编一起学习一下
2022-12-21

Springboot整合Dubbo之代码集成和发布的示例分析

这篇文章主要介绍了Springboot整合Dubbo之代码集成和发布的示例分析,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。具体如下:1. boot-dubbo-api相关打
2023-05-30

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录