Java安全
Java 基础知识
01概述
02变量
03运算符
04程序控制语句
05数组
06面向对象编程
07代码练习
08重载
09作用域
10构造方法&构造器
11this
12包
13修饰符
14封装
15继承
16super
17覆盖&重写
18多态
19零钱通项目
20类变量&类方法
21抽象类
22接口
23内部类
24枚举
25泛型
26常用API
27lambda表达式
28正则表达式
29异常
30File&IO流
31日志技术
32多线程
33网络编程
01反射
02反序列化
03JVM
04JDBC
05RMI
06JRMP
07JNDI
08CDI
09JPA
10Servlet
11Filter
12MVC模型
13MVC框架
14类的加载机制
15Maven
16注解
17ORM
18CC链
19JNDI注入
Log4j2
-
+
首页
17ORM
## 概述 ORM(Object-Relational Mapping,对象关系映射)是一种编程技术,用于解决面向对象模型与关系型数据库模型之间的结构不匹配问题。它通过将 Java 对象(或其他面向对象语言的对象)与数据库表建立映射关系,让开发者可以用操作对象的方式(如创建、修改、查询对象)替代直接编写 SQL 语句,实现对数据库的操作。 ## 定位 面向对象编程(OOP)的核心是 “对象”(包含属性和方法),而关系型数据库(RDBMS)的核心是 “表”(包含行和列),两者的模型存在天然差异: | 面向对象模型 | 关系型数据库模型 | 差异点 | | ------------------ | ------------------- | ------------------------------------------------------------ | | 对象(Object) | 表的行(Row) | 对象包含属性和方法,而行仅包含数据;对象有唯一标识(内存地址),行有主键(PK)。 | | 类(Class) | 表(Table) | 类有继承、多态,表无继承关系;类的属性类型(如 List、自定义对象)与表的字段类型(如 VARCHAR、INT)不直接对应。 | | 关联关系(如聚合) | 外键(Foreign Key) | 对象间的关联(如User包含List\<Order>)无法直接用表的外键表达。 | ORM 的核心作用就是屏蔽这种差异:开发者只需定义 “类→表”“属性→字段”“对象关联→表外键” 的映射规则,ORM 框架会自动将对象操作转换为 SQL 语句,或将查询结果集转换为对象。 ## 概念 ### 实体类(Entity Class): 与数据库表对应的 Java 类,每个对象实例对应表中的一行数据。例如:User类对应user表,User对象的username属性对应user表的username字段。 ### 映射规则: 定义实体类与表、属性与字段的对应关系,通常通过注解或XML 配置文件实现。 - 注解方式(如 JPA 规范):@Entity(标记类为实体)、@Table(name="t_user")(指定表名)、@Id(标记主键)、@Column(name="user_name")(指定字段名)等。 - XML 方式:在配置文件中声明映射(如 Hibernate 的.hbm.xml文件)。 ### ORM 框架: 实现 ORM 机制的工具,负责解析映射规则,将对象操作转换为 SQL,执行数据库操作,并将结果映射回对象。 主流的 Java ORM 框架包括: - Hibernate:全自动化 ORM 框架(无需写 SQL),是 JPA 的参考实现; - MyBatis:半自动化 ORM 框架(需手动写 SQL,但提供结果集到对象的映射); - JPA:ORM 规范(非框架),定义了统一的映射注解和 API,由 Hibernate、EclipseLink 等实现。 ## 工作原理 ORM 的核心流程是 “对象操作→SQL 转换→数据库交互→结果映射”,以 “保存对象” 为例: 1. 开发者定义映射:通过注解或 XML 声明User类与user表的映射(如@Table(name="t_user"),@Column(name="username"))。 2. 开发者操作对象:创建User对象并设置属性,调用 ORM 框架的保存方法(如session.save(user))。 3. 框架生成 SQL:ORM 框架解析映射规则,将user对象的属性转换为INSERT语句(如INSERT INTO t_user (username, age) VALUES ('Alice', 25))。 4. 执行 SQL 并返回结果:框架通过 JDBC 执行 SQL,数据库插入数据后,框架将生成的主键(如自增 ID)回填到user对象中。 查询操作则相反:框架将SELECT语句的结果集(ResultSet)按映射规则转换为User对象列表。 ## 代码示例 以 JPA(基于 Hibernate 实现)为例,展示 ORM 的映射和基本操作: 1、定义实体类与映射规则(注解方式) ```java import jakarta.persistence.; // 实体类与表映射 @Entity @Table(name = "t_user") // 对应数据库表t_user public class User { @Id // 主键 @GeneratedValue(strategy = GenerationType.IDENTITY) // 自增主键 private Long id; @Column(name = "user_name", length = 50, nullable = false) // 对应字段user_name,长度50,非空 private String username; @Column(name = "user_age") // 对应字段user_age private Integer age; // 无参构造器、getter/setter public User() {} public User(String username, Integer age) { this.username = username; this.age = age; } // getter/setter... } ``` 2、通过 ORM 框架操作数据库(无需写 SQL) ```java import jakarta.persistence.EntityManager; import jakarta.persistence.EntityManagerFactory; import jakarta.persistence.Persistence; import java.util.List; public class OrmDemo { public static void main(String[] args) { // 1. 初始化ORM框架(JPA的EntityManagerFactory) EntityManagerFactory emf = Persistence.createEntityManagerFactory("myJpaUnit"); EntityManager em = emf.createEntityManager(); // 2. 保存对象(对应INSERT) em.getTransaction().begin(); User user = new User("Alice", 25); em.persist(user); // 保存对象,ORM框架自动生成INSERT语句 em.getTransaction().commit(); System.out.println("保存成功,ID:" + user.getId()); // 自增ID回填 // 3. 查询对象(对应SELECT) User foundUser = em.find(User.class, 1L); // 根据ID查询,自动生成SELECT System.out.println("查询结果:" + foundUser.getUsername() + ", " + foundUser.getAge()); // 4. 更新对象(对应UPDATE) em.getTransaction().begin(); foundUser.setAge(26); // 修改对象属性,ORM框架自动生成UPDATE em.getTransaction().commit(); // 5. 删除对象(对应DELETE) em.getTransaction().begin(); em.remove(foundUser); // 删除对象,自动生成DELETE em.getTransaction().commit(); // 关闭资源 em.close(); emf.close(); } } ```
毛林
2025年10月27日 20:56
转发文档
收藏文档
上一篇
下一篇
手机扫码
复制链接
手机扫一扫转发分享
复制链接
Markdown文件
PDF文档(打印)
分享
链接
类型
密码
更新密码