Spring Data JPA的基本学习之了解

134 阅读7分钟

Spring Data JPA 是 什 么

       可以理解为JPA规范的再次封装抽象,底层还是使用了Hibernate的JPA技术实现,引用JPQL(Java Persistence Query Language)查询语言,属于Spring整个生态体系的一部分。随着Spring Boot和Spring Cloud在市场上的流行,Spring Data JPA也逐渐进入大家的视野,它们组成有机的整体,使用起来比较方便,加快了开发的效率,使开发者不需要关心和配置更多的东西,完全可以沉浸在Spring的完整生态标准实现下。JPA上手简单,开发效率高,对对象的支持比较好,又有很大的灵活性,市场的认可度越来越高。

**JPA是Java Persistence API的简称,中文名为Java持久层API,是JDK 5.0注解或XML描述对象-关系表的映射关系,并将运行期的实体对象持久化到数据库中。

  JPA包括以下3方面的内容:

  (1)一套API标准。在javax.persistence的包下面,用来操作实体对象,执行CRUD操作,框架在后台替代我们完成所有的事情,开发者从烦琐的JDBC和SQL代码中解脱出来。

  (2)面向对象的查询语言:Java Persistence QueryLanguage(JPQL)。这是持久化操作中很重要的一个方面,通过面向对象而非面向数据库的查询语言查询数据,避免程序的SQL语句紧密耦合

  (3)ORM(object/relational metadata)元数据的映射。JPA支持XML和JDK5.0注解两种元数据的形式,元数据描述对象和表之间的映射关系,框架据此将实体对象持久化到数据库表中。

Spring Data 介 绍 

        Spring  Data项目是从2010年发展起来的,从创立之初SpringData就想提供一个大家熟悉的、一致的、基于Spring的数据访问编程模型,同时仍然保留底层数据存储的特殊特性。它可以轻松地让开发者使用数据访问技术,包括关系数据库、非关系数据库(NoSQL)和基于云的数据服务。 

  Spring Data Common是Spring Data所有模块的公用部分,该项目提供跨Spring数据项目的共享基础设施。它包含了技术中立的库接口以及一个坚持java类的元数据模型。

  Spring Data不仅对传统的数据库访问技术JDBC、Hibernate、JDO、TopLick、JPA、Mybitas做了很好的支持、扩展、抽象、提供方便的API,还对NoSQL等非关系数据做了很好的支持,包括MongoDB、Redis、Apache Solr等 

 

第一 orm思想
主要目的:操作实体类就相当于操作数据库表
建立两个映射关系:
实体类和表的映射关系
实体类中属性和表中字段的映射关系
不再重点关注:sql语句

实现了ORM思想的框架:mybatis,hibernate

第二 hibernate框架介绍
Hibernate是一个开放源代码的对象关系映射框架,
它对JDBC进行了非常轻量级的对象封装,
它将POJO与数据库表建立映射关系,是一个全自动的orm框架

第三 JPA规范
jpa规范,实现jpa规范,内部是由接口和抽象类组成

第四 jpa的基本操作
案例:是客户的相关操作(增删改查)
客户:就是一家公司
客户表:

jpa操作的操作步骤
1.加载配置文件创建实体管理器工厂
Persisitence:静态方法(根据持久化单元名称创建实体管理器工厂)
createEntityMnagerFactory(持久化单元名称)
作用:创建实体管理器工厂

2.根据实体管理器工厂,创建实体管理器
EntityManagerFactory :获取EntityManager对象
方法:createEntityManager

  • 内部维护的很多的内容
    内部维护了数据库信息,
    维护了缓存信息
    维护了所有的实体管理器对象
    再创建EntityManagerFactory的过程中会根据配置创建数据库表
  • EntityManagerFactory的创建过程比较浪费资源
    特点:线程安全的对象
    多个线程访问同一个EntityManagerFactory不会有线程安全问题
  • 如何解决EntityManagerFactory的创建过程浪费资源(耗时)的问题?
    思路:创建一个公共的EntityManagerFactory的对象
  • 静态代码块的形式创建EntityManagerFactory

