SpringBoot开发中使用DTO层的方法示例

 更新时间:2024年06月06日 11:43:11   作者:极客李华  
DTO层是在应用程序的业务逻辑层和数据访问层之间引入的一个中间层,用于在不同层之间传输数据,本文主要介绍了SpringBoot开发中使用DTO层,具有一定的参考价值,感兴趣的可以了解一下

在Spring Boot的开发过程中,使用DTO(Data Transfer Object)层是一个很常见的做法。DTO层是在应用程序的业务逻辑层和数据访问层之间引入的一个中间层,用于在不同层之间传输数据。本文将介绍DTO层的基本语法和为什么在Spring Boot开发中需要使用DTO层,并提供实际案例代码。

为什么需要DTO层?

在Spring Boot开发中,使用DTO层有以下几个重要原因:

1. 数据封装

DTO层可以将多个实体类的数据封装成一个DTO对象,使得数据传输更加方便。DTO对象通常只包含需要传输的数据字段,而不包含业务逻辑。这样可以减少数据传输的大小,提高性能。

2. 解耦合

DTO层可以将业务逻辑层和数据访问层解耦合。业务逻辑层可以通过DTO对象与数据访问层进行数据交互,而不需要直接操作数据库实体类。这样可以减少代码的耦合度,提高代码的可维护性和可测试性。

3. 数据格式转换

DTO层可以进行数据格式的转换。例如,将数据库实体类的数据转换成前端需要的JSON格式数据,或者将前端传递的JSON数据转换成数据库实体类需要的格式。这样可以简化数据转换的代码逻辑,提高开发效率。

4. 安全性

DTO层可以用于过滤敏感数据。在数据传输过程中,可以通过DTO层过滤掉不需要传输的敏感数据,保护数据的安全性。

示例代码

更好的封装数据

首先,定义一个DTO类,用于封装需要传输的数据字段:

public class UserDto {
    private String username;
    private String email;

    // 省略构造方法和getter/setter方法
}

然后,在业务逻辑层中使用DTO对象进行数据传输:

@Service
public class UserService {
    @Autowired
    private UserRepository userRepository;

    public UserDto getUserById(Long id) {
        User user = userRepository.findById(id);
        
        // 将User对象转换成UserDto对象
        UserDto userDto = new UserDto();
        userDto.setUsername(user.getUsername());
        userDto.setEmail(user.getEmail());
        
        return userDto;
    }

    // 省略其他业务方法
}

在上述代码中,getUserById方法从数据库中获取到一个User对象,然后将其转换成UserDto对象,只包含需要传输的数据字段。

最后,在控制器层中使用DTO对象进行数据传输:

@RestController
@RequestMapping("/users")
public class UserController {
    @Autowired
    private UserService userService;

    @GetMapping("/{id}")
    public UserDto getUserById(@PathVariable Long id) {
        // 调用业务逻辑层的方法获取UserDto对象
        UserDto userDto = userService.getUserById(id);
        
        return userDto;
    }

    // 省略其他控制器方法
}

在上述代码中,getUserById方法调用业务逻辑层的方法获取到一个UserDto对象,然后将其作为响应返回给前端。

通过使用DTO层,可以实现数据的封装、解耦合、数据格式转换和提高数据安全性。这样可以使代码更加清晰、可维护和可测试。

防止触发无参构造函数

当直接传递User类时,会触发无参构造函数。这是因为在Spring Boot中,默认使用的是无参构造函数来创建对象,然后通过反射来设置对象的属性。

下面是一个示例代码,演示了当直接传递User类时,会触发无参构造函数的情况:

public class User {
    private String username;
    private String email;

    public User() {
        System.out.println("User constructor called");
    }

    // 省略其他构造方法和getter/setter方法
}

@RestController
@RequestMapping("/users")
public class UserController {
    @PostMapping("/")
    public void createUser(@RequestBody User user) {
        // 创建User对象时会触发无参构造函数
        System.out.println("User created: " + user.getUsername());
    }
}

在上述代码中,User类定义了一个无参构造函数,并在构造函数中输出了一条日志。UserController类中的createUser方法使用@RequestBody注解将请求体中的JSON数据转换成User对象。当请求到达时,Spring Boot会自动创建一个User对象,并触发无参构造函数。

