一个可调试的Java数据库项目应以JDBC原生链路、连接池介入时机、事务控制边界为主线,分四步实现:一、裸连CRUD厘清JDBC六步;二、引入HikariCP连接池并配置关键参数;三、手动控制事务边界与资源复用;四、整合Spring Boot,理解@Transactional底层机制与常见失效原因。

直接上手一个能跑通、可调试、贴合真实场景的 Java 数据库操作项目,关键不在堆功能,而在把 JDBC 原生链路、连接池介入时机、事务控制边界这三件事串成一条清晰主线。下面按实战逻辑分四块讲清楚。
一、先写一个“裸连”版 CRUD,摸清 JDBC 六步链路
不引入任何框架,用最原始的 JDBC API 写一个用户表的增查功能。重点不是代码多漂亮,而是确保每一步都亲手执行、亲眼看到:
- 显式加载驱动:
Class.forName("com.mysql.cj.jdbc.Driver")(即使新版可省略,也建议写上,便于排查ClassNotFoundException) - 连接字符串带关键参数:
jdbc:mysql://localhost:3306/test?serverTimezone=UTC&useSSL=false&characterEncoding=utf8,尤其注意时区和编码,否则插入中文或时间字段会乱码/报错 - 必须用
PreparedStatement而非Statement,防止 SQL 注入,也避免拼接引号带来的语法错误 - 资源关闭严格按反序:ResultSet → Statement → Connection,且必须放在
finally或 try-with-resources 中,否则一次忘记就可能引发连接泄露
二、替换为 HikariCP 连接池,解决并发与性能问题
把原来每次查询都 DriverManager.getConnection() 的写法,换成从连接池取连接。这不是简单换个对象,而是要理解它替你做了什么:
当用户要求为 Java 代码添加注释、修改注释、审查注释、整理注释格式,或要求按照代码注释规范处理 Java 文件时,使用本技能。本技能用于统一生成和维护 Java 类注释模板、按 Git 对比 release 判断版本号、补充每行代码上方中文块注释、调整注释空行规则,并保持 Java 文件 UTF-8 无 BOM 编码。典型触发场景包括:补充类注释、更新 @version、检查 @author 来源、整理行尾注释、把注释放到代码上一行、检查注释是否符合规范、构建前检查 Java 注释风格。
- 在项目启动时预创建 5~10 个连接(
minimumIdle和maximumPoolSize可调),后续所有 DAO 方法都从池里dataSource.getConnection(),用完close()实际是归还,不是销毁 - HikariCP 的
connection-timeout和leak-detection-threshold必须配——前者防卡死,后者能在日志里打出“疑似连接未关闭”的堆栈,帮你揪出漏关资源的 Bug - 别再手动写
Class.forName,HikariCP 自动完成驱动注册;连接池对象建议通过静态块或 Spring Bean 管理,避免重复初始化
三、在关键业务点加上事务控制,明确 begin/commit/rollback 边界
事务不是加个注解就完事。先用原生 JDBC 把事务流程走通,再迁移到框架:
- 获取连接后立刻执行
connection.setAutoCommit(false),表示开启手动事务 - 所有相关 SQL(比如转账:扣 A 账户、加 B 账户)必须复用同一个
Connection对象,不能每个 DAO 都自己取新连接,否则事务失效 - 成功则
commit(),异常则rollback(),且无论成败都要在finally里setAutoCommit(true)恢复默认状态,避免后续连接被意外卡在事务中 - 事务粒度要匹配业务:一个用户注册(插入用户 + 插入默认配置)可以包在一个事务里;但“发短信通知”这种外部依赖操作,就不该放进同一事务,应拆成最终一致性处理
四、整合进 Spring Boot,用 @Transactional 替代手工控制
前面三步练熟了,再上 Spring Boot 就不是黑盒操作。重点看它怎么把底层逻辑封装得更安全:
- 配置
spring.datasource.hikari.*参数,让 Spring 自动装配HikariDataSource;确认spring.transaction.default-timeout和rollback-for是否符合业务预期 - @Transactional 必须加在 public 方法上,且调用方与被调用方不能是同一个类的内部方法(否则代理失效);需要只读事务时,显式写
@Transactional(readOnly = true),HikariCP 会路由到从库(如果配置了) - 遇到“事务不生效”,第一反应不是换框架,而是检查:是否用了 CGLIB 代理(目标类不能是 final)、异常是否被 try-catch 吞掉、数据源是否被多个配置覆盖、MySQL 引擎是不是 InnoDB(MyISAM 不支持事务)
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










