• Spring Boot : ORM 框架 JPA 与连接池 Hikari


    1. 数据库方面我们选用 Mysql , Spring Boot 提供了直接使用 JDBC 的方式连接数据库,毕竟使用 JDBC 并不是很方便,需要我们自己写更多的代码才能使用,一般而言在 Spring Boot 中我们常用的 ORM 框架有 JPA 和 Mybaties ,本篇文章我们要介绍的就是 JPA 的使用姿势。

    说道使用 ORM 框架,就不得不顺便聊一下连接池,市面上很多成熟的数据库连接池,如 C3P0 、 Tomcat 连接池、 BoneCP 等等很多产品,但是我们为什么要介绍 Hikari ?这个要从 BoneCP 说起。

    因为,传说中 BoneCP 在快速这个特点上做到了极致,官方数据是C3P0等的25倍左右。不相信?其实我也不怎么信。可是,有图有真相啊,传说图片来源于官网,然而笔者在官网并没有找到,大家看一下:
    在这里插入图片描述
    看起来是不是完全吊打,但是当 HikariCP 横空出世以后,这个局面就被完全改写了, BoneCP 被 HikariCP 完全吊打,看了一下 BoneCP Github 上面的版本更新,发现在2013年10月23日以后就再也没有更新过了,包括在仓库介绍上面都写着建议大家使用 HikariCP ,看来作者已经完全心灰意冷了。
    在这里插入图片描述
    Hikari 这个词来源于日文,是“光”的意思,估计作者的意思是这个连接池将会和光一样快,不知道作者是不是日本人。

    HikariCP 的口号是快速,简单,可靠。不知道是否真的如它自己宣传的一样,官方又提供了一张图。
    在这里插入图片描述
    2. JPA 介绍**(了解源码可+求求: 1791743380)**
    JPA (Java Persistence API) 是 Sun 官方提出的 Java 持久化规范。它为 Java 开发人员提供了一种对象/关联映射工具来管理 Java 应用中的关系数据。它的出现主要是为了简化现有的持久化开发工作和整合 ORM 技术,结束现在 Hibernate,TopLink,JDO 等 ORM 框架各自为营的局面。

    值得注意的是,JPA 是在充分吸收了现有 Hibernate,TopLink,JDO 等 ORM 框架的基础上发展而来的,具有易于使用,伸缩性强等优点。从目前的开发社区的反应上看, JPA 受到了极大的支持和赞扬,其中就包括了 Spring 与 EJB3. 0的开发团队。

    注意: JPA 是一套规范,不是一套产品,那么像 Hibernate,TopLink,JDO 他们是一套产品,如果说这些产品实现了这个 JPA 规范,那么我们就可以叫他们为 JPA 的实现产品。

    Spring Boot JPA 是 Spring 基于 ORM 框架、 JPA 规范的基础上封装的一套 JPA 应用框架,可使开发者用极简的代码即可实现对数据的访问和操作。它提供了包括增删改查等在内的常用功能,且易于扩展!学习并使用 Spring Data JPA 可以极大提高开发效率!

    Spring Boot JPA 让我们解脱了 DAO 层的操作,基本上所有 CRUD 都可以依赖于它来实现。

    Spring Boot JPA 帮我们定义了很多自定义的简单查询,并且可以根据方法名来自动生成 SQL ,主要的语法是 findXXBy , readAXXBy , queryXXBy , countXXBy , getXXBy 后面跟属性名称:

    1. public interface UserRepository extends JpaRepository<UserModel, Long> {
    2. UserModel getByIdIs(Long id);
    3. UserModel findByNickName(String nickName);
    4. int countByAge(int age);
    5. List findByNickNameLike(String nickName);
    6. }

    具体的关键字,使用方法和生产成SQL如下表所示:

    1. Keyword Sample JPQL snippet
    2. And findByLastnameAndFirstname … where x.lastname = ?1 and x.firstname = ?2
    3. Or findByLastnameOrFirstname … where x.lastname = ?1 or x.firstname = ?2
    4. Is,Equals findByFirstname,findByFirstnameIs,findByFirstnameEquals … where x.firstname = 1?
    5. Between findByStartDateBetween … where x.startDate between 1? and ?2
    6. LessThan findByAgeLessThan … where x.age < ?1
    7. LessThanEqual findByAgeLessThanEqual … where x.age <= ?1
    8. GreaterThan findByAgeGreaterThan … where x.age > ?1
    9. GreaterThanEqual findByAgeGreaterThanEqual … where x.age >= ?1
    10. After findByStartDateAfter … where x.startDate > ?1
    11. Before findByStartDateBefore … where x.startDate < ?1
    12. IsNull findByAgeIsNull … where x.age is null
    13. IsNotNull,NotNull findByAge(Is)NotNull … where x.age not null
    14. Like findByFirstnameLike … where x.firstname like ?1
    15. NotLike findByFirstnameNotLike … where x.firstname not like ?1
    16. StartingWith findByFirstnameStartingWith … where x.firstname like ?1 (parameter bound with appended %)
    17. EndingWith findByFirstnameEndingWith … where x.firstname like ?1 (parameter bound with prepended %)
    18. Containing findByFirstnameContaining … where x.firstname like ?1 (parameter bound wrapped in %)
    19. OrderBy findByAgeOrderByLastnameDesc … where x.age = ?1 order by x.lastname desc
    20. Not findByLastnameNot … where x.lastname <> ?1
    21. In findByAgeIn(Collection ages) … where x.age in ?1
    22. NotIn findByAgeNotIn(Collection age) … where x.age not in ?1
    23. True findByActiveTrue() … where x.active = true
    24. False findByActiveFalse() … where x.active = false
    25. IgnoreCase findByFirstnameIgnoreCase … where UPPER(x.firstame) = UPPER(?1)

    3. 工程实战
    这里我们创建工程 spring-boot-jpa-hikari 。

    3.1 工程依赖 pom.xml
    代码清单:spring-boot-jpa-hikari/pom.xml

    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.1.8.RELEASE</version>
    9. <relativePath/> <!-- lookup parent from repository -->
    10. </parent>
    11. <groupId>com.springboot</groupId>
    12. <artifactId>spring-boot-jpa-hikari</artifactId>
    13. <version>0.0.1-SNAPSHOT</version>
    14. <name>spring-boot-jpa-hikari</name>
    15. <description>spring-boot-jpa-hikari</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-web</artifactId>
    27. </dependency>
    28. <dependency>
    29. <groupId>mysql</groupId>
    30. <artifactId>mysql-connector-java</artifactId>
    31. <scope>runtime</scope>
    32. </dependency>
    33. <dependency>
    34. <groupId>org.projectlombok</groupId>
    35. <artifactId>lombok</artifactId>
    36. <optional>true</optional>
    37. </dependency>
    38. <dependency>
    39. <groupId>org.springframework.boot</groupId>
    40. <artifactId>spring-boot-starter-test</artifactId>
    41. <scope>test</scope>
    42. </dependency>
    43. </dependencies>
    44. <build>
    45. <plugins>
    46. <plugin>
    47. <groupId>org.springframework.boot</groupId>
    48. <artifactId>spring-boot-maven-plugin</artifactId>
    49. </plugin>
    50. </plugins>
    51. </build>
    52. </project>

    mysql-connector-java:mysql连接驱动
    spring-boot-starter-data-jpa:jpa相关的依赖包,这个包里包含了很多内容,包括我们使用的连接池 HikariCP ,从 Spring Boot 2.x 开始, Spring Boot 默认的连接池更换成为 HikariCP ,在当前的 Spring Boot 2.1.8 RELEASE 版本中,所使用的 HikariCP 版本为 3.2.0 ,如图:
    在这里插入图片描述
    3.2 配置文件 application.yml
    代码清单:spring-boot-jpa-hikari/src/main/resources/application.yml

    1. server:
    2. port: 8080
    3. spring:
    4. application:
    5. name: spring-boot-jpa-hikari
    6. jpa:
    7. database: mysql
    8. show-sql: true
    9. generate-ddl: true
    10. database-platform: org.hibernate.dialect.MySQL5InnoDBDialect
    11. hibernate:
    12. ddl-auto: update
    13. datasource:
    14. url: jdbc:mysql://192.168.0.128:3306/test?serverTimezone=Asia/Shanghai&useUnicode=true&characterEncoding=UTF-8&useSSL=false
    15. username: root
    16. password: 123456
    17. driver-class-name: com.mysql.cj.jdbc.Driver
    18. type: com.zaxxer.hikari.HikariDataSource
    19. hikari:
    20. auto-commit: true
    21. minimum-idle: 2
    22. idle-timeout: 60000
    23. connection-timeout: 30000
    24. max-lifetime: 1800000
    25. pool-name: DatebookHikariCP
    26. maximum-pool-size: 5

    注意:

    有关 JPA 的配置有一点需要的, spring.jpa.hibernate.ddl-auto ,这个属性需谨慎配置,它的几个值的含义对数据库来讲都是高危操作,笔者这里方便起见配置了 update ,各位读者请根据具体使用场景配置。

    create :每次加载hibernate时都会删除上一次的生成的表,然后根据你的model类再重新来生成新表,哪怕两次没有任何改变也要这样执行,这就是导致数据库表数据丢失的一个重要原因。
    create-drop :每次加载hibernate时根据model类生成表,但是sessionFactory一关闭,表就自动删除。
    update :最常用的属性,第一次加载hibernate时根据model类会自动建立起表的结构(前提是先建立好数据库),以后加载hibernate时根据 model类自动更新表结构,即使表结构改变了但表中的行仍然存在不会删除以前的行。要注意的是当部署到服务器后,表结构是不会被马上建立起来的,是要等 应用第一次运行起来后才会。
    validate :每次加载hibernate时,验证创建数据库表结构,只会和数据库中的表进行比较,不会创建新表,但是会插入新值。
    none :不做任何操作
    有关 HikariCP 更多的配置可以参考源码类 com.zaxxer.hikari.HikariConfig ,笔者这里仅简单配置了自动提交、超时时间、最大最小连接数等配置。
    3.3 映射实体类 UserModel.java
    代码清单:spring-boot-jpa-hikari/src/main/java/com/springboot/springbootjpahikari/model/UserModel.java

    1. @Entity
    2. @Data
    3. @Table(name = "user")
    4. public class UserModel {
    5. @Id
    6. @GeneratedValue(generator = "paymentableGenerator")
    7. @GenericGenerator(name = "paymentableGenerator", strategy = "uuid")
    8. @Column(name ="ID",nullable=false,length=36)
    9. private String id;
    10. @Column(nullable = true, unique = true)
    11. private String nickName;
    12. @Column(nullable = false)
    13. private int age;
    14. }

    unique : 唯一约束

    主键生成策略为uuid

    3.4 资源类 UserRepository.java
    代码清单:spring-boot-jpa-hikari/src/main/java/com/springboot/springbootjpahikari/repository/UserRepository.java

    1. public interface UserRepository extends JpaRepository<UserModel, Long> {
    2. UserModel getByIdIs(Long id);
    3. UserModel findByNickName(String nickName);
    4. int countByAge(int age);
    5. List findByNickNameLike(String nickName);
    6. }

    3.5 接口测试类 UserController.java
    代码清单:spring-boot-jpa-hikari/src/main/java/com/springboot/springbootjpahikari/controller/UserController.java

    1. @RestController
    2. public class UserController {
    3. @Autowired
    4. UserRepository userRepository;
    5. /**
    6. * 查询用户列表
    7. * @return
    8. */
    9. @GetMapping("/user")
    10. public List user() {
    11. return userRepository.findAll(Sort.by("id").descending());
    12. }
    13. /**
    14. * 新增或更新用户信息
    15. * @param user
    16. * @return
    17. */
    18. @PostMapping("/user")
    19. public UserModel user(UserModel user) {
    20. return userRepository.save(user);
    21. }
    22. /**
    23. * 根据id删除用户
    24. * @param id
    25. * @return
    26. */
    27. @DeleteMapping("/user")
    28. public String deleteUserById(Long id) {
    29. userRepository.deleteById(id);
    30. return "success";
    31. }
    32. }

    4. 测试
    测试我们借助工具 PostMan ,启动工程,首先我们新增一个用户信息,如图:
    在这里插入图片描述
    在这里插入图片描述
    我们执行查询操作,如图:
    在这里插入图片描述
    执行删除操作,如图:
    在这里插入图片描述
    至此,测试完成。

  • 相关阅读:
    关于#amesim#的问题,如何解决?
    Spring Boot 文件上传与下载
    刑法~~~
    combit Report Server 29
    CTFHub | 弱口令
    CentOS Linux release 7.9.2009 (Core)中安装配置Tomcat
    Golang的性能优化
    软考初级程序员上午单选题(20)
    怎么根据姓名批量创建文件夹?
    cmd常用命令
  • 原文地址:https://blog.csdn.net/m0_65038841/article/details/133343383