SpringBoot 入门教程之引入数据传输层的方法

我们现在操作的数据直接就使用了实体类,假如我们输出的用户对象需要包含用户拥有的权限列表,那么我们怎么封装呢?

直接封装进实体类中显然不行,因为实体类的职责就是提供与数据库表字段一一对应的映射关系,所以我们还需要封装出一层数据传输层 DTO(Data Transfer Object),通过它暴露给外部,这样我们就能高度定制化我们需要输出的数据而不会影响到实体类。

在项目中创建 dto 目录,新建 UserDto.java 文件:

package com.foxescap.wxbox.dto;

import lombok.Data;

import java.time.LocalDateTime;

/**
 * @author xfly
 */
@Data
public class UserDto {
 private String username;

 private LocalDateTime expiredAt;

 private LocalDateTime createdAt;

 private List<RoleDto> roles;
}

结构看上去基本和对应的实体类非常相似,职责区别就是:

• 我不想暴露出去的字段可以直接不声明。

• 我可以加如其他的 DTO 作为其中的属性,如上所示。

对应我们的 Service 层就需要在拿到实体类对象后转换成 DTO 对象:

public UserDto findByUsername(String username) {
 var user = lambdaQuery().eq(User::getUsername, username).one();
 var userDto = new UserDto();
 userDto.setUsername(user.getUsername());
 userDto.setExpiredAt(user.getExpiredAt());
 userDto.setCreatedAt(user.getCreatedAt());

 return userDto;
}

这里你会发现,这个转换的过程特别难受,就像写 Getter 和 Setter 方法一样,写多了要吐了。

我会写吐别人也一样会写吐,然后就会有轮子造出来,modelmapper就是解决这样需求的一个用的人比较多的轮子。

在 pom.xml 项目配置文件中的 dependencies 中加入 modelmapper 依赖:

<dependency>
 <groupId>org.modelmapper</groupId>
 <artifactId>modelmapper</artifactId>
 <version>2.3.7</version>
</dependency>

然后在 config 目录中的 WebMvcConfig.java 文件中注入这个对象:

@Bean
public ModelMapper modelMapper() {
 ModelMapper modelMapper = new ModelMapper();

 modelMapper.getConfiguration().setFullTypeMatchingRequired(true);
 modelMapper.getConfiguration().setMatchingStrategy(MatchingStrategies.STRICT);

 return modelMapper;
}

我们这个时候再来改造一下 findByUsername 方法:

private final ModelMapper modelMapper;

public UserService(ModelMapper modelMapper) {
 this.modelMapper = modelMapper;
}

public UserDto findByUsername(String username) {
 var user = lambdaQuery().eq(User::getUsername, username).one();

 return modelMapper.map(user, UserDto.class);
}

