wap网站模板,下载长沙app,响应式网站建设团队全网天下,群晖wordpress更新下载失败✅✅作者主页#xff1a;#x1f517;孙不坚1208的博客 #x1f525;#x1f525;精选专栏#xff1a;#x1f517;JavaWeb从入门到精通#xff08;持续更新中#xff09; #x1f4cb;#x1f4cb; 本文摘要#xff1a;本篇文章主要介绍JPA的概念、注解实现ORM规范… ✅✅作者主页孙不坚1208的博客 精选专栏JavaWeb从入门到精通持续更新中 本文摘要本篇文章主要介绍JPA的概念、注解实现ORM规范的关联关系、JPA实战以及ORM流行框架。 觉得文章还不错的话欢迎大家点赞➕收藏⭐️➕评论支持博主 你的一键三连是我更新的最大动力❤️❤️ JPA基础一、JPA概述1.JPA概念2.实体3.ORM注解一对一关系一对多关系多对一关系多对多关系4.JPQL二、JPA实战三、流行的ORM框架(基于JPA)1.Hibernate2.Spring Data JPA一、JPA概述
1.JPA概念
JPA(Java Persistence API)是用于对象持久化的API是Java EE平台标准的ORM规范
使得应用程序以统一的方式访问持久层。
ORM
Object Relational MappingJava对象与关系数据库之间的映射
JPA:
通过JDK注解或XML描述对象-关系的映射关系并将运行期的实体对象持久化到数据库中Sun希望整合ORM技术统一各种ORM框架的规范实现天下归一JPA提供了现有ORM实现框架功能的核心子集
JPA包含三方面的技术
ORM映射元数据JPA支持XML和JDK注解两种元数据的形式元数据描述对象和表之间对的映射关系框架据此将实体对象持久化到数据库表中JPA的API:用来操作实体对象执行CRUD操作框架在后台替我们完成所有的事情开发者从繁琐的JDBC和SQL代码中解脱出来。查询语言JPQL:这是持久化操作中很重要的一个方面通过面向对象而非面向数据库的查询语言查询数据避免程序的SQL语句紧密耦合。
2.实体
一个实体是一个轻量级的持久化对象。
通常一个实体表示关系数据库中的一张表实体的每个实例对应表中的一行
假设有一个表名为 user包含以下字段
FieldTypeidINTnameVARCHAR(100)ageINTemailVARCHAR(100)passwordVARCHAR(100)
我们使用JPA定义一个实体类 User对应 user 表中的一条记录
Entity
Table(name user)
public class User {IdGeneratedValue(strategy GenerationType.IDENTITY)private Integer id;private String name;private Integer age;private String email;private String password;// getters and setters
}在上述代码中我们使用 Entity 注解表示这是一个实体类使用 Table 注解指定了实体对应的表名为 user。同时我们在类中定义了实体对应的属性并使用 Id 和 GeneratedValue 注解表示该属性为实体的唯一标识并指定了该属性的生成策略为自增长。
实体的状态
新建态new自由状态新创建的实体对象尚未拥有持久化主键没有和一个持久化上下文关联起来受控态managed持久状态已经拥有持久化主键并和持久化上下文建立了联系游离态detached分离状态拥有持久化主键但尚未和持久化上下文建立联删除态removed删除状态拥有持久化主键已经和持久化上下文建立联系系但已经被安排从数据 库中删除
3.ORM注解
基本注解
Entity 将对象标注为一个实体表示需要保存到数据库中
Table 默认情况下类名即为表名通过name属性显式指定表名
Id 对应的属性是表的主键
GeneratedValue 主键的产生策略通过strategy属性指定
EmbeddedId或IdClass 组合关键字
Column 属性对应的表字段
Transient 表示对应属性不需要持久化。在保存或更新实体对象时该属性不会持 久化到数据库中
关联关系
OneToOne
OneToMany
ManyToOne
ManyToMany
下面是使用 JPA 实现一对一、一对多、多对一和多对多关系的示例。
一对一关系
在 JPA 中一对一关系通常使用 OneToOne 注解来表示。例如一个 Person 实体可以拥有一个 Passport 实体如下所示
Entity
public class Person {IdGeneratedValue(strategy GenerationType.AUTO)private Long id;private String name;OneToOne(mappedBy person)private Passport passport;// getters and setters
}Entity
public class Passport {IdGeneratedValue(strategy GenerationType.AUTO)private Long id;private String number;OneToOneJoinColumn(name person_id)private Person person;// getters and setters
}上述示例中Person 实体与 Passport 实体之间建立了一对一的关系Person 实体拥有一个 Passport 实体而 Passport 实体则有一个对应的 Person 实体。在 Person 实体中使用 mappedBy 属性指定了关系的维护方是 Passport 实体即 Passport 实体维护了这个关系。在 Passport 实体中使用 JoinColumn 注解指定了外键列的名称即 person_id。
一对多关系
在 JPA 中一对多关系通常使用 OneToMany 注解来表示。例如一个 Department 实体可以拥有多个 Employee 实体如下所示
Entity
public class Department {IdGeneratedValue(strategy GenerationType.AUTO)private Long id;private String name;OneToMany(mappedBy department)private ListEmployee employees;// getters and setters
}Entity
public class Employee {IdGeneratedValue(strategy GenerationType.AUTO)private Long id;private String name;ManyToOneJoinColumn(name department_id)private Department department;// getters and setters
}上述示例中Department 实体与 Employee 实体之间建立了一对多的关系Department 实体拥有多个 Employee 实体而每个 Employee 实体都对应一个 Department 实体。在 Department 实体中使用 mappedBy 属性指定了关系的维护方是 Employee 实体即 Employee 实体维护了这个关系。在 Employee 实体中使用 ManyToOne 注解指定了关联的 Department 实体同时使用 JoinColumn 注解指定了外键列的名称即 department_id。
多对一关系
在 JPA 中多对一关系与一对多关系相反通常使用 ManyToOne 注解来表示。例如一个 Employee 实体可以属于一个 Department 实体如下所示
Entity
public class Department {IdGeneratedValue(strategy GenerationType.AUTO)private Long id;private String name;// getters and setters多对多关系
在 JPA 中多对多关系通常使用 ManyToMany 注解来表示。例如一个 Student 实体可以选修多个 Course 实体而每个 Course 实体也可以被多个 Student 实体选修如下所示
Entity
public class Student {IdGeneratedValue(strategy GenerationType.AUTO)private Long id;private String name;ManyToMany(cascade {CascadeType.PERSIST, CascadeType.MERGE})JoinTable(name student_course,joinColumns JoinColumn(name student_id),inverseJoinColumns JoinColumn(name course_id))private ListCourse courses;// getters and setters
}Entity
public class Course {IdGeneratedValue(strategy GenerationType.AUTO)private Long id;private String name;ManyToMany(mappedBy courses)private ListStudent students;// getters and setters
}上述示例中Student 实体与 Course 实体之间建立了多对多的关系一个 Student 实体可以选修多个 Course 实体而每个 Course 实体也可以被多个 Student 实体选修。在 Student 实体中使用 ManyToMany 注解指定了与 Course 实体的关系并在 JoinTable 注解中指定了关联表的名称以及关联 Student 实体的主键和 Course 实体的主键。在 Course 实体中使用 mappedBy 属性指定了关系的维护方是 Student 实体即 Student 实体维护了这个关系。
需要注意的是为了避免出现重复的数据通常使用 CascadeType.PERSIST 和 CascadeType.MERGE 级联操作来保存关联的实体。同时由于 JoinTable 中的主键是由 Student 实体和 Course 实体组合而成的复合主键所以需要在 Student 和 Course 实体中实现 equals 和 hashCode 方法以确保比较两个实体对象时正确性。
4.JPQL
Java Persistence Query LanguageJava持久化查询语言
是一种可移植的查询语言可以被编译成所有主流数据库服务器 上的SQLJPQL是面向对象的通过面向对象而非面向数据库的查询语言查 询数据在Java空间对类和对象进行操作避免程序的SQL语句 紧密耦合使用 javax.persistence.Query接口代表一个查询实例
二、JPA实战
使用JPA持久化对象步骤
创建EntityManagerFactory创建和销毁都相当耗费资源通常一个系统内一个数据库仅创建一个。创建EntityManager创建实体类使用注解来描述实体类跟数据库之间的一一映射关系使用JPA API完成数据增加、删除、修改和查询操作persisit、remove、merge、find
假设有一个表名为 user包含以下字段
FieldTypeidINTnameVARCHAR(100)ageINTemailVARCHAR(100)passwordVARCHAR(100)
接下来我们需要使用 JPA 完成实体类及使用 EntityManager 完成增删改查操作。
首先我们需要定义一个实体类 User对应 user 表中的一条记录
Entity
Table(name user)
public class User {IdGeneratedValue(strategy GenerationType.IDENTITY)private Integer id;private String name;private Integer age;private String email;private String password;// getters and setters
}在上述代码中我们使用 Entity 注解表示这是一个实体类使用 Table 注解指定了实体对应的表名为 user。同时我们在类中定义了实体对应的属性并使用 Id 和 GeneratedValue 注解表示该属性为实体的唯一标识并指定了该属性的生成策略为自增长。
接下来我们可以使用 EntityManager 对实体进行增删改查操作。以下是一个示例
public class UserDao {PersistenceContextprivate EntityManager entityManager;// 添加用户public void addUser(User user) {entityManager.persist(user);}// 根据 id 查询用户public User getUserById(Integer id) {return entityManager.find(User.class, id);}// 更新用户信息public void updateUser(User user) {entityManager.merge(user);}// 根据 id 删除用户public void deleteUserById(Integer id) {User user entityManager.find(User.class, id);entityManager.remove(user);}}在上述代码中我们使用 PersistenceContext 注解将 EntityManager 注入到 UserDao 类中。接着我们定义了几个方法分别用于添加、查询、更新和删除用户。
在 addUser 方法中我们使用 EntityManager 的 persist 方法将用户对象保存到数据库中。
在 getUserById 方法中我们使用 EntityManager 的 find 方法根据用户的唯一标识 id 查询用户信息并将查询结果返回。
在 updateUser 方法中我们使用 EntityManager 的 merge 方法将修改后的用户对象保存到数据库中。
在 deleteUserById 方法中我们使用 EntityManager 的 remove 方法将根据用户的唯一标识 id 查询到的用户对象从数据库中删除。
需要注意的是为了使用 EntityManager我们需要将 JPA 的实现框架如 Hibernate配置到项目中并在 persistence.xml 配置文件中配置数据源等信息。
三、流行的ORM框架(基于JPA)
1.Hibernate
Hibernate是一个流行的ORM对象关系映射框架它提供了一种方便的方式来映射Java对象与关系型数据库表之间的关系。Hibernate是一个开源框架可以在Java平台上使用并支持多种关系型数据库。
Hibernate主要功能包括
实体映射Hibernate通过Java注解或XML文件将Java对象映射到数据库表上实现了Java对象与关系型数据库的映射。开发人员可以通过简单的配置来实现复杂的对象关系映射。数据库操作Hibernate提供了一组API用于执行各种数据库操作例如插入、更新、删除和查询数据。事务管理Hibernate支持事务处理确保所有数据库操作都可以在事务中进行以保证数据的完整性和一致性。缓存管理Hibernate提供了一些缓存机制可以减少数据库访问次数提高性能。查询语言Hibernate提供了一种名为HQLHibernate Query Language的查询语言它允许开发人员以面向对象的方式查询数据库。
除了以上功能Hibernate还支持诸如延迟加载、级联操作、事件监听、版本控制等高级特性使得开发人员可以更加灵活地使用Hibernate。Hibernate还有一个称为Hibernate Tools的插件可以集成到Eclipse等开发工具中提供一些便捷的工具帮助开发人员更加高效地使用Hibernate。
Hibernate是一个成熟的ORM框架在Java开发中得到了广泛应用也是JPA规范的实现之一。
2.Spring Data JPA
Spring Data JPA是Spring框架中的一个模块它提供了一种更方便的方式来使用JPAJava Persistence API规范。它简化了JPA的使用并提供了一些便利的功能如自动生成查询、分页和排序等。使用Spring Data JPA可以减少代码量提高开发效率。
Spring Data JPA主要功能包括
Repository接口Spring Data JPA提供了一个Repository接口它包含了一组常用的CRUDCreate, Retrieve, Update, Delete操作可以用来访问数据库中的数据。开发人员只需定义一个接口继承Repository接口就可以直接使用这些操作。自定义查询方法除了提供常用的CRUD操作外Spring Data JPA还支持通过方法名来自动生成查询这样就不需要编写JPQLJava Persistence Query Language语句了。例如如果要根据用户名查询用户信息可以定义一个名为findByUsername的方法Spring Data JPA会自动生成查询语句。分页和排序Spring Data JPA支持分页和排序开发人员只需要在Repository接口的方法中传入Pageable对象就可以实现分页和排序功能。JPA Criteria查询Spring Data JPA还支持使用JPA Criteria查询它可以以面向对象的方式构建动态查询。使用JPA Criteria查询可以提高代码的可维护性和灵活性。
Spring Data JPA是一种非常方便的ORM框架它可以减少代码量提高开发效率。它建立在JPA之上提供了一些便利的功能使得开发人员可以更加轻松地使用JPA。