java泛型实现通用dao基类的核心是定义带类型约束的抽象基类basedao,要求实体具备无参构造器和统一主键标识,并通过反射或泛型实参提取class来动态获取表名、字段等信息,封装save、findbyid、deletebyid、count等通用操作,最终基于mybatis-plus或spring data jpa等成熟orm框架落地。

Java 中用泛型实现通用 DAO 基础类,核心是让一个类能适配任意实体类型,同时复用增删改查逻辑,避免为每个表重复写相似代码。关键不在“写得多”,而在“约定清、补得准、用得稳”。
定义带类型约束的泛型基类
基础类声明为 abstract class BaseDao
- T 必须有无参构造方法(反射实例化必需)
- 主键字段统一命名为 id,或要求 T 实现 Identifiable 接口并提供 getId() 方法
- 推荐加类型边界:class BaseDao
,其中 interface Entity {} 是空标记接口,编译期即可拦截非法类型
运行时获取真实类型信息
泛型在编译后被擦除,BaseDao
Java开发手册规约集合,基于阿里巴巴Java开发手册(嵩山版)。 涵盖7大维度:编程规约、异常日志、单元测试、安全规约、MySQL数据库、工程结构、设计规约。 当用户需要:(1) 编写或审查Java代码 (2) 检查命名/代码规范 (3) 处理异常和日志 (4) 编写单元测试 (5) 安全编码 (6) 数据库设...
- 方式一:子类构造时传入 Class
entityClass ,基类保存并用于后续反射操作(如 newInstance()、getDeclaredField("id")) - 方式二(更常用):在基类静态块或构造器中调用 this.getClass().getGenericSuperclass(),解析父类泛型实参,自动提取 Class
- 有了 Class
,就能推导表名(entityClass.getSimpleName().toLowerCase())、主键类型、字段映射关系
封装可复用的通用操作
方法签名聚焦行为,不绑定具体 SQL 或框架,但内部实现要兼顾安全与扩展性:
- save(T entity):根据 id 是否为空判断执行 INSERT 或 UPDATE
- T findById(Serializable id):SQL 拼装为 "SELECT * FROM ${table} WHERE id = ?",结果用反射赋值到新 T 实例
- int deleteById(ID id):避免加载实体再删,直接发 DELETE 语句
- long count():比 findAll() 更轻量,用 "SELECT COUNT(1) FROM ${table}" 防止 OOM
对接主流框架落地,不硬刚 JDBC
手写反射+JDBC 易出错、难调试。实际项目应基于成熟 ORM 封装:
- 用 MyBatis-Plus:定义 MyBaseMapper
extends BaseMapper ,在其中统一处理软删除、数据权限等横切逻辑;业务 Mapper 直接继承它 - 用 Spring Data JPA:定义 JpaBaseRepository
extends JpaRepository ,再通过 @Query 或方法命名派生查询 - 无论哪种,通用方法都由基接口/基类提供,业务 DAO 只需声明继承关系,无需重写基础 CRUD
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










