目标:Spring Boot 整合 JPA
工具:IDEA–2020.1
学习目标:框架工具集成
本次学习的工程下载链接放到文本最后面
- 综合概述
JPA是Java Persistence API的简称,是一套Sun官方提出的Java持久化规范。其设计目标主要是为了简化现有的持久化开发工作和整合ORM技术,它为Java开发人员提供了一种ORM工具来管理Java应用中的关系数据。 简而言之,JPA提供了使用面向对象的方式操作数据库的功能。JPA充分吸收了现有Hibernate,TopLink,JDO等ORM框架的优势,具有易于使用、伸缩性强等优点。
Spring Data JPA是Spring基于Spring Data框架对于JPA规范的一套具体实现方案,使用Spring Data JPA可以极大地简化JPA 的写法,几乎可以在不写具体实现的情况下完成对数据库的操作,并且除了基础的CRUD操作外,Spring Data JPA还提供了诸如分页和排序等常用功能的实现方案。合理的使用Spring Data JPA可以极大的提高我们的日常开发效率和有效的降低项目开发成本。
-
使用
- 引入JPA依赖
创建SpringBoot项目,引入 JPA,MySQL,Web依赖,和数据库连接池依赖
- 引入JPA依赖
<dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-jpa</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-devtools</artifactId> <scope>runtime</scope> <optional>true</optional> </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> <!-- swagger --> <dependency> <groupId>io.springfox</groupId> <artifactId>springfox-swagger2</artifactId> <version>2.9.2</version> </dependency> <dependency> <groupId>io.springfox</groupId> <artifactId>springfox-swagger-ui</artifactId> <version>2.9.2</version> </dependency> </dependencies>
- 配置连接数据库参数和jpa参数–application.yml
server: port: 8080 spring: # 配置数据源信息 datasource: driverClassName: com.mysql.cj.jdbc.Driver url: jdbc:mysql://localhost:3306/springboot?serverTimezone=Asia/Shanghai&characterEncoding=utf-8 username: root password: root jpa: show-sql: true # 默认false,在日志里显示执行的sql语句 database: mysql hibernate.ddl-auto: update #指定为update,每次启动项目检测表结构有变化的时候会新增字段,表不存在时会 新建,如果指定create,则每次启动项目都会清空数据并删除表,再新建 properties.hibernate.dialect: org.hibernate.dialect.MySQL5Dialect # 使用JPA 创建表时,默认使用的存储引擎是MyISAM,通过指定数据库版本,可以使用InnoDB database-platform: org.hibernate.dialect.MySQL5Dialect hibernate: naming: #指定jpa的自动表生成策略,驼峰自动映射为下划线格式 implicit-strategy: org.hibernate.boot.model.naming.ImplicitNamingStrategyLegacyJpaImpl #physical-strategy: org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl
- 然后,编写一个SysUserDao并继承JpaRepository,由此我们已经继承了大部分可用的CURD操作,针对基础操作,DAO完全不用写任何方法。
public interface SysUserDao extends JpaRepository<SysUser,Long>, Serializable { }
使用Spring Data JPA,可以通过两种方式使用 JPA 进行数据持久化。
方式一:使用Spring Data JPA 提供的接口默认实现,如上面我们的DAO实现。
方式二:自定义符合Spring Data JPA规则的查询方法,由框架将其自动解析为SQL。
- 接着编写一个服务接口,添加用户保存、删除、查询全部和分页查询的方法。
package com.xmaven.service; import com.xmaven.model.SysUser; import com.xmaven.util.PageQuery; import java.util.List; public interface SysUserService { /** * 保存用户 * @param user */ public void save(SysUser user); /** * 删除用户 * @param id */ public void delete(SysUser user); /** * 查询全部用户 * @return */ public List<SysUser> findAll(); /** * 查询分页数据 * @return */ public Object findPage(PageQuery pageQuery); }
这个里面需要写一个工具类名叫PageQuery,代码如下
package com.xmaven.util; public class PageQuery { private int page; private int size; public int getPage() { return page; } public void setPage(int page) { this.page = page; } public int getSize() { return size; } public void setSize(int size) { this.size = size; } }
- 继续编写服务实现类并调用DAO实现相应功能,以下DAO方法都是继承而来的,除此之后,JPA还提供了大量的API可用。
package com.xmaven.service.impl; import com.xmaven.dao.SysUserDao; import com.xmaven.model.SysUser; import com.xmaven.service.SysUserService; import com.xmaven.util.PageQuery; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.domain.PageRequest; import org.springframework.stereotype.Service; import java.util.List; @Service public class SysUserServiceImpl implements SysUserService { @Autowired private SysUserDao sysUserDao; @Override public void save(SysUser user) { sysUserDao.save(user); } @Override public void delete(SysUser user) { sysUserDao.delete(user); } @Override public List<SysUser> findAll() { return sysUserDao.findAll(); } @Override public Object findPage(PageQuery pageQuery) { return sysUserDao.findAll(PageRequest.of(pageQuery.getPage(), pageQuery.getSize())); } }
- 接着编写一个用户控制器,调用服务接口实现对应功能。
package com.xmaven.controller; import com.xmaven.model.SysUser; import com.xmaven.service.SysUserService; import com.xmaven.util.PageQuery; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; @RestController @RequestMapping("user") public class SysUserController { @Autowired private SysUserService sysUserService; @PostMapping(value="/save") public Object save(@RequestBody SysUser user) { sysUserService.save(user); return 1; } @PostMapping(value="/delete") public Object delete(@RequestBody SysUser user) { sysUserService.delete(user); return 1; } @GetMapping(value="/findAll") public Object findAll() { return sysUserService.findAll(); } @PostMapping(value="/findPage") public Object findPage(@RequestBody PageQuery pageQuery) { return sysUserService.findPage(pageQuery); } }
- 集成swagger–添加一个swagger 配置类,在工程下新建 config 包并添加一个 SwaggerConfig 配置类。
package com.xmaven.config; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import springfox.documentation.builders.ApiInfoBuilder; import springfox.documentation.builders.PathSelectors; import springfox.documentation.builders.RequestHandlerSelectors; import springfox.documentation.service.ApiInfo; import springfox.documentation.spi.DocumentationType; import springfox.documentation.spring.web.plugins.Docket; import springfox.documentation.swagger2.annotations.EnableSwagger2; @Configuration @EnableSwagger2 public class SwaggerConfig { @Bean public Docket createRestApi(){ return new Docket(DocumentationType.SWAGGER_2).apiInfo(apiInfo()) .select() .apis(RequestHandlerSelectors.any()) .paths(PathSelectors.any()).build(); } private ApiInfo apiInfo(){ return new ApiInfoBuilder() .title("SpringBoot API Doc") .description("This is a restful api document of Spring Boot.") .version("1.0") .build(); } }
- 然后调用save接口,分别插入以下三条数据。
{ "id": 1, "name": "111", "email": "111@qq.com", "password": "111" } { "id": 2, "name": "222", "email": "222@qq.com", "password": "222" } { "id": 3, "name": "333", "email": "333@qq.com", "password": "333" }
- 回来继续调用findAll接口,可以看到我们已经成功的插入了三条数据。
其他的接口留给你们自己去测试
*工程第一次启动记得改application.yml里面的文件,第一次用就改为create,后面再用的话就改为update
hibernate.ddl-auto: create
评论区