技术标签: pojo Java基础/JUC/JVM dto
本文讨论 POJO/DTO/DO/EO/VO/BO/PO/AO 的定义,另外讨论了这些xO在controller、service、dao/mapper层里的使用规范。另外还稍微讨论了controller中是否要 “轻逻辑”,mapper接口的规范等等问题。
在我们的java项目中存在各种xO的概念,如POJO/DTO/DO/EO/VO,还有些后端开发可能不太常见的BO/PO/AO。这里结合阿里Java手册以及其他博客的知识总结一下。这些xO一般都具有简单的结构,如setter/getter/toString
其实搞这么多xO,有时候真的会影响效率,尤其非大型公司需要快。
【阿里Java手册】
POJO(Plain Ordinary Java Object): 在本手册中,POJO 专指只有 setter/getter/toString 的简单类,包括 DO/DTO/BO/VO 等。
DO(Data Object):此对象与数据库表结构一一对应,通过 DAO 层向上传输数据源对象。
DTO(Data Transfer Object):数据传输对象,Service 或 Manager 向外传输的对象。
BO(Business Object):业务对象,由 Service 层输出的封装业务逻辑的对象。
AO(Application Object):应用对象,在 Web 层与 Service 层之间抽象的复用对象模型,极为贴 近展示层,复用度不高。
VO(View Object):显示层对象,通常是 Web 向模板渲染引擎层传输的对象。
Query:数据查询对象,各层接收上层的查询请求。注意超过 2 个参数的查询封装,禁止使用 Map 类来传输。
总结:这么多O,都搞晕了,感觉常用的就只有DTO;和表一一对应的类要不要后缀都不是很重要,所以DO也不是说很常用(当然有更好,能快速识别)
总结:controller入参用dto,出参也是dto(从service层返回的);service层入参是dto,出参dto;dao层入参不建议用dto而是分拆,出参dto或do。dao层接口不要用map作为入参,有不用map和list
http(s) 传参的方式
常见如下
键值对:Content-Type 是 x-www-form-urlencoded
。准确说是 “名值对”,因为是可以重复的,如 ?favor=music&favor=reading
中的favor。
特殊情况
form-data
。跟 “键值对” 不同之处是可传文件传 JSON:Content-Type 是 application/json
。注意和 “传JSON字串” 的表述区分开,后者是键值对的传参方式 ?jsonStr={}
路径参数:如 /user/9527,中的 9527 是路径参数
Controller 入参
Controller 出参
Service 层的入参
Service 层的出参
出参简单的,直接返回:如基本类型、包装类和String等
出参复杂的,返回 xxxRespDTO(或 xxxDTO)
反例:
Dao 层(Mapper)的入参
Dao 层(Mapper)的出参
@GetMapping("/user/list")
public List<ListUserDTO> listUser(String name) {
}
和
@GetMapping("/user/{name}")
public List<ListUserDTO> listUser2(@PathVariable("name") String name) {
}
会符合 "精确匹配优先" 的原则,即访问/user/list匹配上面的,假设有个name是 "list" 值的,就没办法调用到下面的方法;如果是非 "list",则匹配下面的方法。
------------------------------
@GetMapping("/user/{name}")
public List<ListUserDTO> listUser2(@PathVariable("name") String name){
}
@GetMapping("/user/{id}")
public QueryUserDTO queryUser(@PathVariable("id") Integer id){
}
这两个方法能正常启动springboot,但是只有在运行时抛出异常,即无法确认要匹配哪个方法。因为前端的传参本质上是没有字串和整形的区分的,本质都是字串,只是在spring框架里如需要会进行转换。
* dao层的mapper接口真的不建议使用pojo作为入参,强烈建议把字段分拆成基本类型、包装类和String即可。原因是:1、这样清晰一点;2、一般入参的个数不会很多,比较多入参的insert接口都交给了代码生成,完全不需要自己写这样的sql。3、pojo作为入参,比如这个pojo是service层传如的xxxReqDTO,但是这个dto里并非所有字段都是sql里的条件,所以这会造成不好维护。
* dao层的mapper更加不建议用map作为入参,看似灵活,实际过于灵活导致难以分析真正传入的参数
* dao层的mapper接口出参也不建议用Map<String, Object> 或 List<Map<String, Object>>,看似灵活,实际也是过于灵活导致很难维护,比如从map中get值,key写错时很难发现。我们希望在编码的早期阶段尽快暴露出这些bug
* service层的接口是可以调用其他同是service层的接口的。有时候为了共用接口,确实会有这样的需要。那被共用的接口是否要提取到类似CommonService里呢? 我建议是不需要不强制。
文章浏览阅读7.8k次,点赞3次,收藏9次。如何配置filezilla服务端和客户端百度‘filezilla server’下载最新版。注意点:下载的版本如果是32位的适用xp和win2003,百度首页的是适用于win7或更高的win系统。32和64内容无异。安装过程也是一样的。一、这里的filezilla包括服务端和客户端。我们先来用filezilla server 架设ftp服务端。看步骤。1选择标准版的就可以了。 _filezilla server for windows (32bit x86)
文章浏览阅读724次,点赞18次,收藏8次。深度学习作为一种强大的机器学习技术,已经成为图像处理领域的核心技术之一。通过模拟人脑处理信息的方式,深度学习能够从图像数据中学习到复杂的模式和特征,从而实现从简单的图像分类到复杂的场景理解等多种功能。要充分发挥深度学习在图像处理中的潜力,我们首先需要理解图像的本质。本文旨在深入探讨深度学习图像处理的基础概念,为初学者铺平通往高级理解的道路。我们将从最基础的问题开始:图像是什么?我们如何通过计算机来理解和处理图像?
文章浏览阅读62次。在收集到初步的样本数据之后,接下来该考虑的问题有:(1)样本数据集的数量和质量是否满足模型构建的要求。(2)是否出现从未设想过的数据状态。(3)是否有明显的规律和趋势。(4)各因素之间有什么样的关联性。解决方案:检验数据集的数据质量、绘制图表、计算某些特征量等,对样本数据集的结构和规律进行分析。从数据质量分析和数据特征分析两个角度出发。_数据分析 规律集
文章浏览阅读8.9k次。关于桌面上图标都不见了这类问题的解决方法1、在桌面空白处右击鼠标-->排列图标-->勾选显示桌面图标。2、如果问题还没解决,那么打开任务管理器(同时按“Ctrl+Alt+Del”即可打开),点击“文件”→“新建任务”,在打开的“创建新任务”对话框中输入“explorer”,单击“确定”按钮后,稍等一下就可以见到桌面图标了。3、问题还没解决,按Windows键+R(或者点开始-->..._上传文件时候怎么找不到桌面图标
文章浏览阅读1.5k次。参考:http://blog.csdn.net/zahuopuboss/article/details/9259283 #include #include #include #include #include #include #include #include #include #include #include #include _怎么设置tun的接收缓冲
文章浏览阅读741次。创建一个inputView继承于UIView- (instancetype)initWithFrame:(CGRect)frame{ self = [superinitWithFrame:frame]; if (self) { self.backgroundColor = [UIColorcolorWithRed:0.13gre
文章浏览阅读594次。字符串面试题(2022)_java字符串相关面试题
文章浏览阅读1.4w次,点赞12次,收藏21次。VSCODE 实现远程GUI,显示plt.plot, 设置x11端口转发问题服务器 linux ubuntu16.04本地 windows 10很多小伙伴发现VSCode不能显示figure,只有用自带的jupyter才能勉强个截图、或者转战远程桌面,这对数据分析极为不方便。在命令行键入xeyes(一个显示图像的命令)会failed,而桌面下会出现:但是Xshell能实现X11转发图像,有交互功能,但只能用Xshell输入命令plot,实在不方便。其实VScode有X11转发插件!!方法_vscode远程ssh连接服务器 python 显示plt
文章浏览阅读529次。网络编程_javase套接字socket
文章浏览阅读3.3k次,点赞2次,收藏2次。element switch开关文字显示element中switch开关把on-text 和 off-text 属性改为 active-text 和 inactive-text 属性.怎么把文字描述显示在开关上?下面就是实现方法: 1 <el-table-column label="状态"> 2 <template slot-scope="scope">..._el-switch 不同状态显示不同字
文章浏览阅读785次。java后台发起请求使用的工具类package com.cennavi.utils;import org.apache.http.Header;import org.apache.http.HttpResponse;import org.apache.http.HttpStatus;import org.apache.http.client.HttpClient;import org.apache.http.client.methods.HttpPost;import org.apach_httprequestutil.httpget
文章浏览阅读137次。在前两节我们部署了App-V Server并且序列化了相应的软件,现在可谓是万事俱备,只欠东风。在这篇博客里面主要介绍一下如何部署客户端并实现应用程序的虚拟化。在这里先简要的说一下应用虚拟化的工作原理吧!App-V Streaming 就是利用templateServer序列化出一个软件运行的虚拟环境,然后上传到app-v Server上,最后客户..._app-v 客户端