针对复杂 SQL 查询,是直接在 controller 层调用 mapper,还是要包装一层 service?

258 天前
 lawsiki

项目中存在挺多这种情况,mybatis querywrapper 无法满足,需要手写 SQL ,但没有其他逻辑,或者比较简单的一些数据转换逻辑,每个都封装一个 service 方法感觉很多余,但是直接穿层调 mapper 好像又不合理,大佬们是怎么处理这种情况的?

2768 次点击
所在节点    程序员
23 条回复
luoyonghao
258 天前
还得是通过 service 调用。
wander555
258 天前
无所谓其实,消耗最大的还是 SQL 本生的执行
kerb15
258 天前
个人项目在 controller ,团队项目在 service
xiaolongorigino
258 天前
我认为还是通过 Service 调吧,但如果你真的确定这个 SQL 怎么都不会有多个 SQL 操作这种事务需求或者未来对其处理也不会做什么变更,直接调也没人会说你,小细节
lawsiki
258 天前
@xiaolongorigino 都是查询统计的 SQL
msaionyc
258 天前
放 service 层可以复用,可以很方便地做事务控制。如果确定没有其他场景用这个 sql ,放 controller 里也行,能过 cr 就行
Rocketer
258 天前
我们 controller 只负责校验和转发接收到的数据,任何处理都在 service 层
james2013
258 天前
放在 service
如果闲麻烦,可以用插件或者工具一键生成 controller,service,service 实现类,mapper,实体类等
dayudayupao
258 天前
抽一层的目的只是为了解耦和更好的抽象,不要被这个局限了,但是也不能不要,根据情况自己调整,有强制规范就按规范来,没强制规范自己能看懂能维护就行
huangzongzhuan
258 天前
评论区都非常理性~
gam2046
258 天前
啊这...好像只有我一个人和你们不一样,全都是调用的存储过程,代码里就没有 SQL 语句,后面的活都是给 DBA 干的了,我也不知道数据库到底长什么样子。
chenPiMeiHaoChi
258 天前
我有强迫症,controller 必须干净统一整齐,都拉在 service 里。
yule111222
258 天前
可以不写 service
abcbuzhiming
258 天前
@gam2046 应该是老项目吧,这种模式只在比较老的项目才这么干,或者你们的 sql 特别麻烦,新项目很少这么干的,DBA 首先很贵,其次存储过程难以调试
ghost024
258 天前
在 service 里面,第一是可以复用,并且一旦需要把查询出来的数据做一些逻辑处理的话可以直接在 service 的那个方法里面做,第二 controller 层按道理是不应该有任何业务逻辑的,这样能在 controller 层保持干净,如果项目规模不大你在 controller 层直接注入 mapper 看似没什么,但是一旦代码规模起来会变得很丑陋,你在 controller 的代码会变的越来越长,最后 service 层形同虚设,又要重构。
chenfcheng
258 天前
后面讲不准会拆 sql 吧
zxcvbnm1992
258 天前
抓到一直菜狗
zxcvbnm1992
258 天前
过来看我的代码怎么写的
gejun123456
258 天前
都行,看你的项目,小项目快速开发直接 controller 调用,后期有需要再抽到 service 里面,大项目的话弄个 service 好点
dssxzuxc
258 天前
把垃圾放一楼还是二楼的问题,不可复用的代码,放哪都行,可复用或者可能复用的,放 service 。代码一律放 service 的多半是常年这么写习惯了或者有强迫症,实际上放 controller 当然没问题。如果是我自己的项目,我用 mybatisplus ,不可复用的全写 controller 了,并且只使用 service ,mapper 都用不到,第一眼就能看到实际代码。如果是微服务并且几乎全是单表查询,mapper 层都可以删了。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/968196

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX