SpringBoot Dozer

8 篇文章 0 订阅
8 篇文章 0 订阅

Dozer

Dozer是什么? Dozer是一个JavaBean映射工具库。

它支持简单的属性映射,复杂类型映射,双向映射,隐式显式的映射,以及递归映射。

它支持三种映射方式:注解、API、XML。

springboot Dozer 可以作为项目实战

项目结构:
springboot目录及测试需要的文件位置.png

springboot 配置 Dozer

1.在pom.xml文件里添加Dozer依赖

<!-- dozer 对象间属性值赋值,不同属性名,借助map映射 -->
<dependency>
   <groupId>net.sf.dozer</groupId>
   <artifactId>dozer</artifactId>
   <version>5.4.0</version>
   <exclusions>
      <exclusion>
         <groupId>org.slf4j</groupId>
         <artifactId>slf4j-log4j12</artifactId>
      </exclusion>
      <exclusion>
         <groupId>log4j</groupId>
         <artifactId>log4j</artifactId>
      </exclusion>
   </exclusions>
</dependency>

2.在config文件夹下添加:DozerConfig.java类

一定要在config下添加:springboot项目目录若没有config文件夹就新建一个

配置完成就可以测试使用mapper映射了!

package com.dist.config;

import org.dozer.spring.DozerBeanMapperFactoryBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

/**
 * @author yangmin
 * @date 2018/4/11
 * 返回一个dozer实例bean,目的是做对象间属性值的赋值操作
 */
@Configuration
public class DozerConfig {
    @Bean
    public DozerBeanMapperFactoryBean mapper() {
        return new DozerBeanMapperFactoryBean();
    }
}

到此,项目就可以使用Dozer了,用Mapper mapper,可以在controller层也可以在server层。

@Autowired
private Mapper mapper;

演示

此处是springboot项目测试,

在entity文件夹目录下,创建实体类

创建UserDTO.java类

package com.dist.entity.dto;

import lombok.Data;
import java.io.Serializable;

//下载idea插件 lombok ,或网上百度@Data
//下载方式:https://blog.csdn.net/qq_37433657/article/details/83275051
@Data
public class UserDTO implements Serializable {
    private String userCode;
    private String loginName;
    private String loginPassword;
    private String deviceCode;
    private String systemCode;
}

创建:UserVO.java类

package com.dist.entity.dto;

import lombok.Data;
import java.io.Serializable;

@Data
public class UserVO implements Serializable {
    private String userCode;
    private String loginName;
    private String loginPassword;
}

在test文件夹下创建测试类:

DozerTest.java

package com.dist.test;

import com.dist.SpringbootdemoApplication;
import com.dist.entity.dto.UserDTO;
import com.dist.entity.dto.UserVO;
import org.dozer.Mapper;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;

@RunWith(SpringRunner.class)
@SpringBootTest(classes = {SpringbootdemoApplication.class})
public class DozerTest{

    @Autowired
    private Mapper mapper;

    /**
     * 单个对象的深度复制及类型转换,vo/domain , po
     * 输出结果: UserVO(userCode=123, loginName=null, loginPassword=null)
     */
    @Test
    public void testMapper(){
        UserDTO userDTO =new UserDTO();
        userDTO.setUserCode("123");
        UserVO userVO = mapper.map(userDTO, UserVO.class);
        System.out.println(userVO);
    }
输出结果: UserVO(userCode=123, loginName=null, loginPassword=null)

映射成功,实现了类的深度复制;并且,过滤掉了前端不需要的数据;

Dozer工具接口和实现类

IGenerator.java接口:封装了Mapper工具接口:实现了list、set,数组,对象等深度复制!

package com.dist.utils;


import java.util.List;
import java.util.Set;

/**
 * @author zhengja@dist.com.cn
 * @data 2019/5/30 15:19
 */
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: list深度复制
     * @param s 数据对象
     * @param clz 复制目标类型
     * @return
     * @author banjuer@outlook.com
     * @Time 2018年5月9日 下午3:54:08
     */
    <T, S> List<T> convert(List<S> s, Class<T> clz);

    /**
     * @Description: set深度复制
     * @param s 数据对象
     * @param clz 复制目标类型
     * @return
     * @author banjuer@outlook.com
     * @Time 2018年5月9日 下午3:54:39
     */
    <T, S> Set<T> convert(Set<S> s, Class<T> clz);

    /**
     * @Description: 数组深度复制
     * @param s 数据对象
     * @param clz 复制目标类型
     * @return
     * @author banjuer@outlook.com
     * @Time 2018年5月9日 下午3:54:57
     */
    <T, S> T[] convert(S[] s, Class<T> clz);

}

IGenerator的实现类:EJBGenerator.java

package com.dist.utils;

import org.dozer.Mapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Lazy;
import org.springframework.stereotype.Component;

