java抽象dao基类通过泛型+抽象方法+模板方法模式统一封装crud,子类仅需实现gettablename()、getidcolumn()等抽象方法指定实体元信息,复用通用逻辑。

在 Java 抽象类中,通过定义抽象 DAO 基类统一封装基础 CRUD 操作,核心是利用泛型 + 抽象方法 + 模板方法模式,让子类只需关注实体类型和 SQL 细节,复用通用逻辑。
定义泛型抽象 DAO 基类
抽象基类声明为 abstract class BaseDao<t></t>,其中 T 是具体实体类型。它不依赖具体数据库实现(如 JDBC、MyBatis、JPA),而是面向接口或统一访问层(如 JdbcTemplate、SqlSession、EntityManager)。
- 声明受保护的数据库操作对象(如
protected JdbcTemplate jdbcTemplate;或protected SqlSession sqlSession;) - 提供
save(T entity)、findById(ID id)、update(T entity)、deleteById(ID id)等模板方法 - 将“获取表名”“获取主键字段”“实体转参数”等行为定义为 抽象方法,强制子类实现
用抽象方法解耦实体元信息
不同实体的表名、主键名、字段映射各不相同,不能硬编码。抽象基类通过以下抽象方法交由子类决定:
protected abstract String getTableName();protected abstract String getIdColumn();-
protected abstract Object[] getInsertArgs(T entity);(按 SQL 字段顺序返回值数组) -
protected abstract T mapRow(ResultSet rs, int rowNum) throws SQLException;(JDBC 场景)
这样,BaseDao 可以写出通用的 save():拼 SQL、设参数、执行插入,而无需知道 User 表叫 t_user 还是 sys_user。
Java JDK 25 来自 OpenJDK 官方归档,版本为 JDK 25,本条下载地址已指向官方 Windows x64 zip 安装包直链,适合调试旧项目或兼容旧版 Java 运行环境。
子类只需最小化实现
继承 BaseDao<user></user> 的 UserDao 类,只做三件事:
- 构造器中注入数据源能力(如传入
JdbcTemplate) - 重写上述抽象方法,例如
getTableName()返回"t_user" - 可选择性扩展业务方法(如
findByEmail(String email)),不影响基础 CRUD 复用
不需要重复写 try-catch、资源关闭、参数绑定——这些都在基类里统一处理。
配合反射或注解进一步简化(可选)
若希望减少子类手写元信息,可在实体类上加注解(如 @Table("t_user")、@Id),然后在 BaseDao 中用反射读取。但要注意:
- 反射有性能开销,建议启动时缓存元数据
- 保持注解轻量,避免强耦合 ORM 框架(如不直接用
@Entity) - 仍需保留抽象方法作为兜底,便于无注解场景或测试 mock
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










