主要内容
1. Spring Data
2. 引入spring-boot-starter-data-jpa
3. 配置文件打印SQL语句
4. 创建Entity标注JPA注解
5. 创建Repository接口继承JpaRepository
6. 测试方法
1. SpringData简介
SpringData是SpringBoot底层进行数据访问默认采用的技术。它是Spring官方开发出来用来简化数据访问
的一个项目。
在这个项目中有非常多的模块能简化各种数据(库)访问操作:
Spring Data Commons:
让我们在使用关系型或者非关系型数据访问技术时都基于Spring提供的统一标准,
标准包含了CRUD(创建、获取、更新、删除)、查询、排序和分页的相关操作。
Spring Data JPA: 简化关系型数据库访问的操作
Spring Data MongoDB : 简化MongoDB数据库访问的操作
Spring Data Redis: 简化Redis数据库的访问操作
SpringData的理想是统一我们数据访问的API,怎么统一呢?
1. SpringData会提供统一的Repository接口:
Repository<T, ID extends Serializable>:最顶层的统一接口
CrudRepository<T, ID extends Serializable>:基本CRUD操作
PagingAndSortingRepository<T, ID extends Serializable>:基本CRUD及分页
那么今后我们再对数据库进行增删改查,
我们只要写一个接口继承CrudRepository<T, ID extends Serializable>,我们这个接口就具有了
基本的增删改查操作,不用关心任何的实现。

如果我们写一个repository类继承了JpaRepository,那么这个repository既有分页排序功能,
也有CRUD等功能
这是SpringData为我们提供的统一的Repository接口
2. Spring还为我们提供了统一的模板类
操作Rides: RedisTemplate模版
操作MongoDB: MongoTemplate模版
来帮我们简化对相关数据库的操作
3. 有了SpringData,我们只需要面向SpringData编程。我们用好SpringData为我们统一提供的API即可。
2. SpringBoot整合JPA
2.1 概述
我们的课程操作的时关系型数据库,所以主要学习JPA
JPA:Java Persistence API JAVA持久化API
它是J2EE的一个规范,也称为JSR 317规范。
这个规范的实现有很多:
SpringBoot JPA的实现
Hibernate的实现
Toplink的实现
OpenJPA的实现
如果没有SpringData,我们学习一个框架就要学习对应这个框架的JPA实现。
SpringData默认底层使用Hibernate对于JPA的实现
有了SpringData就相当于对这些实现进行了一个再封装。

Jpa、Hibernate、Spring Data Jpa三者之间的关系:
总的来说JPA是ORM规范,Hibernate、TopLink等是JPA规范的具体实现,这样的好处是开发者
可以面向JPA规范进行持久层的开发,而底层的实现则是可以切换的。Spring Data Jpa
则是在JPA之上添加另一层抽象(Repository层的实现),极大地简化持久层开发及ORM框架切
换的成本

2.2 整合JPA
1. 创建工程
注意:如果导JPA包导不进去,可以将pom.xml中的<parent/>版本调低一点(2.2.2)试试
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.2.2.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>

2. 整合Druid数据源
3. JPA也是基于ORM思想的(Object Relational Mapping)
4. 编写一个实体类(Bean)和数据表进行映射,并且配置好映射关系
//使用JPA注解配置映射关系
@Entity //告诉JPA这是一个实体类(和数据库表映射的类,不是一个普通的类)
@Table(name = "tbl_user") //指定和哪个数据表对应,如果省略默认表名是类名小写
public class User {
@Id //这是一个主键
@GeneratedValue(strategy = GenerationType.IDENTITY) //主键生成策略:自增主键
private Integer id;
@Column(name = "last_name", length = 50) //和数据表对应的列
private String lastName;
@Column //省略默认列名就是属性名
private String email;
}
5. 编写一个Dao/Repository接口来操作实体类对应的数据表
继承JpaRepository,那么这个Repository既有分页排序功能,也有CRUD功能

public interface UserRepository extends JpaRepository<User, Integer>
//操作数据表的Repository继承JpaRepository来完成对数据库的操作
public interface UserRepository extends JpaRepository<User, Integer> {
//它里面有各种CRUD方法和分页排序方法
}
注意两个泛型:
1. 要操作的实体类。
2. 实体类的主键类型。
6. 基本的JPA配置:JpaProperties类中
spring:
jpa:
hibernate:
# 更新或者创建数据表结构:如果创建过了就不再创建了
ddl-auto: update
# 在控制台显示sql
show-sql: true
7. 启动测试一下
1. 表已经创建了

8. 写一个UserController测试一下能不能操作数据库
@RestController
public class UserController {
@Autowired
UserRepository userRepository;
@GetMapping("/user/{id}")
public User getUser(@PathVariable("id") Integer id){
User user = userRepository.findById(id).get();
return user;
}
@GetMapping("/user")
public User insertUser(User user){
User saveUser = userRepository.save(user);
return saveUser;
}
}

测试成功,但是发现插入时中文乱码。
9. 解决插入时中文乱码

