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>
<parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.0.4.RELEASE</version> </parent>
<dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-jpa</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> </dependency> <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: driver-class-name: com.mysql.jdbc.Driver url: jdbc:mysql://localhost:3306/myshop username: root password: admin jpa: database: mysql show-sql: true generate-ddl: false open-in-view: false 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 {
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开始的,所以如果是正式开发中,我们应该自己维护这个索引,维护策略应该结合需求实际应用。