Spring Data JPA & Hibernate
什么是 ORM
ORM, Object Relationship Mapping, 对象关系映射,表达的是实体类与数据库表之间的映射关系,核心思想是如下规则:
- 实体类映射成表名
- 对象标识映射成主键列
- 属性映射成列名
- 对象关系映射成外键
ORM有很多已经实现了的框架,比如:
 Hibernate框架
 MyBatis框架、
 …
Hibernate 框架
它是一款非常优秀的ORM框架,它可以自动创建并执行DDL语句、DML语句、事务语句等操作,程序员使用HIBERNATE后无需写原生态的SQL命名,通过面向对象的操作就可以完成CRUD操作。
JPA 又是什么?
JPA 是ORACLE公司制定的数据持久层的规范,它的全称:Java Persistence API, 它的目的是整合市面上所有的数据持久层框架,如:Hibernate, mybatis, …
那么这些数据持久层框架要遵守 JPA规范,Hibernate框架是最早实现了JPA规范,它还得到了JPA的兼容性认证。
使用JPA规范去开发数据持久层的好处是:
- 将来可以很方便地从 HIBERNATE 切换到 mybatis或是 toplink. 或者是反过来。
- 由官方提供后续的版本升级

所以,我们可以理解为:
Hibernate框架是JPA规范的实现者之一,当然,是目前JPA实现最好的框架
Spring DATA JPA 又是什么?
Spring Data 是Spring 技术生态下的一个“顶级”项目,与Spring Framework, Spring Boot “平级”, 它也是想一统数据持久层的技术,它当然是基于 Spring 生态, 而Spring Data jpa 是 Spring Data 框架下的一个组成部份,专注于 JPA 规范的实现,由于 Hibernate框架本身是得到了JPA官方的兼容性认证的,所以,Spring DATA JPA并没有重新去实现JPA规范,则是基于 Hibernate 框架做了改良和辅助性功能的提供,使之更好地融入到Spring技术生态中去。
如:

所以,我们可以这么理解,Spring Data JPA 是更高层次的API抽象【相当于具体的ORM框架而言的】
Spring boot 中整合 Spring Data JPA
- 在pom.xml导入 spring data jpa的依赖 - 1 
 2
 3
 4- <dependency> 
 <groupId>org.springframework.boot</groupId>
 <artifactId>spring-boot-starter-data-jpa</artifactId>
 </dependency>
- 在 application.yml 中配置 spring data jpa - 1 
 2
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 16
 17- # jpa config 
 spring:
 jpa:
 generate-ddl: true
 hibernate:
 ddl-auto: update
 show-sql: true
 properties:
 hibernate:
 format_sql: true
 dialect: org.hibernate.dialect.MySQL8Dialect
 datasource:
 driver-class-name: com.mysql.jdbc.Driver
 url: jdbc:mysql://localhost:3306/master?characterEncoding=UTF8&serverTimezone=UTC
 username: root
 password: 123456
- 实体类使用JPA规范中的注解来与表进行映射 - 1 
 2
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29- package com.kclmedu.datajpa.entity; 
 import lombok.Data;
 import javax.persistence.*;
 import java.util.Date;
 (name = "TBL_LOG_RECORD")
 public class LogRecord {
 //表明是主键
 
 private Long id;
 
 private String title;
 
 private String content;
 (name = "record_time")
 private Date recordTime;
 
 private String user;
 }
- 写一个类继承 JpaRepository 类 - 1 
 2
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12- package com.kclmedu.datajpa.dao; 
 import com.kclmedu.datajpa.entity.LogRecord;
 import org.springframework.data.jpa.repository.JpaRepository;
 import org.springframework.stereotype.Repository;
 //可选
 public interface LogRecordRepository extends JpaRepository<LogRecord, Long> {
 //nothing!
 }
- 编写测试类 - 1 
 2
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29- package com.kclmedu.datajpa.dao; 
 import com.kclmedu.datajpa.entity.LogRecord;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.boot.test.context.SpringBootTest;
 import org.springframework.test.context.junit4.SpringRunner;
 import java.util.Date;
 (SpringRunner.class)
 public class LogRecordRepositoryTests {
 
 private LogRecordRepository logRecordRepository;
 
 public void testSave() {
 LogRecord record = new LogRecord();
 record.setTitle("添加操作");
 record.setContent("添加了一条日志记录");
 record.setRecordTime(new Date());
 record.setUser("admin");
 //
 logRecordRepository.save(record);
 }
 }
