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 boot jpa打印完整sql jpa spring data jpa_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 boot jpa打印完整sql jpa spring data jpa_JPA简介_02

Spring Data操作的主要特性

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

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

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

spring boot jpa打印完整sql jpa spring data jpa_JPA_03

Spring Data JPA的主要类及结构图

七个Repository接口:

1.Repository

2.CrudRepository

3.PagingAndSortingRepository

4.QueryByExampleExecutor

5.JpaRepository

6.JpaSpeccificationExecutor

7.QueryDslPredicateExecutor

两个实现类:

1.SimpleJpaRepository

2.QueryDslJpaRepository

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

MySQL的快速开发实例

1.创建表

CREATE TABLE `user` (
`id` int(11) NOT NULL,
`name` varchar(255) DEFAULT NULL,
`email` varchar(255) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
CREATE TABLE `user` (
`id` int(11) NOT NULL,
`name` varchar(255) DEFAULT NULL,
`email` varchar(255) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

2.创建springboot项目

配置jpa、mysql、web依赖

<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>
		<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

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

4.创建实体类

@Entity
@Data
public class User {
    @Id
    @GeneratedValue(strategy = GenerationType.id="__mceDel" style="font-size: 12px;">IDENTITY id="__mceDel" style="font-size: 12px;">) 
    private Long id;   
    private String name;   
    private String email; 
}

5.创建Repository

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文件中增加下面这行

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