springBoot学习笔记(4)—— 整合Jpa

一、Jap是什么?

1.概念

JPA是Java Persistence API的简称,中文名Java持久层API,是JDK 5.0注解或XML描述对象-关系表的映射关系,并将运行期的实体对象持久化到数据库中。JPA框架中支持大数据集、事务、并发等容器级事务,这使得 JPA 超越了简单持久化框架的局限,在企业应用发挥更大的作用。

  1. 简单方便
    JPA的主要目标之一就是提供更加简单的编程模型:在JPA框架下创建实体和创建Java 类一样简单,没有任何的约束和限制,只需要使用 javax.persistence.Entity进行注释,JPA的框架和接口也都非常简单,没有太多特别的规则和设计模式的要求,开发者可以很容易地掌握。JPA基于非侵入式原则设计,因此可以很容易地和其它框架或者容器集成。
  2. 查询能力
    JPA的查询语言是面向对象而非面向数据库的,它以面向对象的自然语法构造查询语句,可以看成是Hibernate HQL的等价物。JPA定义了独特的JPQL(Java Persistence Query Language),JPQL是EJB QL的一种扩展,它是针对实体的一种查询语言,操作对象是实体,而不是关系数据库的表,而且能够支持批量更新和修改、JOIN、GROUP BY、HAVING 等通常只有 SQL 才能够提供的高级查询特性,甚至还能够支持子查询。
  3. 高级特性
    JPA 中能够支持面向对象的高级特性,如类之间的继承、多态和类之间的复杂关系,这样的支持能够让开发者最大限度的使用面向对象的模型设计企业应用,而不需要自行处理这些特性在关系数据库的持久化。

2.Jpa分类图片

4.整合Jpa - 图1

二、构建项目步骤

1.构建项目

4.整合Jpa - 图2

引入jar包说明

  1. lombok配合插件使用,使创建的实体类在编译项目时自动生成get,set方法。
  2. Spring web时SpringBoot项目可以进行页面访问。
  3. Thymeleaf一种模板驱动语言,与Jsp类似但功能更强大。
  4. Spring Data Jpa持久层框架与mybatis类似,可以说是hibernate子类。
  5. MySql Driver 连接mysql的驱动

2. pom引入jar包

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  3. xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
  4. <modelVersion>4.0.0</modelVersion>
  5. <parent>
  6. <groupId>org.springframework.boot</groupId>
  7. <artifactId>spring-boot-starter-parent</artifactId>
  8. <version>2.6.2</version>
  9. <relativePath/> <!-- lookup parent from repository -->
  10. </parent>
  11. <groupId>com.example</groupId>
  12. <artifactId>demo</artifactId>
  13. <version>0.0.1-SNAPSHOT</version>
  14. <name>springBoot-Jpa</name>
  15. <description>Demo project for Spring Boot</description>
  16. <properties>
  17. <java.version>1.8</java.version>
  18. </properties>
  19. <dependencies>
  20. <dependency>
  21. <groupId>org.springframework.boot</groupId>
  22. <artifactId>spring-boot-starter-data-jpa</artifactId>
  23. </dependency>
  24. <dependency>
  25. <groupId>org.springframework.boot</groupId>
  26. <artifactId>spring-boot-starter-thymeleaf</artifactId>
  27. </dependency>
  28. <dependency>
  29. <groupId>org.springframework.boot</groupId>
  30. <artifactId>spring-boot-starter-web</artifactId>
  31. </dependency>
  32. <dependency>
  33. <groupId>mysql</groupId>
  34. <artifactId>mysql-connector-java</artifactId>
  35. <scope>runtime</scope>
  36. </dependency>
  37. <dependency>
  38. <groupId>org.springframework.boot</groupId>
  39. <artifactId>spring-boot-starter-jdbc</artifactId>
  40. </dependency>
  41. <dependency>
  42. <groupId>org.projectlombok</groupId>
  43. <artifactId>lombok</artifactId>
  44. <optional>true</optional>
  45. </dependency>
  46. <dependency>
  47. <groupId>org.springframework.boot</groupId>
  48. <artifactId>spring-boot-starter-test</artifactId>
  49. <scope>test</scope>
  50. </dependency>
  51. </dependencies>
  52. <build>
  53. <plugins>
  54. <plugin>
  55. <groupId>org.springframework.boot</groupId>
  56. <artifactId>spring-boot-maven-plugin</artifactId>
  57. <configuration>
  58. <excludes>
  59. <exclude>
  60. <groupId>org.projectlombok</groupId>
  61. <artifactId>lombok</artifactId>
  62. </exclude>
  63. </excludes>
  64. </configuration>
  65. </plugin>
  66. </plugins>
  67. </build>
  68. </project>

