定位: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 的一部分”

二、对象层:单表零配置 + 自动审计 + 逻辑删除

@Repository
public class UserDao extends BaseDao<User> {
    // 空类,全部 CRUD 能力自动获得
}
能力 收益
零配置 CRUD 继承空类,立即拥有 saveupdatedeletefindByIdlistpage 全套方法
两个注解搞定 @Table 指定表名,@Id 标记主键,没有 XML、没有 Mapper、没有 namespace
审计字段自动填充 createTimecreateByupdateTimeupdateBysave/update 时自动注入
逻辑删除自动处理 配置 logic-delete.field=drdelete 自动变 UPDATE SET dr=1list/page 自动过滤
主键策略可切换 @Id("snow") 雪花 / @Id("uuid") UUID / @Id("auto") 自增
批量操作 saveBatchreplaceBatch,一条语句批量写入

一句话收益:单表开发工作量归零。你只需要定义实体类,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 行 -->
<if test="name != null and name != ''">
    AND t.name LIKE CONCAT('%', #{name}, '%')
</if>
<if test="ageMin != null">
    AND t.age >= #{ageMin}
</if>
<if test="ageMax != null">
    AND t.age &lt;= #{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. 别名)
protected void addCondition() {
    and("name LIKE", name, 3);
    and("age >= ?", ageMin);
}

// 连表条件类(同一个写法,换个别名)
protected void addCondition() {
    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", new Object[]{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)");
-- CTE
add("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 读取 pagesize
  • 方言自动适配:MySQL、PostgreSQL、Oracle、SQL Server、H2、SQLite、国产数据库全支持
  • page() 智能找第一个不在括号内的 FROM 生成 COUNT SQL
  • page0() 子查询法,兼容一切复杂 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 * FROM sys_user t WHERE t.name LIKE '%张%' AND t.age >= 20 AND t.age <= 30
  • 参数已经替换成真实值
  • 字符串加引号、日期格式化、null 变 NULL
  • 批量操作每条记录独立打印

一句话收益:调试效率提升 10 倍以上。遇到问题,日志里复制 SQL 直接跑,不需要手动替换 ? 占位符。

4.5 安全兜底

// 强制 WHERE 检查——防止全表误操作
if (!WHERE_PATTERN.matcher(sql).find()) {
    throw new IllegalArgumentException("危险操作被拦截: SQL 没有WHERE条件");
}

一句话收益updatedelete 执行前强制检查必须有 WHERE 子句,违规直接熔断。

五、扩展层:白盒 + AOP,零门槛

5.1 MyBatis 的拦截器为什么让 80% 的程序员望而却步?

实现一个数据权限,在 MyBatis 里得这样:

  1. 实现 Interceptor 接口
  2. intercept() 方法里拿到 StatementHandler / BoundSql
  3. 通过反射拿到 parameterObject,判断是不是 BaseCondition 或其子类
  4. 用正则或者字符串替换去修改 BoundSql.sql,拼入 AND receiver = ?
  5. 还得小心翼翼地处理分页插件、缓存插件之间的顺序问题

你写 20 行代码,连业务的边都摸不着。 这 20 行里:10 行扒 MyBatis 内部对象,5 行做反射取值,剩下 5 行才是真正的业务逻辑。

5.2 Spring JDBC Ultra 的扩展:AOP + BaseCondition 公开 API

@Aspect
@Component
public class DataAuthAspect {
    @Before("@annotation(auth)")
    public void beforeQuery(JoinPoint point, DataAuth auth) {
        BaseCondition cond = (BaseCondition) point.getArgs()[0];
        String userId = request.getHeader("X-User-Id");
        cond.addDynamic(" AND " + auth.userField() + " IN", new Object[]{0, userId});
    }
}
  • 不需要理解 StatementHandlerBoundSqlExecutor
  • 不需要反射扒内部状态
  • 不需要字符串替换 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 的全部含义。

九、全链路工具集

源码与案例地址

  1. 核心框架源码https://gitee.com/gao_zhenzhong/simple-dao

  2. 系统底座https://gitee.com/gao_zhenzhong/simple-dao-starter

  3. 代码生成器https://gitee.com/gao_zhenzhong/simple-dao-coder

  4. **实战案例 **: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")
public class User {
    @Id
    private Long id;
    private String name;
    private Integer age;
    private String email;
    private LocalDateTime createTime;
    private Long createBy;
    private LocalDateTime updateTime;
    private Long updateBy;
    private Byte dr;
}

第三步:继承 BaseDao

@Repository
public class UserDao extends BaseDao<User> {
    // 空类,全部 CRUD 能力自动获得
}

开始使用

@Autowired
private UserDao userDao;

// 单条插入
User user = User.builder().name("张三").age(25).email("zhangsan@QQ.com").build();
userDao.save(user);

// 条件分页查询
UserCond cond = UserCond.builder().name("张").ageMin(20).ageMax(30).build();
Page<User> page = userDao.page(cond);

// 联表查询
public Page<OrderVO> pageJoin(OrderCond cond) {
    String sql = "SELECT t.*, u.name user_name FROM bus_order t LEFT JOIN sys_user u ON t.user_id = u.id";
    return page(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,白盒透明,能力无上限。
把时间留给生活,而不是框架。

Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