import java.lang.reflect.Array;
import java.util.*;

/**
 * @author zhengja@dist.com.cn
 * @data 2019/5/30 15:21
 */
@Component
@Lazy(true)
public class EJBGenerator implements IGenerator {

    @Autowired
    protected Mapper mapper;

    /**
     * @Description: 单个对象的深度复制及类型转换,vo/domain , po
     * @param s 数据对象
     * @param clz 复制目标类型
     * @param <T>
     * @param <S>
     * @return
     */
    @Override
    public <T, S> T convert(S s, Class<T> clz) {
        if (s == null) {
            return null;
        }
        return this.mapper.map(s, clz);
    }

    /**
     *@Description: list深度复制
     * @param s 数据对象
     * @param clz 复制目标类型
     * @param <T>
     * @param <S>
     * @return
     */
    @Override
    public <T, S> List<T> convert(List<S> s, Class<T> clz) {
        if (s == null) {
            return null;
        }
        List<T> list = new ArrayList<T>();
        for (S vs : s) {
            list.add(this.mapper.map(vs, clz));
        }
        return list;
    }

    /**
     * @Description: Set深度复制
     * @param s 数据对象
     * @param clz 复制目标类型
     * @param <T>
     * @param <S>
     * @return
     */
    @Override
    public <T, S> Set<T> convert(Set<S> s, Class<T> clz) {
        if (s == null) {
            return null;
        }
        Set<T> set = new HashSet<T>();
        for (S vs : s) {
            set.add(this.mapper.map(vs, clz));
        }
        return set;
    }

    /**
     * @Description: 数组深度复制
     * @param s 数据对象
     * @param clz 复制目标类型
     * @param <T>
     * @param <S>
     * @return
     */
    @Override
    public <T, S> T[] convert(S[] s, Class<T> clz) {
        if (s == null) {
            return null;
        }
        @SuppressWarnings("unchecked")
        T[] arr = (T[]) Array.newInstance(clz, s.length);
        for (int i = 0; i < s.length; i++) {
            arr[i] = this.mapper.map(s[i], clz);
        }
        return arr;
    }
}

全面测试

package com.dist.test;

import com.dist.SpringbootdemoApplication;
import com.dist.entity.dto.UserDTO;
import com.dist.entity.dto.UserVO;
import com.dist.utils.IGenerator;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;

import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;

/**
 * Dozer是什么?

 Dozer是一个JavaBean映射工具库。

 它支持简单的属性映射,复杂类型映射,双向映射,隐式显式的映射,以及递归映射。

 它支持三种映射方式:注解、API、XML。

 它是开源的,遵从Apache 2.0 协议

 * @author zhengja@dist.com.cn
 * @data 2019/5/30 14:36
 */
@RunWith(SpringRunner.class)
@SpringBootTest(classes = {SpringbootdemoApplication.class})
public class DozerTest{

    /*@Autowired
    private Mapper mapper;*/

    /**
     * 封装了Mapper工具接口:实现了list、set,数组,对象等深度复制!
     */
    @Autowired
    IGenerator iGenerator;

    /**
     * 单个对象的深度复制及类型转换,vo/domain , po
     * 输出结果: UserVO(userCode=123, loginName=null, loginPassword=null)
     */
    /*@Test
    public void testMapper(){
        UserDTO userDTO =new UserDTO();
        userDTO.setUserCode("123");
        UserVO userVO = mapper.map(userDTO, UserVO.class);
        System.out.println(userVO);
    }*/

    /**
     *单个对象的深度复制及类型转换,vo/domain , po
     * 输出结果: UserVO(userCode=123, loginName=null, loginPassword=null)
     */
    @Test
    public void test(){
        UserDTO userDTO =new UserDTO();
        userDTO.setUserCode("123");
        UserVO userVO = iGenerator.convert(userDTO, UserVO.class);
        //UserVO userVO = mapper.map(userDTO, UserVO.class);
        System.out.println(userVO);
    }

    /**
     * list深度复制
     */
    @Test
    public void test1(){
        List<UserDTO> dtoList = new ArrayList<>();
        UserDTO userDTO =new UserDTO();
        userDTO.setUserCode("123");
        dtoList.add(userDTO);
        List<UserVO> userVOS = iGenerator.convert(dtoList, UserVO.class);
        System.out.println(userVOS);
    }

    /**
     **set深度复制
     */
    @Test
    public void test2(){
        Set<UserDTO> dtoSet = new HashSet<>();
        UserDTO userDTO =new UserDTO();
        userDTO.setUserCode("123");
        dtoSet.add(userDTO);
        Set<UserVO> userVOS = iGenerator.convert(dtoSet, UserVO.class);
        System.out.println(userVOS);
    }

