java抽象类结合泛型定义通用dao模板,关键是用泛型参数t约束实体类型、抽象方法提取表名/主键/映射等元信息、模板方法封装crud逻辑,子类仅需实现元信息方法即可复用全部数据访问功能。

Java 中在抽象类里结合泛型定义通用数据访问模板,关键是用 泛型参数约束实体类型、抽象方法提取元信息、模板方法封装通用逻辑,让子类只需声明表名、主键字段和映射规则,不用重复写增删改查的 JDBC 或 ORM 适配代码。
定义带泛型的抽象 DAO 基类
声明为 abstract class BaseDao<t></t>,其中 T 是具体业务实体(如 User、Order)。基类内部不绑定具体数据库实现,而是依赖统一的数据操作对象,比如:
-
protected JdbcTemplate jdbcTemplate;(Spring JDBC) -
protected SqlSession sqlSession;(MyBatis) -
protected EntityManager entityManager;(JPA)
这样既保持可替换性,又避免与某一层技术强耦合。
用抽象方法交出实体元信息
不同实体对应不同表结构,不能硬编码。把可变部分抽成抽象方法,由子类实现:
-
protected abstract String getTableName();—— 返回表名,如"t_user" -
protected abstract String getIdColumn();—— 返回主键字段名,如"id" -
protected abstract Object[] getInsertArgs(T entity);—— 按 SQL 字段顺序返回插入值数组 -
protected abstract T mapRow(ResultSet rs, int rowNum) throws SQLException;—— JDBC 查询结果转实体(若用 MyBatis/JPA 可换为其他映射方式)
这些方法不提供默认实现,子类必须覆盖,确保每个实体都能准确描述自身结构。
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
在模板方法中复用 CRUD 逻辑
基类中直接写出通用操作,比如 save(T entity):
- 调用
getTableName()拼出 INSERT SQL - 调用
getInsertArgs(entity)获取参数数组 - 委托
jdbcTemplate.update(sql, args)执行
同理,findById(ID id) 可基于 getTableName() 和 getIdColumn() 动态生成查询语句,并用 mapRow 完成结果映射。所有子类自动获得这些能力,无需再写样板 SQL。
子类只需轻量实现,专注业务实体
以 UserDao 为例:
- 继承
BaseDao<user></user> - 重写
getTableName()→ 返回"t_user" - 重写
getIdColumn()→ 返回"user_id" - 重写
getInsertArgs(User u)→ 返回new Object[]{u.getName(), u.getAge()} - 重写
mapRow(...)→ 从ResultSet构造new User(...)
至此,UserDao 就拥有了完整的 save、findById、update、deleteById 方法,且逻辑清晰、无重复、易维护。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