3. application.yml配置文件内容

  1. spring:
  2. datasource:
  3. driver-class-name: com.mysql.cj.jdbc.Driver
  4. url: jdbc:mysql://101.34.49.127:3306/springBootAll?serverTimezone=UTC
  5. hikari: # springboot 2.0 整合了hikari ,据说这是目前性能最好的java数据库连接池
  6. username: root
  7. password: 123456
  8. jpa:
  9. hibernate:
  10. ddl-auto: update # 第一次建表create 后面用update,要不然每次重启都会新建表
  11. show-sql: true

注意:此处的建表类型改为update,如果为create则每次重启都会删除原来的表重建表

4.实体类内容

  1. @Entity
  2. @Data
  3. public class News {
  4. /**
  5. * 主键id,设置为自增
  6. */
  7. @Id
  8. @GeneratedValue
  9. private Long id;
  10. /**
  11. * 新闻标题
  12. */
  13. private String title;
  14. /**
  15. * 创建时间
  16. */
  17. private Date createTime;
  18. /**
  19. * 新闻内容
  20. */
  21. private String content;
  22. /**
  23. * 是否展示
  24. */
  25. private Integer isShow;
  26. /**
  27. * 新闻是否置顶
  28. */
  29. private Integer isTop;
  30. }

注意:需要添加@Entity注解声明为实体类 如果表名与实体类名字不一致需要使用@Table(name = “tbl_user”)声明实体类对应的表名 @Id为主键声明

5. Dao接口内容

  1. public interface NewsDao extends JpaRepository<News,Long> {
  2. /**
  3. * description: 通过id查询新闻数据
  4. * version: 1.0
  5. * date: 2022/1/5 17:32
  6. * author: xiaYZ
  7. * iteration: 迭代说明
  8. * @param id
  9. * @return
  10. */
  11. News findNewsById(Long id);
  12. }
  1. 注意此处dao接口必须继承JpaRepository,此处的News代表News新闻实体类,Long代表News主键id对应的类型。
    1. findNewsById是通过新闻id查询新闻数据,不需要写Sql方法,直接生成。
    2. 运行项目后,会生成对应的表结构,不需要写sql语句。

6.service服务层内容

  1. @Service
  2. public class NewsService {
  3. @Autowired
  4. NewsDao newsDao;
  5. public void saveNews(News news){
  6. newsDao.save(news);
  7. }
  8. public News findNesById(Long newsId){
  9. return newsDao.findNewsById(newsId);
  10. }
  11. }

注意此处dao并没有save方法,这个方法是继承JpaRepository这个类实现的。

7.controller控制层内容

  1. @RestController
  2. @RequestMapping("newsController")
  3. public class NewsController {
  4. @Autowired
  5. NewsService newsService;
  6. /***
  7. * description: 新增新闻数据
  8. * version: 1.0 ->
  9. * date: 2022/1/5 17:38
  10. * author: xiaYZ
  11. * iteration: 迭代说明
  12. * @param news
  13. * @return java.lang.String
  14. */
  15. @PostMapping("saveNews")
  16. public String saveNews(News news){
  17. try {
  18. newsService.saveNews(news);
  19. return "新增新闻数据成功";
  20. }catch (Exception e){
  21. e.printStackTrace();
  22. return "新增新闻数据失败";
  23. }
  24. }
  25. /****
  26. * description: 查询新闻数据通过id
  27. * version: 1.0 ->
  28. * date: 2022/1/5 17:40
  29. * author: xiaYZ
  30. * iteration: 迭代说明
  31. * @param newsId
  32. * @return java.lang.String
  33. */
  34. @GetMapping("findNewsById")
  35. public String findNewsById(Long newsId){
  36. News news = new News();
  37. try{
  38. news = newsService.findNesById(newsId);
  39. }catch (Exception e){
  40. e.printStackTrace();
  41. return "查询新闻数据失败";
  42. }
  43. return news.toString();
  44. }
  45. }

8.运行测试

  1. 运行之后生成的news新闻表
    4.整合Jpa - 图3
  2. 测试保存接口
    4.整合Jpa - 图4
    4.整合Jpa - 图5
  3. 测试查询接口
    4.整合Jpa - 图6

总结

  1. 在application.yml中配置好jpa参数,在用@Entity注解标注实体类,dao层接口继承JpaRepository类即可使用JPA。
  2. JPA注解标注实体还有其他很多注解,此处先暂时做入门了解,下一节再作说明。

项目源码