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
-
+
首页
09JPA
## 概述 JPA(Java Persistence API,Java 持久化 API)是 Jakarta EE(原 Java EE)中用于对象关系映射(ORM,Object-Relational Mapping) 的规范,旨在让开发者以面向对象的方式操作关系型数据库,屏蔽底层 SQL 细节,简化数据持久化代码。 ## 定位 传统 JDBC 操作数据库需要手动编写 SQL、处理结果集与 Java 对象的映射,代码繁琐且易出错。JPA 通过注解或 XML 配置定义 Java 对象(实体)与数据库表的映射关系,由底层框架(如 Hibernate)自动生成 SQL、执行 CRUD 操作,实现 “以对象操作为中心” 的开发模式。 简单说:JPA 是 “对象” 与 “数据库表” 之间的桥梁,让开发者用操作 Java 对象的方式(如save(user))替代编写 SQL(如INSERT INTO user ...)。 ## 核心组件 JPA 规范定义了一套 API 和注解,核心组件如下: | 组件 / 概念 | 描述 | | --------------------------------------- | ------------------------------------------------------------ | | 实体(Entity) | 被@Entity注解标记的 Java 类,对应数据库中的一张表,类的属性对应表的字段。例如:User类对应user表,username属性对应username字段。 | | EntityManager | 核心操作接口,负责实体的生命周期管理(创建、查询、更新、删除),是与数据库交互的入口。类似 JDBC 的Connection,但更面向对象。 | | EntityManagerFactory | 用于创建EntityManager的工厂类,线程安全,通常一个应用只需要一个实例(基于配置初始化)。 | | Persistence Unit | 配置单元,在META-INF/persistence.xml中定义,包含数据库连接信息、映射的实体类、JPA 实现提供商(如 Hibernate)等配置。 | | JPQL(Java Persistence Query Language) | 面向对象的查询语言,语法类似 SQL,但操作的是实体对象而非数据库表(如SELECT u FROM User u WHERE u.age > 20),支持跨数据库平台。 | | 映射注解 | 定义实体与表的映射关系,核心注解包括:@Entity(标记实体)、@Table(指定表名)、@Id(主键)、@Column(字段属性)、@ManyToOne(多对一关系)等。 | ## 代码示例 1、定义实体类--映射数据库表 ```java import jakarta.persistence.*; // Jakarta EE 9+ 包名(旧版为javax.persistence) @Entity // 标记为JPA实体(对应数据库表) @Table(name = "t_user") // 指定数据库表名(默认与类名一致) public class User { @Id // 主键字段 @GeneratedValue(strategy = GenerationType.IDENTITY) // 自增主键(依赖数据库支持) private Long id; @Column(name = "username", length = 50, nullable = false, unique = true) // 映射表字段:列名username,长度50,非空,唯一 private String username; @Column(name = "age") private Integer age; // 必须提供无参构造器(JPA要求) public User() {} // 带参构造器、getter/setter public User(String username, Integer age) { this.username = username; this.age = age; } // getter/setter... public Long getId() { return id; } public void setId(Long id) { this.id = id; } // ...其他getter/setter } ``` 2、配置 Persistence Unit(persistence.xml) 在src/main/resources/META-INF/persistence.xml中配置数据库连接和 JPA 实现(以 Hibernate 为例): ```xml <?xml version="1.0" encoding="UTF-8"?> <persistence version="3.0" xmlns="https://jakarta.ee/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="https://jakarta.ee/xml/ns/persistence https://jakarta.ee/xml/ns/persistence/persistence_3_0.xsd"> <!-- 持久化单元:名称自定义,应用中通过该名称获取工厂 --> <persistence-unit name="myJpaUnit" transaction-type="RESOURCE_LOCAL"> <!-- 指定JPA实现(Hibernate) --> <provider>org.hibernate.jakarta.persistence.HibernatePersistenceProvider</provider> <!-- 映射的实体类(需列出所有实体) --> <class>com.example.User</class> <!-- 数据库连接配置 --> <properties> <property name="jakarta.persistence.jdbc.driver" value="com.mysql.cj.jdbc.Driver"/> <property name="jakarta.persistence.jdbc.url" value="jdbc:mysql://localhost:3306/testdb?useSSL=false"/> <property name="jakarta.persistence.jdbc.user" value="root"/> <property name="jakarta.persistence.jdbc.password" value="123456"/> <!-- Hibernate特定配置 --> <property name="hibernate.show_sql" value="true"/> <!-- 打印生成的SQL --> <property name="hibernate.hbm2ddl.auto" value="update"/> <!-- 自动更新表结构(创建/修改) --> </properties> </persistence-unit> </persistence> ``` 3、执行 CRUD 操作 ```java import jakarta.persistence.EntityManager; import jakarta.persistence.EntityManagerFactory; import jakarta.persistence.Persistence; import jakarta.persistence.TypedQuery; import java.util.List; public class JpaCrudDemo { public static void main(String[] args) { // 1. 创建EntityManagerFactory(应用启动时初始化一次) EntityManagerFactory emf = Persistence.createEntityManagerFactory("myJpaUnit"); // 2. 创建EntityManager(每次操作数据库时获取) EntityManager em = emf.createEntityManager(); // 新增用户 em.getTransaction().begin(); // 开启事务 User user = new User("Alice", 25); em.persist(user); // 保存实体到数据库 em.getTransaction().commit(); // 提交事务 System.out.println("新增用户ID:" + user.getId()); // 自增ID会自动回填 // 查询用户(JPQL示例) TypedQuery<User> query = em.createQuery( "SELECT u FROM User u WHERE u.age > :age", // JPQL:操作实体User,而非表t_user User.class ); query.setParameter("age", 20); // 设置参数(防SQL注入) List<User> users = query.getResultList(); System.out.println("年龄>20的用户:" + users); // 更新用户 em.getTransaction().begin(); User foundUser = em.find(User.class, 1L); // 根据ID查询 if (foundUser != null) { foundUser.setAge(26); // 直接修改对象属性(自动同步到数据库) } em.getTransaction().commit(); // 删除用户 em.getTransaction().begin(); if (foundUser != null) { em.remove(foundUser); // 删除实体 } em.getTransaction().commit(); // 关闭资源 em.close(); emf.close(); } } ```
毛林
2025年10月27日 20:56
转发文档
收藏文档
上一篇
下一篇
手机扫码
复制链接
手机扫一扫转发分享
复制链接
Markdown文件
PDF文档(打印)
分享
链接
类型
密码
更新密码