Java轻量级ORM框架通过@Entity等注解定义映射关系,反射解析实体元数据并缓存,JDBC动态拼装SQL与参数绑定,支持基于主键的CRUD及简单条件查询,全程无外部依赖。

Java 中实现一个轻量级 ORM 框架,核心是用反射读取实体类结构、用注解声明映射关系、用 JDBC 执行 SQL。不需要 Spring 或 Hibernate 那样的复杂机制,关键在于把三者串起来:注解定义元数据 → 反射提取字段与表映射 → JDBC 动态拼 SQL 并绑定参数。
1. 定义基础注解
先设计几个必要注解,标记实体类和字段的数据库语义:
-
@Entity:标注类对应哪张表(可带
value指定表名) - @Id:标注主键字段(支持自增或手动赋值)
-
@Column:标注字段对应列名(可带
name和nullable) - @Transient:标注不参与持久化的字段(如运行时计算属性)
例如:
public class User {@Id
private Long id;
@Column(name = "user_name")
private String name;
@Transient
private String fullName;
}
2. 利用反射解析实体元数据
写一个工具类(如 EntityMapper),在运行时通过反射获取类的注解、字段、类型等信息:
立即学习“Java免费学习笔记(深入)”;
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 调用
clazz.getAnnotation(Entity.class)获取表名 - 遍历
clazz.getDeclaredFields(),跳过@Transient字段 - 对每个字段,检查
@Id和@Column,构建字段→列名映射、主键标识、是否可为空等元数据 - 缓存解析结果(如用
ConcurrentHashMap<Class<?>, EntityInfo>),避免重复反射开销
3. JDBC 层封装:动态生成 SQL 与参数绑定
以 save() 方法为例,流程如下:
- 根据实体类查出
EntityInfo,拿到表名、所有非 transient 字段、主键字段 - 若主键为 null 且是自增,生成 INSERT 不含主键列;否则包含主键列(支持更新主键场景)
- 拼接
INSERT INTO table (col1,col2) VALUES (?,?),字段顺序与反射获取的字段列表一致 - 用
PreparedStatement设置参数:遍历字段列表,调用field.setAccessible(true)读值,按 JDBC 类型(String/Long/Date 等)调用对应setXxx()方法
查询同理:SELECT col1,col2 FROM table WHERE id = ?,再用反射把结果集逐行 set 到新实例中。
4. 支持基本 CRUD 与简单查询扩展
可提供以下方法:
-
<T> T findById(Class<T> clazz, Object id):根据主键查单条 -
<T> List<T> findAll(Class<T> clazz):全表查 -
int update(T entity):按主键更新非 transient 字段 int deleteById(Class<T> clazz, Object id)- 进阶可加
findByCondition(Map<String, Object> conditions),拼 WHERE 子句(注意 SQL 注入风险,只允许字段名白名单匹配)
所有方法共用同一套元数据解析和 JDBC 模板逻辑,不依赖 XML 或外部配置。

















