技术标签: 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里呢? 我建议是不需要不强制。
文章浏览阅读975次。文章目录一、源码,详见地址二、实践篇1、导入依赖项目2、配置添加依赖项目3、把依赖项目设置为兼容的library(错误解决)声明:本教程不收取任何费用,欢迎转载,尊重作者劳动成果,不得用于商业用途,侵权必究!!!大概是在去年12月份写了一篇这样的文章,最近参照来看发现看的有些费劲,因为当时用的Markdown编辑器所以编辑和排版都相对比较麻烦不好观看,所以决定重新写一..._android 如果引用一个项目作为lib
文章浏览阅读97次。这里是修真院后端小课堂,每篇分享文从八个方面深度解析后端知识/技能,本篇分享的是:【Quartz】【修真院Java小课堂】任务调度-Quartz开场语:大家好,我是IT修真院北京分院第32期的学员廖友,一枚正直纯洁善良的Java程序员,今天给大家分享一下,修真院官网Java任务十中的知识点——任务调度-Quartz一、背景介绍:1、任务调度概念任务调度是指基于给定时间点,给定时间间..._quartz毕设参考文献
文章浏览阅读191次。一般情况下,我们安装好了linux系统,都希望通过工具能够进行远程管理,这样可以方便许多,但是有时候却无法通过这些工具连接,主要是由于我们没有安装远程的服务,如ssh及telnet这2个服务!命令方式安装:sudo apt-get install ssh 安装telnet方法:sudo apt-get install telnet Telnet..._linux不能通过工具访问远程
文章浏览阅读174次。在做springboot连接数据库时:方案1:在项目代码-数据库连接URL后,加上 (注意大小写必须一致)?serverTimezone=UTC方案2:在mysql中设置时区,默认为SYSTEM set global time_zone='+8:00'错误原因:使用了Mysql Connector/J 6.x以上的版本,然set global time_zone='+8:0...
文章浏览阅读4.1k次。在Spring Cloud Zuul中,Zuul本身有几个核心过滤器源码如下:其中 ServletDetectionFilter优先级最高 为-3 ,所以最先执行,这个核心过滤器只是做了一个判断当前请求是通过Spring的DispatcherServlet处理运行,还是通过ZuulServlet来处理运行,并把结果放回上下文中。一般般情况下,发送到API网关的外部请求都会被Spring..._zuul网关 file not allowed to upload!
文章浏览阅读3.6k次。该文章的前提是已安装Python(楼主安装版本为64bit的3.7版本),使用PySerial模块,该模块安装前可先安装pip(推荐安装,还可以用于安装其他模块,使用方便)一、安装PIP1、下载安装包,地址为:https://pypi.org/project/pip/#files2、下载完成后将其解压到python目录下:随后,cmd进入该目录下,并进入到pip-19.0..._phthon 脱机安装串口模块
文章浏览阅读3.2k次。据说是mac下才会发生,其实不是的,和播放器的音频解码方式有关,大家在调用write_videofile函数时加上参数audio_codec="aac",改变下声道编码即可_moviepy 音频不加载
文章浏览阅读1.9k次。_无法打开文件“msvcrtd.lib”
文章浏览阅读96次。以上代码包括实验代码,都能在这里找到SillyBoy作者:Pika链接:https://juejin.cn/post/7227029203656867899来源:稀土掘金著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。_动态so
文章浏览阅读1k次。今天遇到了sha的相关函数的应用,随手收集了点有用的资料,以后在看。。。。。。。HA1散列函数是很常用的散列函数,它产生160bit(20字节)长度的散列值。今天,我就来介绍利用OpenSSL现成的API来计算数据的SHA1散列值。先来看OpenSSL的相关API声明: #include unsigned char *SHA_基于openssl实现sha1算法哈希运算
文章浏览阅读4.6k次,点赞10次,收藏32次。PS:本系列笔记将会记录我此次在北京学习Unity开发的总体过程,方便后期写总结,笔记为日更。笔记内容均为 自己理解,不保证每个都对点乘求角度,叉乘求方向比如敌人再附近,点乘可以求出玩家面朝方向和敌人方向的夹角,叉乘可以得出左转还是右转更好的转向敌人Part 1 点乘:数学上的 点乘为 a * b = |a| * |b| * cos(Θ) Unity中的点乘也是如此 点乘结果为 ..._3d游戏中向量叉乘
文章浏览阅读262次。题目链接:http://poj.org/problem?id=3468题目大意:给出n个数的数值Q是对区间a,b的求和C是对区间a,b内的所有数都加上c思路:成段更新,需要用到延迟标记(或者说懒惰标记),简单来说就是每次更新的时候不要更新到底,用延迟标记使得更新延迟到下次需要更新or询问到的时候#include#include#include#include#inc