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 JPA介绍

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等

 

Spring Data的子项目

Spring Data JPA介绍

 

 Spring Data操作的主要特性

  Spring Data项目旨在为大家提供一种通用的编码模式。数据访问对象实现了对物理数据层的抽象,为编写查询方法提供了方便。通过对象映射,实现域对象和持续化存储之间的转换,而模板提供的是对底层存储实体的访问实现。如图1-4所示。操作上主要有如下特征:

  提供模板操作,如Spring Data Redis和Spring Data Riak。

  强大的Repository和定制的数据存储对象的抽象映射。
  对数据访问对象的支持(Auting等)。
  

Spring Data JPA介绍

 

 

Spring Data JPA的主要类及结构图

  七个Repository接口:

    1.Repository

    2.CrudRepository

    3.PagingAndSortingRepository

    4.QueryByExampleExecutor

    5.JpaRepository

    6.JpaSpeccificationExecutor

    7.QueryDslPredicateExecutor

  两个实现类:

    1.SimpleJpaRepository

    2.QueryDslJpaRepository

  关系结构图如图1-5所示。

    Spring Data JPA介绍

 

MySQL的快速开发实例

  1.创建表

1

2

3

4

5

6

CREATE TABLE `user` (

`id` int(11) NOT NULL,

`namevarchar(255) DEFAULT NULL,

`email` varchar(255) DEFAULT NULL,

PRIMARY KEY (`id`)

) ENGINE=InnoDB DEFAULT CHARSET=utf8;

  2.创建springboot项目

 配置jpa、mysql、web依赖

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

<dependency>

            <groupId>org.springframework.boot</groupId>

            <artifactId>spring-boot-starter-data-jpa</artifactId>

        </dependency>

        <dependency>

            <groupId>org.springframework.boot</groupId>

            <artifactId>spring-boot-starter-web</artifactId>

        </dependency>

 

        <dependency>

            <groupId>mysql</groupId>

            <artifactId>mysql-connector-java</artifactId>

            <scope>runtime</scope>

        </dependency>

        <dependency>

            <groupId>org.springframework.boot</groupId>

            <artifactId>spring-boot-starter-test</artifactId>

            <scope>test</scope>

        </dependency>

        <dependency>

            <groupId>org.projectlombok</groupId>

            <artifactId>lombok</artifactId>

        </dependency>

  3.配置application.properties

1

spring.datasource.url=jdbc:mysql://localhost:3306/db_jpa<em id="__mceDel" style="font-size: 12px;">?characterEncoding=utf8&useSSL=false&serverTimezone=UTC</em>

1

spring.datasource.username=root<br>spring.datasource.password=root

  4.创建实体类

1

2

3

4

5

@Entity

@Data

public class User {

    @Id

    @GeneratedValue(strategy = GenerationType.<em id="__mceDel" style="font-size: 12px;">IDENTITY</em><em id="__mceDel" style="font-size: 12px;">) <br>  private Long id; <br>  private String name; <br>  private String email; <br>}</em>

  5.创建Repository

1

2

3

public interface UserRepository extends CrudRepository<User,Long>{

     

}

  6.创建Controller

 

@RestController
public class UserController {
    @Autowired
    private UserRepository userRepository;

    @GetMapping("/add")
    public User addUser(@RequestParam String name,@RequestParam String email){
        User user=new User();
        user.setName(name);
        user.setEmail(email);
        return userRepository.save(user);
    }

    @GetMapping("/get")
    public Iterable<User> getAll(){
        return userRepository.findAll();
    }
}

  7.运行main方法

提示:org.hibernate.HibernateException: Access to DialectResolutionInfo cannot be null when 'hibernate.dia

问题:原来是Hibernate SQL方言没有设置导致的,在properties文件中增加下面这行

1

spring.jpa.database-platform=org.hibernate.dialect.MySQLDialect