每一秒钟的时间都值得铭记

0%

SpringBoot+SpringDataJPA

SpringDataJPA

SpringDataJPA是Spring全家桶中SpringData系列的一个分支,是SpringData对于JPA的封装和支持。
所谓JPA,即Java Persistence API,Java持久层API,是JDK对于ORM规范定义的一套接口,用于在数据持久层中面向对象编程,屏蔽数据库底层操作。
而在所有的JPA实现框架中,最为优秀的自然是Hibernate,所以,SpringDataJPA默认使用的底层实现就是Hibernate框架。而我们平常所说的JPA也默认是Hibernate实现的JPA。

SpringDataJPA作为Spring大家庭的一个成员,自然也默认支持SpringBoot,我们也可以直接使用SpringBoot来搭建SpringDataJPA环境。

创建项目,引入依赖

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
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>

<groupId>com.hrp</groupId>
<artifactId>springboot_jpa</artifactId>
<version>1.0-SNAPSHOT</version>

<!--SpringBoot为父项目-->
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.0.4.RELEASE</version>
</parent>

<dependencies>
<!--SpringBootweb开发的启动器-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!--Spring-Data-JPA的启动器-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<!--测试功能的启动器,用于整合junit测试功能-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<!--lombox插件的依赖,SpringBoot内置,无须标注版本号-->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
<!--MySQL数据库驱动-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
</dependencies>

<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>

application.yml配置文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
spring:
datasource: #配置数据库连接的四个信息,这里使用的是SpringBoot内置的数据库连接池Hikari
driver-class-name: com.mysql.jdbc.Driver
url: jdbc:mysql://localhost:3306/myshop
username: root
password: admin
jpa:
database: mysql #指定数据库
show-sql: true #是否显示SQL语句
generate-ddl: false #是否在启动时初始化schema,默认为false
open-in-view: false #是否注册OpenEntityManagerInViewInterceptor,绑定JPA EntityManager到请求线程中,默认为: true
hibernate:
ddl-auto: update #用于指定数据库表生成策略
jackson:
default-property-inclusion: ALWAYS
time-zone: GMT+8
date-format: yyyy-MM-dd

SpringBoot启动类

1
2
3
4
5
6
@SpringBootApplication
public class MyApplication {
public static void main(String[] args) {
SpringApplication.run(MyApplication.class);
}
}

编写实体类

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
@Data
@Entity
@Table(name = "user")
public class User {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String username;
private String password;
private String name;
private Integer gender;
private Date birthday;
private String phone;
private String picture;
private String address1;
private String address2;
private String address3;
private Integer power;
}

这个实体类对应的user表和上一篇博客SpringBoot+MyBatis+通用Mapper是同一个数据库表,这里就不再写数据库建表语句,有需要的可以去上一篇博客中找。

编写数据访问层

1
2
public interface UserDao extends JpaRepository<User,Long>, JpaSpecificationExecutor<User> {
}

同样,这里只需要继承一个JpaRepository和JpaSpecificationExecutor两个接口就可以了,SpringDataJPA会使用动态代理的方式,自动生成对应的简单访问方法。
JpaRepository中的两个泛型:

  • 第一个为实体类类型
  • 第二个为实体类主键类型

编写业务层

业务层接口

1
2
3
4
5
6
7
8
9
10
11
public interface UserService {

/**
* 分页查询用户数据
* @param pageNum
* @param pageSize
* @return
*/
Page<User> findByPage(Integer pageNum, Integer pageSize);

}

业务层实现

1
2
3
4
5
6
7
8
9
10
11
12
13
@Service
public class UserServiceImpl implements UserService {

@Autowired
private UserDao userDao;

@Override
public Page<User> findByPage(Integer pageNum, Integer pageSize) {
Pageable pageable = PageRequest.of(pageNum,pageSize);
Page<User> page = userDao.findAll(pageable);
return page;
}
}
  • 这里使用了SpringData中的一个分页工具Pageable。

编写Web层

1
2
3
4
5
6
7
8
9
10
11
12
13
14
@RestController
@RequestMapping("user")
public class UserController {

@Autowired
private UserService userService;

@GetMapping("page/{pageNum}")
public ResponseEntity<Page<User>> findByPage(
@PathVariable("pageNum") Integer pageNum,
@RequestParam(defaultValue = "5") Integer pageSize){
return ResponseEntity.ok(userService.findByPage(pageNum,pageSize));
}
}

最后

我们启动SpringBoot项目,然后在浏览器中访问/user/page/{pageNum}这个API。

在这里插入图片描述

【注意】SpringData中的Pageable分页功能,索引是从0开始的,所以如果是正式开发中,我们应该自己维护这个索引,维护策略应该结合需求实际应用。

坚持原创技术分享,您的支持将鼓励我继续创作!
-------------这是我的底线^_^-------------