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)</t></t></t>处理 SELECT; - 参数用
pstmt.setObject(i+1, params[i])统一设置,兼容基本类型、String、Date 等; - 不依赖字段顺序,只依赖列名与实体类属性名一致(大小写敏感需注意)。
反射自动映射结果集
查询返回结果时,不再手动 rs.getInt("id")、rs.getString("name") 赋值:
- 通过
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包,属性名与数据库字段保持一致(或通过注解约定)。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











