JAP在spring中使用

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

感谢感谢


猜你喜欢

转载自blog.csdn.net/qq_38240021/article/details/80070143