
⚡ Spring JDBC 完整体系 · 第 1 讲 · 裸 JDBC Driver相关开源地址核心框架源码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 前置知识你只需要会你完全不需要会Java 基础类、接口、异常处理Spring Boot 自动配置原理基础 SQLCREATE TABLE、INSERT、SELECT、聚合函数MyBatis / Hibernate 任何知识会用 IDE 运行 Maven 项目Maven 高级配置、父子工程 全套教程总览20 讲从零到架构师篇章涵盖讲次核心目标开篇筑基第 1-3 讲认知梳理建立 Spring JDBC 的底层坐标系API 精讲第 4-7 讲全面掌握 JdbcTemplate 事务体系工具封装第 8-9 讲手搓条件工具 代码生成器从“使用者”变“创造者”认知升华第 10 讲模板确定性 vs AI 不确定性建立技术判断力高阶扩展第 11-17 讲多数据源、分库分表、分布式事务底层观测第 18-19 讲SQL 拦截、性能监控、连接池调优终极收尾第 20 讲全链路复盘 手搓持久层框架一、开篇 · 为什么要从裸 JDBC 开始整套 20 期教程完整拆解 Spring JDBC 全栈知识。从 JDBC 驱动、Spring 容器起步覆盖全套 API、条件扩展、项目落地、多数据源、分库分表、分布式事务、SQL 拦截、性能监控、连接池调优最后亲手实现持久层框架。首讲回归最底层——裸 JDBC Driver。不少开发者直接上手 Spring Boot、MyBatis完全忽略数据库底层原生代码。吃透原生 JDBC 的繁琐问题才能看懂框架设计价值。本讲示例采用H2 内存数据库无需安装部署引入依赖即可运行同时兼容 MySQL。二、核心技术栈分层技术名词它是什么底层依赖JDBC Driver数据库厂商提供的连接通道直接对接数据库Spring JDBCJDBC Driver 的标准封装依赖 JDBC DriverSpring Boot Starter自动配置 Spring JDBC依赖 Spring JDBCMyBatisSQL 映射框架依赖 Spring JDBCMyBatis-PlusMyBatis 的增强补丁包依赖 MyBatis Spring JDBCJPA / Hibernate对象关系映射框架依赖 Spring JDBC三、Maven 依赖dependencygroupIdcom.h2database/groupIdartifactIdh2/artifactIdversion2.2.224/versionscoperuntime/scope/dependency本例仅需一个 H2 驱动依赖。JDK 原生 JDBC 接口位于java.sql包中无需额外引入。四、核心代码演示4.1 JDK 原生接口代码引入 JDK 原生四个核心类没有引入任何数据库驱动专属类importjava.sql.Connection;importjava.sql.DriverManager;importjava.sql.ResultSet;importjava.sql.Statement;开发只需面向 JDBC 标准接口编码驱动由DriverManager自动托管底层切换 H2、MySQL、PostgreSQL无需改动业务代码。4.2 SPI 机制 · 驱动的自动发现JDBC 4.0 之后引入了SPIService Provider Interface机制。各数据库驱动包在META-INF/services/java.sql.Driver文件中写入驱动全类名DriverManager自动扫描加载并执行静态注册。MySQL 驱动包结构mysql-connector-j-9.7.0.jar └── META-INF/services/java.sql.Driver └── com.mysql.cj.jdbc.DriverH2 驱动包结构h2-2.4.240.jar └── META-INF/services/java.sql.Driver └── org.h2.Driver这意味着不再需要手动编写Class.forName(org.h2.Driver)驱动会被自动发现并注册。JDBC 4.0 之前的版本需要显式调用Class.forName()触发驱动类加载现在这一步完全省去。4.3 H2 内存库 · 建表与插入数据publicclassJdbcDemo{publicstaticvoidmain(String[]args)throwsException{// H2 内存库程序关闭数据自动清空Stringurljdbc:h2:mem:test;ConnectionconnDriverManager.getConnection(url,sa,);Statementstatconn.createStatement();// 建表 插入测试数据stat.execute(CREATE TABLE t_user(id INT PRIMARY KEY, name VARCHAR(32), age INT));stat.execute(INSERT INTO t_user(name, age) VALUES(李四光, 20));stat.execute(INSERT INTO t_user(name, age) VALUES(王五, 10));// 聚合查询MAX(name)ResultSetrsstat.executeQuery(SELECT MAX(name) AS name FROM t_user);while(rs.next()){Stringnamers.getString(name);System.out.println(姓名最大值name);}// 强制逆序关闭资源防止连接泄漏rs.close();stat.close();conn.close();}}运行结果姓名最大值王五4.4 资源管理 · 为什么必须逆序关闭原生 JDBC 的资源管控是一个容易忽视的细节rs.close();// 先关 ResultSetstat.close();// 再关 Statementconn.close();// 最后关 Connection关闭顺序必须与创建顺序相反ResultSet → Statement → Connection。遗漏任意一个都会造成连接泄漏在高并发下连接资源被耗尽应用将无法响应。这也是JdbcTemplate核心封装目标之一——自动管理资源生命周期。4.5 切换数据库 · 只需改 URL由于代码面向 JDBC 标准接口编写切换数据库只需修改连接 URL// H2Stringurljdbc:h2:mem:test;// MySQLStringurljdbc:mysql://localhost:3306/test;// PostgreSQLStringurljdbc:postgresql://localhost:5432/test;五、本讲核心总结学会的内容原生 JDBC 的痛点驱动自动注册SPI 机制资源管理必须手动逆序关闭通过DriverManager获取连接重复代码多、易出错建表、插数、聚合查询结果集需要手动解析H2 内存库零配置运行没有连接池、性能差面向接口编程数据库可切换异常处理冗长SQLException六、下一讲预告第 2 讲将进入Spring 容器最小案例从“Map 思维”理解 IoC看 Spring 如何接管对象生命周期告别手动new对象。