到此这篇关于SpringBoot 入门教程之引入数据传输层的方法的文章就介绍到这了,更多相关SpringBoot 引入数据传输层内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • springboot集成rabbitMQ之对象传输的方法

    rabbitMQ的安装方法网上有很多教程,这里就不重复了. 在springboot上使用rabbitMQ传输字符串和对象,本文所给出的例子是在两个不同的项目之间进行对象和和字符串的传输. rabbitMQ的依赖(在两个项目中一样的配置): <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-amqp</artifactId>

  • 使用ajax跨域调用springboot框架的api传输文件

    在新项目中使用的是springboot编写的api,涉及到ajax跨域请求和传输文件的问题,在这里记录一下 首先是前台页面的代码 <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>test_api</title> <script type="text/javascript" src="jquery-1.7.2.

  • SpringBoot 入门教程之引入数据传输层的方法

    我们现在操作的数据直接就使用了实体类,假如我们输出的用户对象需要包含用户拥有的权限列表,那么我们怎么封装呢? 直接封装进实体类中显然不行,因为实体类的职责就是提供与数据库表字段一一对应的映射关系,所以我们还需要封装出一层数据传输层 DTO(Data Transfer Object),通过它暴露给外部,这样我们就能高度定制化我们需要输出的数据而不会影响到实体类. 在项目中创建 dto 目录,新建 UserDto.java 文件: package com.foxescap.wxbox.dto; im

  • SpringBoot2.x入门教程之引入jdbc模块与JdbcTemplate简单使用方法

    前提 这篇文章是<SpringBoot2.x入门>专辑的第7篇文章,使用的SpringBoot版本为2.3.1.RELEASE,JDK版本为1.8. 这篇文章会简单介绍jdbc模块也就是spring-boot-starter-jdbc组件的引入.数据源的配置以及JdbcTemplate的简单使用.为了让文中的例子相对通用,下文选用MySQL8.x.h2database(内存数据库)作为示例数据库,选用主流的Druid和HikariCP作为示例数据源. 引入jdbc模块 引入spring-boo

  • SpringBoot入门教程详解

    目录 一.SpringBoot简介 二.SpringBoot入门案例 1.创建项目 2.编写 Controller 类 3.启动项目 4.使用 Postman 测试 三.SpringBoot VS Spring 四.在官网中构建工程 六.SpringBoot 是如何实现简化开发的 1.启动依赖 2.引导类 七.切换 Web 一.SpringBoot简介 SpringBoot 是由 Pivotal 团队提供的全新框架,其设计目的是用来简化 Spring 应用的初始搭建以及开发过程. 我们在学习 S

  • R语言入门教程之删除指定数据的方法

    引言 在R学习中经常用到的是按着某种逻辑值提取数据集.本文来讲一下利用索引的手法删除数据集合. 数据准备 > Data 英雄 职业 熟练等级 使用频次 胜率 1 后裔 射手 5 856 0.64 2 孙尚香 射手 5 211 0.10 3 狄仁杰 射手 5 324 0.20 4 李元芳 射手 4 75 0.30 5 安琪拉 法师 5 2324 0.40 6 张良 法师 4 755 0.50 7 不知火舞 法师 4 644 0.60 8 貂蝉 法师 3 982 0.70 9 <NA> &l

  • C++ STL入门教程(1) vector向量容器使用方法

    一.简介 Vectors 包含着一系列连续存储的元素,其行为和数组类似. 访问Vector中的任意元素或从末尾添加元素都可以在O(1)内完成,而查找特定值的元素所处的位置或是在Vector中插入元素则是O(N). 二.完整程序代码 /*请务必运行以下程序后对照阅读*/ #include <vector> #include <iostream> #include <algorithm> #include <stdexcept> using namespace

  • C++ STL入门教程(3) deque双向队列使用方法

    一.简介 deque(Double Ended Queues,双向队列)和向量很相似,但是它允许在容器头部快速插入和删除(就像在尾部一样). 二.完整程序代码 /*请务必运行以下程序后对照阅读*/ #include <deque> #include <iostream> #include <algorithm> #include <stdexcept> using namespace std; void print(int num) { cout <&

  • C++ STL入门教程(6) set(集合)的使用方法

    一.简介 集合(Set)是一种包含已排序对象的关联容器,不允许有重复元素. 二.完整程序代码 /*请务必运行以下程序后对照阅读*/ #include <set> #include <iostream> using namespace std; int main() { ///1. 初始化 set<int> num; set<int>::iterator iter; cout << num.max_size() << endl;///s

  • nodejs入门教程三:调用内部和外部方法示例

    本文实例讲述了nodejs入门教程之调用内部和外部方法.分享给大家供大家参考,具体如下: 1.创建fun.js var fun3 = require('./fun3'); var fun2 = require('./fun2'); function fun1(){ console.log("我是fun1"); //exports的方式:exports 是给 module.exports 添加属性和方法 //fun2.obj.add(1,2); //fun3.print(); //mod

  • Springboot快速入门教程

    入门Springboot 项目创建在IDEA中创建即可. 注意点: 1.所有文件都需要放在 : Application文件的同级或下级目录中 2.application.properties 为 spring-boot 项目主核心配置文件,且只能有一个核心配置文件. 3.多环境下的核心配置文件的使用, 文件名必须以 application- 开头!   application-xxx.properties (1)开发环境 # 开发环境配置文件 server.port=9000 server.se

  • SpringBoot实战教程之新手入门篇

    目录 1.SpringBoot简介 2.SpringBoot安装 2.1.基于Maven的安装 2.2.基于Gradle的安装 3.创建HelloWorld应用 4.代码结构 5.Configuration类 5.1.导入其它配置 6.自动化配置 6.1.逐渐替换自动化配置 6.2.禁止特定的自动化配置 7.使用@SpringBootApplication注解 总结 1. SpringBoot 简介 Spring Boot 是由 Pivotal 团队提供的全新框架,其设计目的是用来简化 Spri

随机推荐