抽象类AbstractDao<T>封装数据库操作模板,统一管理连接与资源,定义executeQuery等模板方法,子类仅需实现SQL构建和结果映射,支持事务扩展与连接池接入,但Spring项目中优先使用JdbcTemplate或MyBatis。

抽象类在 Java 中常用于定义通用的数据库操作模板,把重复的 JDBC 或 ORM 操作(如获取连接、开启事务、关闭资源)抽离出来,让子类只关注 SQL 和业务逻辑。核心思路是:父类定流程,子类填细节。
定义抽象数据库模板类
创建一个 AbstractDao<T> 抽象类,封装共用的数据库生命周期管理:
- 统一管理
Connection、PreparedStatement、ResultSet的获取与关闭 - 提供 template method(如
executeQuery()、executeUpdate()),内部按“打开连接 → 预编译 → 设置参数 → 执行 → 映射结果 → 关闭资源”顺序执行 - 把 SQL 构建和结果映射声明为抽象方法,由子类实现
子类只需实现关键逻辑
例如实现一个 UserDao 继承 AbstractDao<User>:
Java项目代码review工具。分析Git变更+完整调用链路上下文,推断业务需求,进行多维度评分和分类汇总,生成完整PRD文档。包含细粒度Java代码审查清单(Null安全、异常处理、Streams、并发、equals/hashCode、资源管理、API设计、性能、MyBatis/ORM、事务边界、SQL/DD...
- 重写
getSqlForSelectById()返回"SELECT * FROM user WHERE id = ?" - 重写
mapToEntity(ResultSet rs)将结果集转为User对象 - 调用父类
findById(Long id)即可完成完整查询,无需手动写 try-catch 和 close
支持事务与扩展性设计
可在抽象类中预留钩子方法增强控制力:
立即学习“Java免费学习笔记(深入)”;
- 添加
beforeExecute(PreparedStatement ps)允许子类设置超时、自定义 fetch size 等 - 将
getConnection()设为 protected 可被子类覆盖,方便接入连接池(如 HikariCP)或分布式事务框架 - 通过泛型
<T>和函数式接口(如Function<ResultSet, T>)替代部分抽象方法,减少子类模板代码
注意点与轻量替代方案
这种模板模式适合中小项目或教学场景;但在 Spring 生态中,更推荐直接使用 JdbcTemplate 或 MyBatis 的 BaseMapper —— 它们已内置相同思想且更健壮。若坚持手写,务必确保:
- 所有资源关闭放在
finally块或 try-with-resources 中 - 异常统一转换为运行时异常(如
DataAccessException子类),避免强制子类处理 SQLException - SQL 参数绑定必须用
?占位符,禁止字符串拼接防注入

















