Java JDBC通用DAO封装的核心目标是抽离数据库连接、预编译、结果集处理和资源关闭等重复逻辑,使业务DAO专注SQL与业务语义;通过工具类统一管理Connection/PreparedStatement/ResultSet,按RS→PS→Conn顺序关闭并判空;采用参数化SQL与Object[]传参,杜绝SQL拼接;利用反射+ResultSetMetaData自动映射结果集到实体类,要求列名与属性名一致;以BaseDao抽象类提供通用方法,业务DAO继承即可复用。

Java JDBC 封装通用 DAO 的核心目标是:把重复的数据库连接、预编译、结果集处理、资源关闭等逻辑抽离出来,让每个具体业务 DAO(如 UserDao、OrderDao)只需专注 SQL 和业务语义,不用写模板代码。
统一管理 JDBC 资源
所有 DAO 操作都离不开 Connection、PreparedStatement、ResultSet。通用封装必须确保它们被安全创建和关闭:
- 使用工具类(如
JDBCUtil或UtilsTest)集中获取连接,底层可灵活切换 DriverManager 或 Druid/C3P0 连接池; - 在
finally块或 try-with-resources 中统一关闭资源,避免连接泄漏; - 关闭顺序严格为:ResultSet → PreparedStatement → Connection;
- 对 null 做判空处理,防止关闭时抛出 NullPointerException。
参数化 SQL 与类型安全传参
所有增删改查方法都接受带占位符(?)的 SQL 字符串和参数数组,杜绝拼接 SQL:
-
update(String sql, Object[] params)处理 INSERT/UPDATE/DELETE; -
<T> List<T> query(String sql, Object[] params, Class<T> clazz)处理 SELECT; - 参数用
pstmt.setObject(i+1, params[i])统一设置,兼容基本类型、String、Date 等; - 不依赖字段顺序,只依赖列名与实体类属性名一致(大小写敏感需注意)。
反射自动映射结果集
查询返回结果时,不再手动 rs.getInt("id")、rs.getString("name") 赋值:
立即学习“Java免费学习笔记(深入)”;
- 通过
ResultSetMetaData获取列名列表; - 利用 Java 反射调用实体类对应 setter 方法(如
"id"→setId()); - 推荐搭配
BeanUtils.copyProperties()(Apache Commons)简化实现; - 若列名与属性名不完全匹配(如数据库用
user_name,Java 用userName),需额外加字段映射逻辑或命名规范约束。
继承结构与使用方式
通用 DAO 通常以抽象基类形式提供,具体 DAO 直接继承即可获得全部能力:
- 定义
BaseDao类,含update()、query()、getSingle()等通用方法; - 业务 DAO 如
UserDaoImpl extends BaseDao,无需重写 JDBC 模板,只写 SQL 和调用逻辑; - 接口层(可选)定义标准方法签名,增强可测试性与解耦;
- 实体类放在
entity或pojo包,属性名与数据库字段保持一致(或通过注解约定)。


















