别再伺候框架了:一个条件类看懂 SimpleDAO 的全部哲学——回归 SQL 本质的三件事

发布时间:2026/9/27 6:41:05

别再伺候框架了:一个条件类看懂 SimpleDAO 的全部哲学——回归 SQL 本质的三件事 先看一段代码再决定要不要读这篇文章SetterGetterpublicclassReportCondextendsBaseCondition{/** * 方法说明 拼加条件 **/OverrideprotectedvoidaddCondition(){add(AND r.build_number ?,buildNumber);// 等值add(AND r.school_id ?,schoolId);// 等值add(AND r.school_year_id ?,schoolYearId);// 等值add(AND r.layer ?,layer);// 等值add(AND s.student_name LIKE ?,studentName,3);// 模糊查询自动拼 %add(AND g.class_teaching_id ?,classTeachingId);// 联表字段照样用add(AND p.snap_date ?,startDate);// 范围 add(AND p.snap_date ?,endDate);// 范围 in(r.school_id,schoolIds);// IN 集合}}单表字段、联表别名、等值、范围、模糊、IN——一行一个条件SQL 语义原样可见判空、占位符、参数收集、%拼接全部隐去。这段代码来自一个真实生产项目查寝月报——七表关联、派生子查询、31 天动态列、Excel 导出、数据权限。整个功能没有一行代码在“伺候框架”。它背后是一套被大多数人忽略的真相数据库访问本质上只有三件事。一、本质数据库访问就三件事别的都是扯犊子抛开一切框架视角访问数据库只需要准备 SQL准备参数把结果拿回来所有持久层框架做的事本质都是在这三件事之间插入“翻译层”。MyBatis 把 SQL 翻译进 XMLJPA 把 SQL 翻译成对象图jOOQ 把 SQL 翻译成 DSL——翻译不产生任何新能力只产生学习成本、运行成本和扩展成本。SimpleDAO 不翻译 SQL只收口样板。站在 Spring JDBC 的肩膀上连接、事务、异常它已全部解决补上最后一块拼图动态 SQL 参数的组织方式。设计哲学一句话SQL 的语义关键字、运算符、表达式坚决不翻译保证 100% 可见SQL 的劳动判空、拼接、收集、对齐全部抽象保证 0% 重复。二、单表 CRUDDAO 是一个空类RepositorypublicclassUserDaoextendsBaseDaoUser{}没了。增删改查、分页、逻辑删除配置级切换logic-delete.field: is_deleted、审计字段自动填充全部开箱即用。还记得“单表解决 80% 业务”的话术吗拆开看增删改场景永远在单表上不管系统多复杂这部分用空类就解决了而真正承载业务价值的查询几乎全是多表——恰恰是其他框架最痛的地方SimpleDAO 原生 SQL 直给两头都不妥协。三、联表查询SQL 怎么写代码就怎么写privatefinalstaticStringSQL SELECT t.*,u.name user_name,u.phone user_phone,u.email user_email FROM bus_order t LEFT JOIN sys_user u ON t.user_id u.id;publicPageOrderVopageJoin(OrderCondcond){returnpage(SQL,cond,OrderVo.class);}Java 21 文本块让 SQL 保持原生排版拷出来直接在数据库客户端跑——这就是“完整可见度”的验收标准。没有 XML 跳转没有gt;转义税没有标签塔。四、子查询条件类是“可插拔的 SQL 零件”这是整套设计最锋利的地方——条件类不是“拼 WHERE 的工具”而是一段可嵌任何位置的带参 SQL 片段publicListMonthReportlistJoin(ReportCondreport,SnapCondsnap){StringsqlSELECT ... FROM ( SELECT DISTINCT p.bed_id,p.student_id,p.grade_id FROM dorm_bed_snap p JOIN dorm_bed b ON ... snap.where()// 条件零件①嵌进派生子查询 ) d JOIN ... LEFT JOIN sys_user m ON ... report.where()// 条件零件②嵌进主查询 ORDER BY ...;returnlist(sql,MonthReport.class,mergeParams(snap,report));// 参数按 ? 顺序显式合并}两个条件类各自嵌进 SQL 的两个不同位置mergeParams按出现顺序一次声明清楚——显式、清晰、零魔法。参数顺序不是风险是设计能力。五、横切关注点注解一行业务零感知数据权限 / 多租户——因为条件统一收口在BaseCondition一个 AOP 切面就能从外部注入Before(annotation(auth))publicvoidbeforeQuery(JoinPointpoint,DataAuthauth){BaseConditioncond(BaseCondition)point.getArgs()[0];cond.setExtendCondition( AND auth.userField() IN (userId,0));}生产代码里就是一行BusinessAuth(userFieldsc.teach_master,schoolFieldsr.school_id)publicListMonthReportlistJoin(ReportCondreport,SnapCondsnap){...}对比 MyBatis同一个需求要走 Interceptor 拦截四大对象、篡改 BoundSql、解析带别名的列——那不叫扩展叫翻墙。多数据源同样直给AbstractRoutingDataSourceChange(db1)BaseDao 因为底层就是 Spring JDBC天然跟随数据源路由零改造。六、为什么说 MyBatis 是“最麻烦的拼字符串”撕开 XML 那层皮MyBatis 不也是拼字符串吗区别在于翻译了 SQL 本体抽象了样板结论原生 JDBC否否全是劳动SimpleDAO否底线是全收口劳动归框架语义归开发者MyBatis是动态部分翻到 XML否双向皆输ORM / jOOQ是部分翻译税换部分抽象MyBatis 的if testxxx ! null and xxx ! 没有消灭判空劳动只是把它从 Java 的 if 换成 XML 的标签——同样的劳动用更难的语言重做一遍。抽象的定义是消灭重复劳动翻译的定义是换个地方重做同样的劳动。再看信噪比。同一个“多条件报表查询”!-- MyBatisSQL 只占 1/3其余全是标签骨架 转义 --ifteststudentName ! null and studentName ! AND s.student_name LIKE CONCAT(%, #{studentName}, %)/if// SimpleDAO一行全是业务语义% 自动拼add(AND s.student_name LIKE ?,studentName,3);业务浓度 95% vs 30%。代码生命周期里 80% 的时间是读不是写——这就是差距的复利。七、ORM 和 DSL 呢一并说清真 ORM 几乎不可用——标量子查询、派生表、半连接、窗口函数、复杂 JOIN关系对象化全部做不到只能靠nativeQuery逃生通道落点正是原生 SQL 三件事直给。脏检查、缓存一致性、N1全是 ORM 自己制造的病——医之好治不病以为功SQL 直给的世界里这些病没有发生的条件。jOOQ 表达力确实几乎无上限但收益严重倒挂你已经会 Java、会 SQL再学一整套 DSL 方言换来的类型安全只检查“字段名拼没拼对”——逻辑错误查不出表结构变更查不出而拼写错误任何一次测试运行就暴露。为最低级的错误付出最高级的学习成本。八、实战验收一个生产级月报功能某 CRM 系统的查寝月报多校区、多学年、七表 JOIN、派生子查询、31 天动态列、Excel 导出、数据权限、字典翻译。架构是标准的 11 查询 内存组装两条 SQL 各取所需报表骨架 当月全部快照明细内存里MapbedId#studentId#gradeId#日期, 状态组装switch 枚举统计SQL 只负责取数能力上限 数据库上限组装交给 Java能力上限 Java 上限整套功能没有任何一行在伺候框架没有为迁就框架简化查询没有为动态 SQL 拆请求没有为权限改业务代码。框架透明业务完整。总结数据库访问 准备 SQL、准备参数、拿回结果。SQL 语义坚决不翻译SQL 劳动全部收口。框架越薄天花板越高中间层越少问题越少。问题不是被解决的是没有发生的条件。相关仓库核心框架源码https://gitee.com/gao_zhenzhong/simple-dao管理系统完整底座RBAC 权限、鉴权、前后端脚手架https://gitee.com/gao_zhenzhong/simple-dao-starter代码生成器一键生成 Entity、Cond、Dao、Service、Controller、VO、前端页面https://gitee.com/gao_zhenzhong/simple-dao-coder实战案例仓库单表、联表、CTE 报表、多条件合并、数据权限、脱敏全套 Demo内置 H2 内存库克隆即跑https://gitee.com/gao_zhenzhong/simple-dao-demo觉得有道理的话点个赞、留个 Star欢迎在评论区交流。
延伸阅读

更多相关文章

2026/9/27 6:36:05

后端服务集成国产 LLM 网关:基于延迟与成本的架构选型实录

后端服务集成国产 LLM 网关:基于延迟与成本的架构选型实录上周有个需求,我们要在 Spring Boot 3.4.5 的微服务架构中嵌入代码辅助与长文档摘要功能。核心痛点不是“能不能用”,而是“选哪家才不亏”。市面上 GLM-5.3、DeepSeek-V4.1、Kimi K3…

2026/9/27 6:36:05

一个完整的网站推广方案对比评测

拒绝瞎折腾:一份落地执行的网站推广避坑指南 网站上线三个月,后台日志里除了蜘蛛就是你自己?这种“网站做好了没人访问”的憋屈感,相信很多做站的朋友都经历过。别急着怪搜索引擎变脸,很多时候是我们推广思路没理顺,钱花在了刀刃外。今天咱们不聊虚的,…

2026/9/27 6:36:05

谷粉学术课堂:AI+生物文献综述与知识图谱构建

生物医学文献正以惊人的速度增长,仅靠人工阅读与整理,已难以支撑系统的知识梳理。2026年,大语言模型与知识图谱的结合,正在把文献工作从“逐篇精读”推向“批量理解、自动关联、辅助发现”的新阶段。对于生物信息学、药理学及转化…

2026/9/27 7:41:08

Puppet device 子命令实战指南:用 proxy agent 管理远程网络设备

运维DevOpsIaC 【免费下载链接】puppet Server automation framework and application 项目地址: https://gitcode.com/gh_mirrors/pu/puppet 点击查看 免费下载 导读 puppet device 是 Puppet 项目中专门用于管理远程网络设备(交换机、路由器等无法直…

2026/9/27 0:00:45

东莞市品牌网站建设报价常见报错与解决

东莞品牌网站建设报价单背后:一份保姆级建站教程避坑实录 网站做好了没人访问,这大概是很多老板最头疼的事。花了大几万做的品牌站,上线后流量惨淡,比路边摊还冷清。别急着骂外包公司,很多“东莞品牌网站建设报价”里藏着不少猫腻,比如用模板站冒充定制…

2026/9/27 0:00:45

如何划分训练/验证集:Spirula Studio五种eval_mode策略详解

如何划分训练/验证集:Spirula Studio五种eval_mode策略详解 【免费下载链接】spirula-studio Cross-vendor 3D Gaussian Splatting trainer - video to splat to mesh, Vulkan or CUDA. 项目地址: https://gitcode.com/GitHub_Trending/sp/spirula-studio Sp…

2026/9/27 0:00:45

SEO怎么推广速查手册新手避坑实战指南

SEO怎么推广速查手册新手避坑实战指南 模板网站太丑不够用?别急着加滤镜,那是治标不治本。很多老板盯着后台流量掉得眼红,却还在纠结首页Banner的圆角是不是3像素。这就像穿着西装去挖土,姿势不对,努力白费。我整理这份 速查手册…

2026/9/27 0:00:45

东莞市品牌网站建设报价常见报错与解决

东莞品牌网站建设报价单背后:一份保姆级建站教程避坑实录 网站做好了没人访问,这大概是很多老板最头疼的事。花了大几万做的品牌站,上线后流量惨淡,比路边摊还冷清。别急着骂外包公司,很多“东莞品牌网站建设报价”里藏着不少猫腻,比如用模板站冒充定制…

2026/9/27 0:00:45

如何划分训练/验证集:Spirula Studio五种eval_mode策略详解

如何划分训练/验证集:Spirula Studio五种eval_mode策略详解 【免费下载链接】spirula-studio Cross-vendor 3D Gaussian Splatting trainer - video to splat to mesh, Vulkan or CUDA. 项目地址: https://gitcode.com/GitHub_Trending/sp/spirula-studio Sp…

2026/9/27 0:00:45

SEO怎么推广速查手册新手避坑实战指南

SEO怎么推广速查手册新手避坑实战指南 模板网站太丑不够用?别急着加滤镜,那是治标不治本。很多老板盯着后台流量掉得眼红,却还在纠结首页Banner的圆角是不是3像素。这就像穿着西装去挖土,姿势不对,努力白费。我整理这份 速查手册…

2026/9/25 20:55:38

USB Type-C PCB布局分区设计:电源、高速信号与PD协议全攻略

做硬件这行,Type-C接口算是典型的“看着简单,做起来全坑”的东西。光引脚就24个,高低速信号、电源、控制线全部塞在一个小小的连接器里,如果PCB布局不做规划,打样回来基本就是“插上没反应”、“高速掉线”、“静电一打…

2026/9/26 19:58:38

系统编程学习原型如何补齐稳定性边界

系统编程学习原型如何补齐稳定性边界预算有限时&#xff0c;我先优化明显多余的复制&#xff0c;而不是猜测性地换容器。用借用传递只读数据通常就能减少分配&#xff1a; fn parse(line: &str) -> Result<Item, Error> { /* ... */ }用基准确认热点确实在分配&am…

2026/9/25 18:34:56

雨花区哪家财务公司代理记账比较好?

在雨花区&#xff0c;企业处理财税事务常常面临诸多挑战&#xff0c;选择一家靠谱的财务公司至关重要。湖南巨勤财务管理咨询有限公司就是本地正规实体财税服务机构&#xff0c;深耕本地工商财税行业多年&#xff0c;熟悉当地工商局、税务局最新政策与申报流程。主营公司注册、…

还想了解更多?直接咨询顾问

免费诊断 + 免费方案 + 透明报价。

全国咨询热线400-8866-253
免费获取方案
☎咨询二维码 ☎ ↑