3.创建事务对象,开启事务
EntityManager对象:实体类管理器
beginTransaction : 创建事务对象
presist : 保存
merge : 更新
remove : 删除
find/getRefrence : 根据id查询

Transaction 对象 : 事务
begin:开启事务
commit:提交事务
rollback:回滚
4.增删改查操作
5.提交事务
6.释放资源

i.搭建环境的过程
1.创建maven工程导入坐标
2.需要配置jpa的核心配置文件
*位置:配置到类路径下的一个叫做 META-INF 的文件夹下
*命名:persistence.xml
3.编写客户的实体类
4.配置实体类和表,类中属性和表中字段的映射关系
5.保存客户到数据库中
ii.完成基本CRUD案例
persist : 保存
merge : 更新
remove : 删除
find/getRefrence : 根据id查询

iii.jpql查询
sql:查询的是表和表中的字段
jpql:查询的是实体类和类中的属性

  • jpql和sql语句的语法相似

1.查询全部
2.分页查询
3.统计查询
4.条件查询
5.排序

代码结构

package cn.itcast.domain;

import javax.persistence.*;

/**
 * 客户实体类
 *     配置映射关系
 *        1、实体类和表的映射关系
 *        2、实体类中属性和表中字段的映射关系
 * @Entity:声明实体类
 * @Table:配置实体类和表的映射关系
 *       name:配置数据库标的名称
 * 2.实体类中属性和表中字段的映射光线
 */
@Entity
@Table(name = "cst_customer")
public class Customer {
    /**
     * @Id:声明主键配置
     * @GeneratedValue:配置主键的生成策略
     *       GenerationType.IDENTITY:自增
     * @Column:配置属性和字段的映射关系
     *       name:数据库中字段的名称
     */
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "cust_id")
    private  Long custId;//客户主键
    @Column(name = "cust_name")
    private  String custName;//客户名称
    @Column(name = "cust_source")
    private  String custSource;//客户来源
    @Column(name = "cust_industry")
    private  String custIndustry;//客户级别
    @Column(name = "cust_level")
    private  String custLevel;//客户所属行业
    @Column(name = "cust_address")
    private  String custAddress;//客户地址
    @Column(name = "cust_phone")
    private  String custPhone;//客户联系方式

    public Long getCustId() {
        return custId;
    }

    public void setCustId(Long custId) {
        this.custId = custId;
    }

    public String getCustName() {
        return custName;
    }

    public void setCustName(String custName) {
        this.custName = custName;
    }

    public String getCustSource() {
        return custSource;
    }

    public void setCustSource(String custSource) {
        this.custSource = custSource;
    }

    public String getCustIndustry() {
        return custIndustry;
    }

    public void setCustIndustry(String custIndustry) {
        this.custIndustry = custIndustry;
    }

    public String getCustLevel() {
        return custLevel;
    }

    public void setCustLevel(String custLevel) {
        this.custLevel = custLevel;
    }

    public String getCustAddress() {
        return custAddress;
    }

    public void setCustAddress(String custAddress) {
        this.custAddress = custAddress;
    }

    public String getCustPhone() {
        return custPhone;
    }

    public void setCustPhone(String custPhone) {
        this.custPhone = custPhone;
    }

    @Override
    public String toString() {
        return "Customer{" +
                "custId=" + custId +
                ", custName='" + custName + ''' +
                ", custSource='" + custSource + ''' +
                ", custIndustry='" + custIndustry + ''' +
                ", custLevel='" + custLevel + ''' +
                ", custAddress='" + custAddress + ''' +
                ", custPhone='" + custPhone + ''' +
                '}';
    }
}
xml文件
```

```
<?xml version="1.0" encoding="UTF-8"?>
<persistence xmlns="http://java.sun.com/xml/ns/persistence" version="2.0">
   <!--需要配置persistence-unit节点
       持久化单元:
            name:持久化单元名称
            transaction-type:事务管理的方式
            RESOURCE_LOCAL:本地事务管理
   -->
    <persistence-unit name="myJpa" transaction-type="RESOURCE_LOCAL">
        <!--jpa的实现方式-->
        <provider>org.hibernate.jpa.HibernatePersistenceProvider</provider>

        <!--可选配置:配置jpa实现方式的配置信息-->
        <properties>
            <!--数据库信息
            用户名,javax.persistence.jdbc.user
            密码,javax.persistence.jdbc.password
            驱动,javax.persistence.jdbc.driver
            数据库地址javax.persistence.jdbc.url
            -->
            <property name="javax.persistence.jdbc.user" value="root"/>
            <property name="javax.persistence.jdbc.password" value="root"/>
            <property name="javax.persistence.jdbc.driver" value="com.mysql.jdbc.Driver"/>
            <property name="javax.persistence.jdbc.url" value="jdbc:mysql:///jpa"/>

            <!--配置jpa实现方(hibernate)的配置信息
            显示sql     :false/true
            自动创建数据库:
                  create:程序运行创建数据库
                  update:程序运行时创建表
                  none:
            -->
            <property name="hibernate.show_sql" value="true"/>
            <property name="hibernate.hbm2ddl" value="create"/>
        </properties>
    </persistence-unit>
