1.什么是JPA
首先JPA的全称叫做Java Persistence API,
JPA是一个基于O/R映射的标准规范,在这个规范中,
JPA只定义标准规则,不提供实现,使用者则需要按照规范中定义的方式来使用。
目前JPA的主要实现有Hibernate、EclipseLink、OpenJPA等,事实上,
由于Hibernate在数据访问解决技术领域的绝对霸主地位,
JPA的标准基本是由Hibernate来主导的
2.JPA核心组件
> EntityManagerFactory: 创建和管理多个EntityManager实例
> EntityManager: 接口,管理对象的操作(create, update, delete, Query)
> Entity: 持久化对象,在数据库中以record存储
> EntityTransaction: 与EntityManager一对一
> Persistence: 包含获取EntityManagerFactory实例的静态方法
> Query: 运营商必须实现的接口,获取满足creteria的关系对象(relational object)
3.优缺点
优点:可持久化Java对象、 使用简单、规范标准化、 事务性、大数据量
JPA应该用在需要标准的基于Java的持久性解决方案的时候。
缺点是其需要一个实现了其自身的提供程序,
JPA被定义成只能在关系数据库上工作。
如果你的持久化解决方案需要扩展到其他类型的数据存储上,比如XML数据库上的话,则JPA就不能够用来解决你的持久性问题了。
JPA也提供一个完整的ORM解决方案,并提供对诸如继承和多态一类的面向对象编程特性的支持,不过它的性能则取决于持久性提供程序
4.简单实现
Spring Boot中使用JPA
1.创建工程并添加相关依赖
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-jpa</artifactId> </dependency>
2.配置application.properties
#JPA的配置 spring.jpa.hibernate.ddl-auto=update spring.jpa.show-sql=true spring.jackson.serialization.indent_output=false spring.jpa.hibernate.dialect=org.hibernate.dialect.MySQL5Dialect
3.定义映射实体类
@Entity @NamedQuery(name = "Person.withNameAndAddressNamedQuery", query = "select p from Person p where p.name=?1 and p.address=?2") /* @Entity @NamedQueries({ @NamedQuery(name="Person.findByName", query="select p from Person p where p.name=?1"), @NamedQuery(name = "Person.withNameAndAddressNamedQuery", query = "select p from Person p where p.name=?1 and address=?2") }) 定义多条语句的写法 public class Person{ } */ public class Person { @Id @GeneratedValue /** * 实体类上我们使用了@Entity注解,这个表示这是一个和数据库表映射的实体类, * 在属性id上我们添加了@Id注解, * 表示该字段是一个id,@GeneratedValue注解则表示该字段自增。 * @NamedQuery注解表示一个NamedQuery查询,这里一个名称代表一个查询语句, * 我们一会可以在控制器中直接调用@NamedQuery中的withNameAndAddressNamedQuery方法, * 该方法代表的查询语句是select p from Person p where p.name=?1 and p.address=?2。 * */ private Long id; private String name; private Integer age; private String address; public Person() { } public Person(Long id, String name, Integer age, String address) { this.id = id; this.name = name; this.age = age; this.address = address; } public Long getId() { return id; } public void setId(Long id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public Integer getAge() { return age; } public void setAge(Integer age) { this.age = age; } public String getAddress() { return address; } public void setAddress(String address) { this.address = address; } }
这里的getset方法可以用lombok 的@Data注解 省去
4.定义数据访问接口
继承JpaRepository接口
当我们继承JpaRepository接口后,我们就自动具备了如下数据访问方法:
List<T> findAll();
List<T> findAll(Sort var1);
List<T> findAll(Iterable<ID> var1);
<S extends T> List<S> save(Iterable<S> var1);
void flush();
<S extends T> S saveAndFlush(S var1);
void deleteInBatch(Iterable<T> var1);
void deleteAllInBatch();
T getOne(ID var1);
<S extends T> List<S> findAll(Example<S> var1);
<S extends T> List<S> findAll(Example<S> var1, Sort var2);
5.最后写一个简单的controller就可以测试了
一些备注:
JPA提供的技术:
1)ORM映射元数据:JPA支持XML和JDK 5.0注解两种元数据的形式,元数据描述对象和表之间的映射关系,框架据此将实体对象持久化到数据库表中;
2)JPA 的API:用来操作实体对象,执行CRUD操作,框架在后台替我们完成所有的事情,开发者从繁琐的JDBC和SQL代码中解脱出来。
3)查询语言:通过面向对象而非面向数据库的查询语言查询数据,避免程序的SQL语句紧密耦合。
JPA现在就是Hibernate功能的一个子集。可以简单的理解为JPA是标准接口,Hibernate是实现。
JPA是规范,Hibernate是框架,JPA是持久化规范,而Hibernate实现了JPA。
JPA的出现有两个原因:
其一,简化现有Java EE和Java SE应用的对象持久化的开发工作;
其二,Sun希望整合对ORM技术,实现持久化领域的统一。
这里参考的博客有:https://blog.csdn.net/u012702547/article/details/53946440
https://www.cnblogs.com/wangdaijun/p/7064979.html
还有一些写得非常详细的博客:
https://blog.csdn.net/linzhiqiang0316/article/details/52639265
感谢感谢