JPA & SpringData 之JPA

1 JPA概述

1.1 JPA是什么?

  • JPA:Java Persistence API,用于持久化对象的API。
  • Java EE 5.0 平台标准的ORM规范,可以使得应用程序以统一的方式访问数据库。

1.2 JPA和Hibernate的关系

  • JPA是Hibernate的一个抽象(就像JDBC和JDBC驱动一样)。
  • JPA是规范:JPA本质上就是一种ORM规范,不是ORM框架,因为JPA并没有提供ORM的实现,它只是制定了一些规范,提供了一些编程的API接口,但具体的实现由ORM框架厂商提供实现。
  • Hibernate是实现:Hibernate除了作为ORM框架之外,它也是JPA规范的一种实现。

1.3 JPA的供应商

  • JPA的目标之一是制定一个可以由很多供应商实现的API,目前HIbernate 3.2+、TopLink 10.1+以及OpenJPA都提供了对JPA的实现。
  • Hibernate:
    • JPA的始作俑者就是Hibernate的作者。
    • Hibernate从3.2开始兼容JPA。
  • OpenJPA:
    • OpenJPA是Apache组织提供的开源项目。
  • TopLink:
    • TopLInk以前需要收费,如今开源免费。      

1.4 JPA的优势

  • ①标准化:提供相同的API,这保证了基于JPA开发的企业应用能够经过少量的修改就能够在不同的JPA框架下运行。
  • ②简单易用,集成方便:JPA的主要目标之一就是提供更加简单的编程模型,在JPA框架下创建实体和创建Java类一样简单,只需要使用javax.persistence.Entity注解标注即可,而且JPA的框架和接口也非常简单。
  • ③可媲美JDBC的查询能力:JPA的查询语言是面向对象的,JPA定义了独特的JPQL,而且能够支持批量更新和修改、Join、Group by、having等通常只有SQL才能够提供的高级查询特性,甚至还能够支持子查询。
  • ④支持面向对象的高级特性:JPA中能够支持面向对象的高级特性,如类之间的继承、多态和类之间的复杂关系,最大限度的使用面对对象的模型。

1.5 JPA包括 3 方面的技术

  • ①ORM 映射元数据:JPA支持XML和JDK5.0 注解两种元数据的形式,元数据描述对象和表之间的映射关系,框架会据此将实体对象持久化到数据库表之中。
  • ②JPA的API:用来操作实体对象,执行CRUD操作,框架在后台完成所有的事情,开发者从繁琐的JDBC和SQL代码中解脱出来。
  • ③查询语言(JPQL):这是持久化操作中很重要的一个方面,通过面向对象而非面向数据库的查询语言查询数据,避免程序和具体的SQL的紧密耦合。

2 JPA的HelloWorld

2.1 准备环境

  • JDK 1.8 
  • IDEA 2017.3.5

2.2 HelloWorld

2.2.1 persistence.xml

  • 此配置文件相当于Hibernate的hibernate.cfg.xml文件,但是在JPA规范中,规定了此文件的位置是在类路径下的META-INF下,如下图所示

  • 当然,Eclipse和IDEA都支持JPA项目模板的创建。
<?xml version="1.0" encoding="UTF-8"?>
<persistence xmlns="http://java.sun.com/xml/ns/persistence" version="2.0">

    <persistence-unit name="NewPersistenceUnit">
        <!--
        配置使用什么 ORM 产品来作为 JPA 的实现
        1. 实际上配置的是  javax.persistence.spi.PersistenceProvider 接口的实现类
        2. 若 JPA 项目中只有一个 JPA 的实现产品, 则也可以不配置该节点.
        -->
        <provider>org.hibernate.ejb.HibernatePersistence</provider>
        <class>com.xuweiwei.bean.Customer</class>
        <properties>
            <!-- 配置连接数据库的基本信息 -->
            <property name="hibernate.connection.url" value="jdbc:mysql://127.0.0.1:3306/jpa"/>
            <property name="hibernate.connection.driver_class" value="com.mysql.jdbc.Driver"/>
            <property name="hibernate.connection.username" value="root"/>
            <property name="hibernate.connection.password" value="root"/>
            <!-- 配置Hibernate的基本属性 -->
            <property name="hibernate.show_sql" value="true"/>
            <property name="hibernate.format_sql" value="true"/>
            <property name="hibernate.hbm2ddl.auto" value="update"/>
        </properties>
    </persistence-unit>
</persistence>

2.2.2 创建Customer.java类

package com.xuweiwei.bean;

import javax.persistence.*;

/**
 * @author 许威威
 * @description:
 * @motto 代码虐我千百遍,我视代码如初恋
 * @created date :2018-05-10
 * @modified by:
 */
@Entity
@Table(name="customer")
public class Customer {
    private Long id;
    private String lastName;
    private String email;
    private int age;


    @Id
    @GeneratedValue
    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }
    @Column(name = "last_name")
    public String getLastName() {
        return lastName;
    }

    public void setLastName(String lastName) {
        this.lastName = lastName;
    }

    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }
}

2.2.3 测试

package com.xuweiwei.bean;

import org.junit.Test;

import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.EntityTransaction;
import javax.persistence.Persistence;

/**
 * @author 许威威
 * @description:
 * @motto 代码虐我千百遍,我视代码如初恋
 * @created date :2018-05-10
 * @modified by:
 */
public class MainTest {
    @Test
    public void test(){
        /**
         * 创建EntityManagerFactory 就如同Hibernate创建SessionFactory一样
         */
        EntityManagerFactory entityManagerFactory = Persistence.createEntityManagerFactory("NewPersistenceUnit");
        /**
         * 创建EntityManager就如同Hibernate创建Session一样
         */
        EntityManager entityManager = entityManagerFactory.createEntityManager();
        /**
         * 创建EntityTransaction就如果Hibernate创建Transaction
         */
        EntityTransaction transaction = entityManager.getTransaction();
        /**
         * 事务开启,和Hibernate如出一辙
         */
        transaction.begin();
        /**
         * 执行持久化操作
         */

        Customer customer = new Customer();
        customer.setLastName("许威威");
        customer.setAge(26);
        customer.setEmail("[email protected]");

        entityManager.persist(customer);

        /**
         * 提交事务,和Hibernate如出一辙
         */
        transaction.commit();
        /**
         * 关闭entityManager和Hibernate关闭session一样
         */
        entityManager.close();
        /**
         * 关闭entityManagerFactory和Hibernate关闭SessionFactory一样
         */
        entityManagerFactory.close();
    }
}

3 JPA的基本注解

猜你喜欢

转载自www.cnblogs.com/xuweiweiwoaini/p/9019381.html