</persistence>
测试代码:
```

```
package cn.itcast.test;

import cn.itcast.domain.Customer;
import org.junit.Test;

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

public class JpaTest {

    /**
     * 测试jpa保存
     * Jpa的操作步骤
     *    1.加载配置文件创建工厂(实体管理类工厂)对象
     *    2.通过实体管理类工厂获取实体管理器
     *    3.获取事务对象,开启事务
     *    4.完成增删改查操作
     *    5.提交事务(回滚事务)
     *    6.释放资源
     */
    @Test
    public  void testSave(){
        //1.加载配置文件创建工厂(实体管理类工厂)对象
        EntityManagerFactory factory=Persistence.createEntityManagerFactory("myJpa");
        //2.通过实体管理类工厂获取实体管理器
        EntityManager em=factory.createEntityManager();
        //3.获取事务对象,开启事务
        EntityTransaction tx=em.getTransaction();//获取事务对象
        tx.begin();//开启事务
        //4.完成增删改查操作
        Customer customer =new Customer();
        customer.setCustName("杰哥");
        customer.setCustSource("11");
        customer.setCustIndustry("二级");
        customer.setCustLevel("软件技术");
        customer.setCustAddress("湖南湘潭");
        customer.setCustPhone("17369299939");
        //保存
        em.persist(customer);//保存操作
        //5.提交事务(回滚事务)
        tx.commit();
        //6.释放资源
        em.close();
        factory.close();

    }
}
主要的jar包
```

```
<properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <project.hibernate.version>5.0.7.Final</project.hibernate.version>
</properties>

<dependencies>
    <!-- junit -->
    <dependency>
        <groupId>junit</groupId>
        <artifactId>junit</artifactId>
        <version>4.12</version>
        <scope>test</scope>
    </dependency>

    <!-- hibernate对jpa的支持包 -->
    <dependency>
        <groupId>org.hibernate</groupId>
        <artifactId>hibernate-entitymanager</artifactId>
        <version>${project.hibernate.version}</version>
    </dependency>

    <!-- c3p0 -->
    <dependency>
        <groupId>org.hibernate</groupId>
        <artifactId>hibernate-c3p0</artifactId>
        <version>${project.hibernate.version}</version>
    </dependency>

    <!-- log日志 -->
    <dependency>
        <groupId>log4j</groupId>
        <artifactId>log4j</artifactId>
        <version>1.2.17</version>
    </dependency>

    <!-- Mysql and MariaDB -->
    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
        <version>5.1.6</version>
    </dependency>
</dependencies>