当我们发送一个POST请求到/users/接口,并传递以下JSON数据:

{
  "username": "john",
  "email": "john@example.com"
}

控制台会输出以下日志:

User constructor called
User created: john

可以看到,当直接传递User类时,会触发无参构造函数,并创建一个User对象。

需要注意的是,如果User类中定义了其他构造函数,Spring Boot会按照一定的规则选择合适的构造函数来创建对象。例如,如果定义了一个带参数的构造函数,并且没有定义无参构造函数,那么在创建对象时会触发带参数的构造函数。

总结起来,当直接传递User类时,会触发无参构造函数。这是因为Spring Boot默认使用无参构造函数来创建对象。如果需要使用其他构造函数,可以根据具体需求进行定义和配置。

到此这篇关于SpringBoot开发中使用DTO层的文章就介绍到这了,更多相关SpringBoot使用DTO层内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 详解Java单元测试之Junit框架使用教程

    详解Java单元测试之Junit框架使用教程

    单元测试就是针对最小的功能单元编写测试代码,Junit是使用Java语言实现的单元测试框架,它是开源的,Java开发者都应当学习并使用Junit编写单元测试。本文就来讲讲Junit框架的使用教程,需要的可以参考一下
    2022-05-05
  • Java实例讲解Comparator的使用

    Java实例讲解Comparator的使用

    我们先介绍一下comparator,我们后文称为比较器。比较器实际上是一个实现了comparator interface是一个实例,在Arrays.sort方法我们可以提供这样一个实例,即使被排序的object没有实现comparable接口,我们也可以排序了
    2022-11-11
  • SpringMVC 上传文件 MultipartFile 转为 File的方法

    SpringMVC 上传文件 MultipartFile 转为 File的方法

    这篇文章主要介绍了SpringMVC 上传文件 MultipartFile 转为 File的方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-02-02
  • springboot项目中application.properties无法变成小树叶问题解决方案

    springboot项目中application.properties无法变成小树叶问题解决方案

    这篇文章主要介绍了springboot项目中application.properties无法变成小树叶问题解决,本文通过图文实例代码相结合给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2023-09-09
  • javax.management.InvalidApplicationException的问题解决

    javax.management.InvalidApplicationException的问题解决

    javax.management.InvalidApplicationException是与Java Management Extensions (JMX) API相关的一个常见异常,本文主要介绍了javax.management.InvalidApplicationException的问题解决,感兴趣的可以了解一下
    2024-08-08
  • Struts2学习笔记(2)-路径问题解决

    Struts2学习笔记(2)-路径问题解决

    本文主要介绍Struts2的路径问题,尽量不要使用相对路径,使用相对路径会让路径问题变得很繁琐很麻烦,推荐使用绝对路径,希望能给大家做一个参考。
    2016-06-06
  • SpringBoot动态修改日志级别的操作

    SpringBoot动态修改日志级别的操作

    这篇文章主要介绍了SpringBoot动态修改日志级别的操作,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-07-07
  • Mybatis不支持batchInsertOrUpdate返显id问题

    Mybatis不支持batchInsertOrUpdate返显id问题

    这篇文章主要介绍了Mybatis不支持batchInsertOrUpdate返显id问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-05-05
  • Java中String和StringBuffer及StringBuilder 有什么区别

    Java中String和StringBuffer及StringBuilder 有什么区别

    这篇文章主要介绍了Java中String和StringBuffer及StringBuilder 有什么区别,String 是 Java 语言非常基础和重要的类,更多相关内容需要的小伙伴可以参考下面文章内容
    2022-06-06
  • SpringCache 缓存使用方案总结

    SpringCache 缓存使用方案总结

    在基于SpringBoot3.x集成JetCache时遇到问题,决定采用SpringCache作为替代方案,本文详细介绍了SpringCache本地缓存(Caffeine)和本地+远程(Redis)混合缓存的配置和使用方法,并总结了常用的缓存注解参数及其含义,感兴趣的朋友跟随小编一起看看吧
    2026-02-02

最新评论