定位:Spring JDBC Ultra
这不是在 Spring JDBC 之上另起炉灶,而是它的增强版、终极形态。
就像 Intel 的 Ultra 系列——底层架构完全一致,但把性能、易用性、扩展性推到极致。Spring JDBC Ultra 和 Spring JDBC 的关系也是如此:所有 Spring 基建完全共享,只是在开发体验和扩展能力上做到了极致。
你学的不是新框架,是 Spring JDBC 的最佳实践。
一、基建层:Spring 生态全共享(最大的根收益)
| 能力 | Spring JDBC Ultra 的实现方式 |
|---|---|
| 事务 | 直接用@Transactional,100% 原生 |
| 多数据源 | Spring 多数据源直接使用,无需适配 |
| 连接池 | HikariCP、Druid 随便配,标准 Spring Boot 配置 |
| 监控 | Actuator 自动监控数据源健康、SQL 执行情况 |
| 缓存 | Spring Cache 在 Service 层直接用 |
| AOP | 扩展所有横切能力,零门槛 |
| 自动配置 | Spring Boot AutoConfiguration 标准套路 |
一句话收益:没有适配层、没有桥接层、没有拦截器污染。你学 Spring 花的时间,一分都没浪费。
对比:MyBatis 的 Spring 集成是“桥接适配”,底层隔了一层;JPA 是“重写引擎”,完全脱离 Spring JDBC。只有 Spring JDBC Ultra 是“本来就是 Spring 的一部分”。
二、对象层:单表零配置 + 自动审计 + 逻辑删除
@RepositorypublicclassUserDaoextendsBaseDao<User>{// 空类,全部 CRUD 能力自动获得}| 能力 | 收益 |
|---|---|
| 零配置 CRUD | 继承空类,立即拥有save、update、delete、findById、list、page全套方法 |
| 两个注解搞定 | @Table指定表名,@Id标记主键,没有 XML、没有 Mapper、没有 namespace |
| 审计字段自动填充 | createTime、createBy、updateTime、updateBy在save/update时自动注入 |
| 逻辑删除自动处理 | 配置logic-delete.field=dr,delete自动变UPDATE SET dr=1,list/page自动过滤 |
| 主键策略可切换 | @Id("snow")雪花 /@Id("uuid")UUID /@Id("auto")自增 |
| 批量操作 | saveBatch、replaceBatch,一条语句批量写入 |
一句话收益:单表开发工作量归零。你只需要定义实体类,DAO 层彻底消失。
三、条件层:5 个 add 覆盖一切(最核心的收益)
3.1 元语集 —— 5 个方法通杀
| 方法 | 覆盖场景 |
|---|---|
add(String sql) | 固定片段:AND status = 1、子查询整段、CTE |
add(String sql, Object value) | 带参数:AND age > ?、AND name = ? |
add(String sql, Object[] values) | IN 数组:AND id IN (?,?,?) |
add(String sql, String value, int site) | 模糊查询:LIKE '%张%'(site=3) |
add(String sql, boolean logic) | 条件开关:只有 flag=true 才拼 |
一句话收益:你不需要学几十个标签、一百多个属性、十几个注解。5 个方法,5 分钟学会,用一辈子。
3.2 消灭 90% 的 if
<!-- MyBatis XML:每个条件 3 行 --><iftest="name != null and name != ''">AND t.name LIKE CONCAT('%', #{name}, '%')</if><iftest="ageMin != null">AND t.age >= #{ageMin}</if><iftest="ageMax != null">AND t.age<= #{ageMax}</if>// Spring JDBC Ultra:每个条件 1 行add("AND t.name LIKE ?",name,3);add("AND t.age >= ?",ageMin);add("AND t.age <= ?",ageMax);框架内部自动判空,值传null则自动跳过。所有单值条件、数组条件、字符串条件,全自动判空。
一句话收益:每个条件省 2 行,一个查询 10-20 个条件,省 20-40 行。整个项目代码量减少 60-80%。
3.3 单表 ↔ 连表,思维不割裂
// 单表条件类(框架自动加 t. 别名)protectedvoidaddCondition(){and("name LIKE",name,3);and("age >= ?",ageMin);}// 连表条件类(同一个写法,换个别名)protectedvoidaddCondition(){add("AND u.name LIKE ?",userName,3);add("AND o.order_no IN ",orderNos);}一句话收益:单表积累的条件逻辑,连表直接复用。没有从Wrapper退回到 XML 的断层,没有从链式调用切换到标签的认知切换。
3.4 真动态条件(addDynamic)—— 框架级安全注入
// 数据权限 AOP 中cond.addDynamic(" AND "+auth.userField()+" IN",newObject[]{0,userId});- 运行时注入任意字段、任意条件
- 参数值依然走
PreparedStatement占位符,SQL 注入被框架级免疫 - MyBatis 实现类似功能必须用
${}字符串拼接,安全风险直线上升
一句话收益:数据权限、多租户、行级安全等横切关注点,10 行 AOP 代码搞定,而且绝对安全。
3.5 任意 SQL 片段,不受限
-- 半连接add("AND EXISTS (SELECT 1 FROM bus_order o WHERE o.user_id = t.id)");-- CTEadd("WITH ranked AS (SELECT *, ROW_NUMBER() OVER (PARTITION BY user_id ORDER BY create_time DESC) rn FROM bus_order)");add("AND t.id IN (SELECT user_id FROM ranked WHERE rn = 1)");-- 窗口函数add("AND t.create_time >= (SELECT AVG(create_time) FROM t_order)");一句话收益:SQL 能力无上限。Spring JDBC Ultra 不解析、不改写、不限制你写的 SQL。SQL 能表达什么,Spring JDBC Ultra 就能执行什么。
四、执行层:分页 + 自动映射 + 日志 + 安全
4.1 分页:两种策略,全场景覆盖
// 标准分页:智能 COUNT,性能最优Page<User>page=userDao.page(cond);// 兜底分页:子查询包裹,兼容 UNION、窗口函数等Page<User>page=userDao.page0(sql,cond,UserVO.class);- 自动从
BaseCondition读取page、size - 方言自动适配:MySQL、PostgreSQL、Oracle、SQL Server、H2、SQLite、国产数据库全支持
page()智能找第一个不在括号内的FROM生成 COUNT SQLpage0()子查询法,兼容一切复杂 SQL
一句话收益:一行代码完成分页,不需要 PageHelper、不需要手写 COUNT、不需要关心不同数据库的LIMIT/OFFSET/ROWNUM。
4.2 自动映射
// 单表返回实体List<User>list=userDao.list(cond);// 连表返回 VO(字段名自动匹配)Page<OrderVO>page=orderDao.page(JOIN_SQL,cond,OrderVO.class);- 下划线 ←→ 驼峰自动转换
- 不需要写
resultMap,不需要@Results - 连表查询的额外字段直接定义在 VO 中,自动映射
一句话收益:省掉 MyBatis XML 里那一堆<resultMap>和<association>/<collection>标签。
4.3 方法级日志控制
userDao.save(true,user);// 打印日志userDao.save(false,user);// 不打印一句话收益:生产环境全局关闭,调试时按需开启,不需要改 logback 配置,不需要重启。
4.4 打印带参 SQL(复制即执行)
-- 打印出来的 SQL 完整可直接执行SELECT*FROMsys_user tWHEREt.nameLIKE'%张%'ANDt.age>=20ANDt.age<=30- 参数已经替换成真实值
- 字符串加引号、日期格式化、null 变
NULL - 批量操作每条记录独立打印
一句话收益:调试效率提升 10 倍以上。遇到问题,日志里复制 SQL 直接跑,不需要手动替换?占位符。
4.5 安全兜底
// 强制 WHERE 检查——防止全表误操作if(!WHERE_PATTERN.matcher(sql).find()){thrownewIllegalArgumentException("危险操作被拦截: SQL 没有WHERE条件");}一句话收益:update和delete执行前强制检查必须有WHERE子句,违规直接熔断。
五、扩展层:白盒 + AOP,零门槛
5.1 MyBatis 的拦截器为什么让 80% 的程序员望而却步?
实现一个数据权限,在 MyBatis 里得这样:
- 实现
Interceptor接口 - 在
intercept()方法里拿到StatementHandler/BoundSql - 通过反射拿到
parameterObject,判断是不是BaseCondition或其子类 - 用正则或者字符串替换去修改
BoundSql.sql,拼入AND receiver = ? - 还得小心翼翼地处理分页插件、缓存插件之间的顺序问题
你写 20 行代码,连业务的边都摸不着。这 20 行里:10 行扒 MyBatis 内部对象,5 行做反射取值,剩下 5 行才是真正的业务逻辑。
5.2 Spring JDBC Ultra 的扩展:AOP + BaseCondition 公开 API
@Aspect@ComponentpublicclassDataAuthAspect{@Before("@annotation(auth)")publicvoidbeforeQuery(JoinPointpoint,DataAuthauth){BaseConditioncond=(BaseCondition)point.getArgs()[0];StringuserId=request.getHeader("X-User-Id");cond.addDynamic(" AND "+auth.userField()+" IN",newObject[]{0,userId});}}- 不需要理解
StatementHandler、BoundSql、Executor - 不需要反射扒内部状态
- 不需要字符串替换 SQL
- 只需要会 Spring AOP + BaseCondition 公开 API
一句话收益:100% 的后端开发,10 分钟内能写出数据权限扩展。MyBatis 拦截器 80% 程序员搞不定,Spring JDBC Ultra 的扩展 100% 程序员都能搞定。
六、认知负担:零学习成本
| 维度 | MyBatis | JPA | Spring JDBC Ultra |
|---|---|---|---|
| 需要学的 API | 几十个标签 + 100+ 属性 + 十几个注解 | Criteria API + JPQL | 5 个 add 方法 |
| 需要学的表达式 | OGNL | JPQL 语法 | 无 |
| 单表 / 连表 | 两套(Wrapper + XML) | 两套(ORM 对象 + SQL) | 一套(BaseCondition) |
| 分页 | PageHelper 或手写 | Pageable | page() / page0() |
| 结果映射 | resultMap / @Results | 自动(但黑盒) | BeanPropertyRowMapper |
| 扩展 | Interceptor(高门槛) | Listener(有限) | AOP(零门槛) |
一句话收益:你不需要学框架的私有语法,你只需要会SQL + Java + Spring。学的东西永远保值。
七、综合收益对比
| 维度 | 传统 ORM | Spring JDBC Ultra |
|---|---|---|
| 底层基建 | 适配 Spring 或脱离 Spring JDBC | 100% Spring 原生 |
| 代码量 | 基准 | 减少 60-80% |
| 学习成本 | 2-5 天 | 20 分钟(5 个 add) |
| 单表→连表过渡 | 断层,需重写 | 无缝,条件复用 |
| 条件判空 | 每个条件写 if | 自动判空,消灭 90% |
| 调试体验 | 占位符 SQL,手动替换 | 完整 SQL,复制即用 |
| 扩展门槛 | 80% 程序员搞不定 | 100% 程序员轻松搞定 |
| SQL 能力上限 | 框架限制 | SQL 的上限 |
| 性能 | 有损耗 | ≈ Spring JDBC |
| 安全 | 需人工防护 | 框架级免疫 |
| 认知负担 | 极高(两套体系) | 极低(一套元语) |
八、结语
Spring JDBC Ultra 的收益是全方位的、立体化的:
- 基建层:Spring 所有能力完全共享
- 对象层:单表零配置、审计自动填、逻辑删除自动处理
- 条件层:5 个
add覆盖一切,单表连表无缝过渡 - 执行层:分页两种策略、自动映射、完整 SQL 打印
- 扩展层:白盒 + AOP,100% 开发者轻松搞定
- 安全层:PreparedStatement + 强制 WHERE + 动态安全检测
- 认知层:只学 SQL + Spring,没有私有语法
Spring JDBC Ultra 没有制造新的认知负担,它只是把 Spring JDBC 用到了极致。
你学的东西不会浪费,你写的代码没有冗余,你调试的 SQL 就是最终执行的 SQL。
这就是Spring JDBC Ultra的全部含义。
九、全链路工具集
源码与案例地址
核心框架源码:https://gitee.com/gao_zhenzhong/simple-dao
系统底座:https://gitee.com/gao_zhenzhong/simple-dao-starter
代码生成器:https://gitee.com/gao_zhenzhong/simple-dao-coder
**实战案例 **:https://gitee.com/gao_zhenzhong/simple-dao-demo
快速开始(3 步)
第一步:引入依赖
<dependency><groupId>io.gitee.Spring JDBC Ultra</groupId><artifactId>simple-dao</artifactId><version>1.2.1</version></dependency>第二步:定义实体
@Data@Table("sys_user")publicclassUser{@IdprivateLongid;privateStringname;privateIntegerage;privateStringemail;privateLocalDateTimecreateTime;privateLongcreateBy;privateLocalDateTimeupdateTime;privateLongupdateBy;privateBytedr;}第三步:继承 BaseDao
@RepositorypublicclassUserDaoextendsBaseDao<User>{// 空类,全部 CRUD 能力自动获得}开始使用:
@AutowiredprivateUserDaouserDao;// 单条插入Useruser=User.builder().name("张三").age(25).email("zhangsan@QQ.com").build();userDao.save(user);// 条件分页查询UserCondcond=UserCond.builder().name("张").ageMin(20).ageMax(30).build();Page<User>page=userDao.page(cond);// 联表查询publicPage<OrderVO>pageJoin(OrderCondcond){Stringsql="SELECT t.*, u.name user_name FROM bus_order t LEFT JOIN sys_user u ON t.user_id = u.id";returnpage(sql,cond,OrderVO.class);}📚 全套教程总览
| 集数 · 标题 | 本集目录 | 时长 |
|---|---|---|
| 01 · 单表 CRUD + 审计 + 逻辑删除 | 实体注解 · 空 DAO · 保存审计 · ID查询 · 分页 · 逻辑删除 | 约 6 min |
| 02 · 联表查询 + 分页 | 联表 SQL · VO定义 · 条件类 · page调用 · 高性能COUNT | 约 4 min |
| 03 · 条件进阶:IN + 子查询 | IN自动展开 · 子查询拼接 · add vs and · 三种动态边界 | 约 6 min |
| 04 · 多表联查 + 复杂条件 | 行锁 · updateNull · 重复性校验 · 三表联查 · 时间范围 | 约 6 min |
| 05 · 报表聚合:GROUP BY + 聚合函数 | 三表JOIN+聚合 · 条件类复用 · 独立判空 · 日志控制到方法 | 约 6 min |
| 06 · mergeParams 多组条件合并 | 多条件类定义 · SQL多位置嵌入 · mergeParams合并 · 条件复用 | 约 5 min |
| 07 · 多租户 + 数据权限 · AOP 破局 | Filter + AOP链路 · extendCondition钩子 · 最小路径演示 | 约 7 min |
| 08 · 脱敏 + 审计扩展 · 框架不设限 | 字段脱敏(VO getter)· 审计重写 · 逻辑删除调整 | 约 7 min |
Spring JDBC Ultra: SQL-First,白盒透明,能力无上限。
把时间留给生活,而不是框架。