在DTO中使用注解的形式检验数据是否为空,为什么这么做

在这里插入图片描述
如上图,在一个DTO中使用了注解的形式进行参数的非空验证,为什么要这么做呢?
为什么不直接在使用时对参数进行非空验证呢?
首先说一下DTO的作用,表现层与应用层之间是通过数据传输对象(DTO)进行交互的,数据传输对象是没有行为的POCO对象(POCO就是简单CLR对象(Plain Old CLR Object),概念来源于Java中的POJO),它 的目的只是为了对领域对象进行数据封装,实现层与层之间的数据传递。为何不能直接将领域对象用于数据传递?因为领域对象更注重领域,而DTO更注重数据。不仅如此,由于“富领域模型”的特点,这样做会直接将领域对象的行为暴露给表现层。
并且,数据传输对象DTO本身并不是业务对象。数据传输对象是根据前台的需求进行设计的,而不是根据领域对象进行设计的。比如,company领域对象可能会包含一些诸如companyName,companyCode, Address等信息。但如果前台上不打算显示Address的信息,那么CustomerDTO中也无需包含这个 Address的数据。
在DTO中对非业务的数据进行验证,例如是否为空,并不需要业务上的验证,主要还是为了减少后台的校验过程,使代码更加简洁规范;而类似用户名是否重复这样需要业务上的验证的,是需要交给对应的controller层下的service进行处理。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,如果你需要返回Table1的DTO,并且DTO包含子表的数据,可以先定义一个DTO类,包含Table1的字段以及需要返回的子表的字段。代码如下: ```java public class Table1DTO { private Integer id; private String name; private List<Table2> table2List; // 省略getter和setter方法 } ``` 然后,使用MPJLambdaWrapper进行联表查询,同时使用selectList方法获取查询结果,并将结果转换为DTO对象。代码如下: ```java Wrapper<Table1> wrapper = new MPJLambdaWrapper<>(); wrapper.select(Table1::getId, Table1::getName, Table2::getId, Table2::getName, Table2::getAge, Table3::getAddress) .eq(Table1::getId, Table2::getId) .eq(Table2::getName, Table3::getName) .eq(Table3::getName, "xxx"); List<Map<String, Object>> result = table1Mapper.selectMaps(wrapper); List<Table1DTO> table1DTOList = result.stream() .collect(Collectors.groupingBy(map -> (Integer) map.get("id"))) .entrySet().stream() .map(entry -> { Table1DTO table1DTO = new Table1DTO(); table1DTO.setId(entry.getKey()); table1DTO.setName((String) entry.getValue().get(0).get("name")); List<Table2> table2List = entry.getValue().stream() .map(map -> { Table2 table2 = new Table2(); table2.setId((Integer) map.get("id")); table2.setName((String) map.get("name")); table2.setAge((Integer) map.get("age")); return table2; }).collect(Collectors.toList()); table1DTO.setTable2List(table2List); return table1DTO; }).collect(Collectors.toList()); ``` 这段代码的含义是:查询Table1的id字段、name字段、Table2的id字段、name字段和age字段,Table3的address字段,条件是Table1的id字段等于Table2的id字段,Table2的name字段等于Table3的name字段,且Table3的name字段等于"xxx"。然后,使用selectMaps方法执行查询,并返回结果。 接着,对查询结果进行处理,按照Table1的id字段进行分组,然后遍历每个分组,将分组的记录转换为Table1DTO对象。在转换过程,将Table1的id和name字段赋值给DTO对象,同时将分组的Table2记录转换为Table2对象,并添加到DTO对象的table2List属性。 最后,使用collect方法将转换后的DTO对象列表收集为一个List对象,并返回。 需要注意的是,这段代码没有进行分页查询。如果需要进行分页查询,可以在查询之前添加Page对象的相关代码,和之前的示例类似。 希望这个示例能够帮到你!

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值