    /**
     * 数组深度复制
     */
    @Test
    public void test13(){
        UserDTO[] dtos = new UserDTO[3];
        UserDTO userDTO =new UserDTO();
        userDTO.setUserCode("123");
        dtos[0] = userDTO;
        dtos[1] = userDTO;
        dtos[2] = userDTO;
        UserVO[] userVOS = iGenerator.convert(dtos, UserVO.class);
        for (int i=0; i<userVOS.length;i++){
            System.out.println(userVOS[i]);
        }
    }
}

到此完成所有的测试!

<h2>测试结果:已经在测试的上面标注</h2>

项目实战演示

@RestController
@RequestMapping(value = "rest/admin/v1")
@Api(tags = {"OMS-UserController"}, description = "用户模块")
public class UserController extends BaseController {

    @Reference
    IUserService vUserService;
 
    @Autowired
    Mapper mapper;
   
    @ApiOperation(value = "获取用户", httpMethod = "GET")
    @GetMapping(value = "v1/get/user")
    public ResponseData getUser() {
        // 获取用户信息
        VUserinfo userInfo = vUserService.getUserInfo();
      //映射-过滤,只返回给前端需要的数据字段/数据格式
         UserDTO userDTO = mapper.map(userInfo, UserDTO.class);
        return ResponseUtil.success(userDTO);
    }
   
************************本片文章阅读结束************************

作者:宇宙小神特别萌
个人博客:www.zhengjiaao.cn
Gitee 仓库:https://gitee.com/zhengjiaao
Github 仓库:https://github.com/zhengjiaao?tab=repositories
描述:喜欢文章的点赞收藏一下,关注不迷路,避免以后找不到哦,大家遇到问题下方可评论

************************本片文章阅读结束************************



  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
上层应用业务对实时数据的需求,主要包含两部分内容:1、 整体数据的实时分析。2、 AB实验效果的实时监控。这几部分数据需求,都需要进行的下钻分析支持,我们希望能够建立统一的实时OLAP数据仓库,并提供一套安全、可靠的、灵活的实时数据服务。目前每日新增的曝光日志达到几亿条记录,再细拆到AB实验更细维度时,数据量则多达上百亿记录,多维数据组合下的聚合查询要求秒级响应时间,这样的数据量也给团队带来了不小的挑战。OLAP层的技术选型,需要满足以下几点:1:数据延迟在分钟级,查询响应时间在秒级2:标准SQL交互引擎,降低使用成本3:支持join操作,方便维度增加属性信息4:流量数据可以近似去重,但订单行要精准去重5:高吞吐,每分钟数据量在千W级记录,每天数百亿条新增记录6:前端业务较多,查询并发度不能太低通过对比开源的几款实时OLAP引擎,可以发现Doris和ClickHouse能够满足上面的需求,但是ClickHouse的并发度太低是个潜在的风险,而且ClickHouse的数据导入没有事务支持,无法实现exactly once语义,对标准SQL的支持也是有限的。所以针对以上需求Doris完全能解决我们的问题,DorisDB是一个性能非常高的分布式、面向交互式查询的分布式数据库,非常的强大,随着互联网发展,数据量会越来越大,实时查询需求也会要求越来越高,DorisDB人才需求也会越来越大,越早掌握DorisDB,以后就会有更大的机遇。本课程基于真实热门的互联网电商业务场景为案例讲解,具体分析指标包含:AB版本分析,下砖分析,营销分析,订单分析,终端分析等,能承载海量数据的实时分析,数据分析涵盖全端(PC、移动、小程序)应用。整个课程,会带大家实践一个完整系统,大家可以根据自己的公司业务修改,既可以用到项目中去,价值是非常高的。本课程包含的技术:开发工具为:IDEA、WebStormFlink1.9.0DorisDBHadoop2.7.5Hbase2.2.6Kafka2.1.0Hive2.2.0HDFS、MapReduceFlume、ZookeeperBinlog、Canal、MySQLSpringBoot2.0.8.RELEASESpringCloud Finchley.SR2Vue.js、Nodejs、Highcharts、ElementUILinux Shell编程等课程亮点:1.与企业接轨、真实工业界产品2.DorisDB高性能分布式数据库3.大数据热门技术Flink4.支持ABtest版本实时监控分析5.支持下砖分析6.数据分析涵盖全端(PC、移动、小程序)应用7.主流微服务后端系统8.天级别与小时级别多时间方位分析9.数据库实时同步解决方案10.涵盖主流前端技术VUE+jQuery+Ajax+NodeJS+ElementUI11.集成SpringCloud实现统一整合方案12.互联网大数据企业热门技术栈13.支持海量数据的实时分析14.支持全端实时数据分析15.全程代码实操,提供全部代码和资料16.提供答疑和提供企业技术方案咨询企业一线架构师讲授,代码在老师的指导下企业可以复用,提供企业解决方案。  版权归作者所有,盗版将进行法律维权。 

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

宇宙小神特别萌

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值