Spring-Data-JPA
Spring-Data-JPA是Spring全家桶中SpringData系列的一个分支,是SpringData对于JPA的封装和支持。
所谓JPA,即Java Persistence API,Java持久层API,是JDK对于ORM规范定义的一套接口,用于在数据持久层中面向对象编程,屏蔽数据库底层操作。
而在所有的JPA实现框架中,最为优秀的自然是Hibernate,所以,Spring-Data-JPA默认使用的底层实现就是Hibernate框架。而我们平常所说的JPA也默认是Hibernate实现的JPA。
Spring-Data-JPA作为Spring大家庭的一个成员,自然也默认支持SpringBoot,我们也可以直接使用SpringBoot来搭建Spring-Data-JPA环境。
创建项目,引入依赖
<?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配置文件
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启动类
@SpringBootApplication
public class MyApplication {
public static void main(String[] args) {
SpringApplication.run(MyApplication.class);
}
}
编写实体类
@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是同一个数据库表,这里就不再写数据库建表语句,有需要的可以去上一篇博客中找。
编写数据访问层
public interface UserDao extends JpaRepository<User,Long>, JpaSpecificationExecutor<User> {
}
同样,这里只需要继承一个JpaRepository和JpaSpecificationExecutor两个接口就可以了,SpringDataJPA会使用动态代理的方式,自动生成对应的简单访问方法。
JpaRepository中的两个泛型:
- 第一个为实体类类型
- 第二个为实体类主键类型
编写业务层
业务层接口
public interface UserService {
/**
* 分页查询用户数据
* @param pageNum
* @param pageSize
* @return
*/
Page<User> findByPage(Integer pageNum, Integer pageSize);
}
业务层实现
@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层
@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。
【注意】Spring-Data中的Pageable分页功能,索引是从0开始的,所以如果是正式开发中,我们应该自己维护这个索引,维护策略应该结合需求实际应用。