作者:kane君 链接:https://www.zhihu.com/question/438832773/answer/1691336666 来源:知乎 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
jpa确实很不错了,这两个框架也都没必要吹,只是要看具体的场景,选择合适的
既然问题问的是mybatis,那我给个简化过的场景,随手写的没有验证,大家简单扫一眼,知道意思就好了
CREATE TABLE class
(
id long,
name text
) comment '班级表';
CREATE TABLE student
(
id long,
class_id long
) comment '学生表';
CREATE TABLE course
(
id long,
name text
) comment '课程表';
CREATE TABLE exam
(
id long,
course_id long
) comment '考试表';
CREATE TABLE score
(
student_id long,
exam_id long,
val double
) comment '成绩表';
# 统计每个班级的各科累积成绩的平均值(仅统计有成绩的学生)
SELECT c.name,
co.name,
SUM(s.val) / COUNT(DISTINCT IF(s.val IS NOT NULL, st.id, NULL))
FROM score s
LEFT JOIN student st ON st.id = s.student_id
LEFT JOIN exam e ON e.id = s.exam_id
LEFT JOIN course co ON co.id = e.course_id
LEFT JOIN class c on c.id = st.class_id
GROUP BY c.id, c.name, co.id, co.name
ORDER BY c.name, co.name
这个场景已经非常努力的简化过了,看看最后那句sql,想想这种东西jpa如果不用 nativeQuery 的话得写多少行代码才能实现?
如果用 nativeQuery 的话,它比 mybatis 更优吗?
在我遇到的真实场景里,没有学生,也没有考试,更没有这样简单
事实上在那个场景里随便拉出一句sql就有上百行,整个项目到处都有类似的统计代码,不说人读起来吃力,就连机器构建语法树都要等上好一会
为什么人和机器读起来都吃力?因为这个场景用的真的就是jpa,真的就是 nativeQuery 在 java 文件里写了几千行,就这还是重构后的结果
在重构之前,那位程序员写的倒是更面向对象,把每条记录都查出来,在jvm做聚合运算.......每一个运算步骤之后jpa都会带着上千个参数回数据库里查询...想想就恐怖