一、概念
1、什么是Spring Data
Spring Data的目的是为了简化构建基于Spring框架应用的数据访问
其包括了非关系数据库 Map-Reduce 框架 云数据服务等等 另外也包含对关系数据库的访问支持
Spring Data的下面有很多子项目:
– Spring Data Commons
– Spring Data JPA
– Spring Data KeyValue
– Spring Data LDAP
– Spring Data MongoDB
– Spring Data Gemfire
– Spring Data REST
– Spring Data Redis
– Spring Data for Apache Cassandra
– Spring Data for Apache Solr
– Spring Data Couchbase (community module)
– Spring Data Elasticsearch (community module)
– Spring Data Neo4j (community module)
SpringData提供了使用统一的API来对数据访问层进行操作
主要是由Spring Data Commons项目来实现的
Spring Data Commons在使用关系型或者非关系型数据访问技术时都基于Spring提供的统一标准
该标准包含了CRUD(创建 获取 更新 删除) 查询 排序和分页的相关操作
Spring Data提供了一些统一的Repository接口
这些接口具有增删改查功能 分页功能 及乐观锁机制的功能
CrudRepository<T, ID extends Serializable> :基本CRUD操作
PagingAndSortingRepository<T, ID extends Serializable> :基本CRUD及分页
RevisionRepository<T, ID extends Serializable, N extends Number & Comparable<N>> :乐观锁机制
只须用自己写的接口来继承这些自带的接口 即可具有相应的功能 无须关心其具体实现
Spring Data还提供了数据访问的模板类Template
例如RedisTemplate MongoTemplate等
因此 有了Spring Data 就相当于是"面向SpringData编程"
2、什么是JPA
JPA并不是一个框架 而是一种J2EE的规范:Java Persistence API
该规范也称为JSR规范
JSR是Java Specification Requests的缩写 意为Java规范提案
该规范 有很多的实现 例如著名的Hibernate
还有Toplink OpenJPA等等
总而言之 Spring Data就是相当于对这些框架的的再封装
Spring Data的底层默认使用的是Hibernate
二、SpringBoot整合JPA
首先 创建项目
若是用SpringBoot Initializer向导来创建的 须添加Spring Data JPA
若是手动创建 则需引入依赖:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jdbc</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>
<exclusions>
<exclusion>
<groupId>org.junit.vintage</groupId>
<artifactId>junit-vintage-engine</artifactId>
</exclusion>
</exclusions>
</dependency>
然后是编写数据源的配置文件:
spring:
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://127.0.0.1:3306/springboot_jpa?useUnicode=true&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=UTC
username: root
password: 123456
由于JPA规范是基于ORM(Object Relational Mapping)思想的
因此 须编写实体类bean和数据表进行映射 并配置映射关系
编写一个实体类:
数据库中若无对应的表 Spring Data JPA还能提供自动创建表的功能(当然 前提是进行了配置
// 使用JPA注解来配置映射关系
// @Entity注解:告诉JPA该类是一个实体类 是和数据表进行映射的类
@Entity
// @Table注解:主动指定和数据库中的哪个数据表进行映射 若省略 则默认表名为该类的类名小写
@Table(name = "tb_user")
public class User {
// @Id注解:表明该属性是一个主键
@Id
// @GeneratedValue注解:指定该属性的主键生成策略 IDENTITY代表自增主键
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Integer id;
// @Column注解:表明该属性是和数据表对应的一个列 还可指定列名和最大长度
@Column(name = "last_name",length = 20)
private String lastName;
// 若不指定列名 则默认列名为该属性的属性名
@Column
private String email;
getter()和setter()方法省略...
}
最后 再在配置文件中进行一些简单的基本配置:
jpa:
hibernate:
# 数据表的生成策略:update代表更新或创建数据表 若无该数据表 则创建 若有该数据表 则更新
ddl-auto: update
# 显示每次执行的sql语句
show-sql: true
JPA的属性都在JpaProperties
这个类中 若不知有何属性可供配置 参照该类即可
至此 全部配置完毕
简单测试:
@RestController
public class UserController {
@Autowired
UserRepository userRepository;
@GetMapping("/user/{id}")
public User getUser(@PathVariable("id") Integer id)
{
// 在2.x的新版本的Spring Data JPA中 findById()返回值有可能是空值 须用orElse()进行判断
return (User) userRepository.findById(id).orElse(null);
}
@GetMapping("/addUser")
public User insertUser(User user)
{
// 返回该储存的对象
return userRepository.save(user);
}
}
结果:
测试成功 无需编写任何sql语句