关键是在老项目中通过封装层逐步替换原生jdbc:先用jdbcutils统一管理连接与资源释放,再抽取sql执行模板,接着引入queryrunner等轻量工具过渡,最后优化sql与映射层。

在老项目里替换原生 JDBC,关键不是重写,而是“绕着走”——用封装层兜住旧代码,逐步替掉最痛的部分。不改业务逻辑,不碰 DAO 接口,只动数据访问的底层支撑。
先封住连接和资源释放这两大漏洞
老代码里最常见的是硬编码 URL、手动 close 顺序错乱、finally 块漏关 ResultSet。这些不用动 DAO 方法体,只需统一收口到一个工具类:
- 把 DriverManager.getConnection() 替换为 JDBCUtils.getConnection(),驱动加载、URL/账号密码从配置文件读取(如 db.properties)
- 所有 DAO 的 finally 块删掉,换成一行 JDBCUtils.close(rs, ps, conn) —— 这个方法内部判空+捕获 SQLException,避免因关闭异常掩盖主逻辑异常
- 如果项目已用连接池(比如 Druid),getConnection() 直接返回 DataSource.getConnection(),零侵入升级
把 SQL 执行模板抽成通用方法
你会发现 80% 的增删改查只有三样在变:SQL 字符串、占位符参数、结果处理逻辑。那就把不变的部分固化:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 写一个 executeUpdate(String sql, Object... args):自动预编译、设参、执行,只抛业务关心的 SQLException
- 写一个 query(String sql, RowMapper
mapper, Object... args) :执行后遍历 ResultSet,每行调 mapper.mapRow(rs),返回 List - DAO 原方法里,把原来几十行的 PreparedStatement 操作,压缩成一行 return query("SELECT * FROM user WHERE id = ?", new UserRowMapper(), id);
用 QueryRunner 或 JdbcTemplate 小步过渡
如果项目允许引入轻量依赖(无 Spring 环境也可用),DBUtils 的 QueryRunner 是最平滑的跳板:
- 它不强制你改 DAO 接口,只替换方法体内实现:new QueryRunner(dataSource).query(sql, new BeanHandler(User.class), id)
- 自带资源自动管理,不用写 finally;内置 BeanHandler / BeanListHandler,省去手写 rs.getInt("id") 的重复劳动
- 事务控制仍可沿用原有方式,比如用 DataSourceUtils 获取 Connection 后传给 QueryRunner,完全兼容老事务边界
最后才动 SQL 和映射层
别一上来就推翻 SQL 写法。先确保执行流程稳定,再优化表达:
- 把散落在 DAO 中的 SQL 字符串,提取为常量或配置项(如 SQL_MAP.get("user.findByAge")),便于统一管理和审计
- 将 Map
返回值逐步替换成实体类——从新增接口开始,老接口加一层适配器包装,避免批量修改引发回归问题 - 等 70% 的 DAO 都走新模板后,再考虑外置 SQL(如迁移到 MyBatis XML),此时风险可控,回滚成本低
重构不是推倒重来,是让旧代码在新底座上呼吸得更顺畅。每次只聚焦一个痛点,测通再往下走,半年内就能把 JDBC 脏活清干净。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










