`
白马探
  • 浏览: 14639 次
社区版块
存档分类
最新评论

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

 
阅读更多

 

Spring Boot (三): ORM 框架 JPA 与连接池 Hikari

1. 概述

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

(了解源码可+求求: 1791743380)

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

因为,传说中 BoneCP 在快速这个特点上做到了极致,官方数据是C3P0等的25倍左右。不相信?其实我也不怎么信。可是,有图有真相啊,传说图片来源于官网,然而笔者在官网并没有找到,大家看一下:

 

Spring Boot (三): ORM 框架 JPA 与连接池 Hikari

看起来是不是完全吊打,但是当 HikariCP 横空出世以后,这个局面就被完全改写了, BoneCP 被 HikariCP 完全吊打,看了一下 BoneCP Github 上面的版本更新,发现在2013年10月23日以后就再也没有更新过了,包括在仓库介绍上面都写着建议大家使用 HikariCP ,看来作者已经完全心灰意冷了。(了解源码可+求求: 1791743380)

 

Spring Boot (三): ORM 框架 JPA 与连接池 Hikari
 

 

Hikari 这个词来源于日文,是“光”的意思,估计作者的意思是这个连接池将会和光一样快,不知道作者是不是日本人。

HikariCP 的口号是快速,简单,可靠。不知道是否真的如它自己宣传的一样,官方又提供了一张图,大家感受一下,这张图来源于:https://github.com/brettwooldridge/HikariCP 。

 

Spring Boot (三): ORM 框架 JPA 与连接池 Hikari
 

 

更多有关 HikariCP 的信息,大家可以访问官方的 Github 仓库了解:https://github.com/brettwooldridge/HikariCP ,笔者这里不多做介绍,毕竟我们更关注的如何使用。

2. JPA 介绍

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 后面跟属性名称:

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

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

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

3. 工程实战

这里我们创建工程 spring-boot-jpa-hikari 。

3.1 工程依赖 pom.xml

代码清单:spring-boot-jpa-hikari/pom.xml

Java代码  收藏代码
  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.   
  17.     <properties>  
  18.         <java.version>1.8</java.version>  
  19.     </properties>  
  20.   
  21.     <dependencies>  
  22.         <dependency>  
  23.             <groupId>org.springframework.boot</groupId>  
  24.             <artifactId>spring-boot-starter-data-jpa</artifactId>  
  25.         </dependency>  
  26.         <dependency>  
  27.             <groupId>org.springframework.boot</groupId>  
  28.             <artifactId>spring-boot-starter-web</artifactId>  
  29.         </dependency>  
  30.   
  31.         <dependency>  
  32.             <groupId>mysql</groupId>  
  33.             <artifactId>mysql-connector-java</artifactId>  
  34.             <scope>runtime</scope>  
  35.         </dependency>  
  36.         <dependency>  
  37.             <groupId>org.projectlombok</groupId>  
  38.             <artifactId>lombok</artifactId>  
  39.             <optional>true</optional>  
  40.         </dependency>  
  41.         <dependency>  
  42.             <groupId>org.springframework.boot</groupId>  
  43.             <artifactId>spring-boot-starter-test</artifactId>  
  44.             <scope>test</scope>  
  45.         </dependency>  
  46.     </dependencies>  
  47.   
  48.     <build>  
  49.         <plugins>  
  50.             <plugin>  
  51.                 <groupId>org.springframework.boot</groupId>  
  52.                 <artifactId>spring-boot-maven-plugin</artifactId>  
  53.             </plugin>  
  54.         </plugins>  
  55.     </build>  
  56. </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 ,如图:

 

Spring Boot (三): ORM 框架 JPA 与连接池 Hikari
 

 

3.2 配置文件 application.yml

代码清单:spring-boot-jpa-hikari/src/main/resources/application.yml

Java代码  收藏代码
  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  

 注意:

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

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

3.3 映射实体类 UserModel.java

代码清单:spring-boot-jpa-hikari/src/main/java/com/springboot/springbootjpahikari/model/UserModel.java

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

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

 

3.5 接口测试类 UserController.java

代码清单:spring-boot-jpa-hikari/src/main/java/com/springboot/springbootjpahikari/controller/UserController.java

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

 

4. 测试

测试我们借助工具 PostMan ,启动工程,首先我们新增一个用户信息,如图:

 

Spring Boot (三): ORM 框架 JPA 与连接池 Hikari
 

 

如果我们参数中加入 id ,并且 id 的值和数据库中的 id 维持一致,这是会更新当前 id 的数据,如图:

 

Spring Boot (三): ORM 框架 JPA 与连接池 Hikari
 

 

我们执行查询操作,如图:

 

Spring Boot (三): ORM 框架 JPA 与连接池 Hikari
 

 

执行删除操作,如图:

 

Spring Boot (三): ORM 框架 JPA 与连接池 Hikari
 

 

至此,测试完成。

分享到:
评论

相关推荐

    Spring使用JavaConfig集成JPA简单例子

    这个简单的例子有助于理解Spring与JPA的集成机制,便于在实际项目中灵活运用。更多关于Spring JPA的高级特性和最佳实践,可以在指定的博客链接(http://blog.csdn.net/wu_boy/article/details/72353608)中找到详细...

    Hibernate与常用连接池的配置

    **标题:“Hibernate与常用连接池的配置”** 在Java企业级开发中,数据库连接管理是一项至关重要的任务。Hibernate作为一款强大的对象关系映射(ORM)框架,极大地简化了数据库操作。然而,为了优化数据库资源的...

    oesoft_spring_datasource

    5. **Spring Data JPA与事务管理**:在Spring框架中,数据源通常与JDBC模板或ORM框架(如Hibernate、MyBatis)一起使用。Spring Data JPA简化了JPA的使用,提供了一种声明式事务管理方式。在配置数据源后,可以添加`...

    SpringBoot操作多数据源(JPA+JdbcTemplate)

    本篇文章将探讨如何在Spring Boot中利用JPA(Java Persistence API)和JdbcTemplate来实现多数据源的管理,同时使用HikariCP作为高效的数据源连接池。 首先,让我们理解一下关键概念: 1. **Spring Boot**: 它是...

    《Spring的数据源配置文件模板》applicationContext.zip

    在Spring框架中,数据源(DataSource)是连接数据库的关键组件,它是应用程序与数据库交互的桥梁。`applicationContext.xml`是Spring应用上下文配置文件,通常用于定义bean的声明、依赖注入以及数据源的相关配置。本...

    各种连接数据库的方法java版的

    在Java编程中,连接数据库是一项基础且至关重要的任务。它使得应用程序能够与数据库进行交互,执行查询、更新数据等操作。...在实际开发中,结合使用连接池和ORM框架能显著提高开发效率和系统性能。

    SpringHibernate

    可以使用`org.springframework.jdbc.datasource.DriverManagerDataSource`或连接池如`com.zaxxer.hikari.HikariDataSource`。 2. **SessionFactory配置**:接着,配置Hibernate的SessionFactory,它是Hibernate的...

    多数据源配置demo

    可以使用Apache Commons DBCP或HikariCP等连接池库来提高性能。 ```java @Bean("dataSource1") public DataSource dataSource1() { HikariConfig config = new HikariConfig(); config.setJdbcUrl("jdbc:mysql...

    demo:Micronaut演示应用

    4. **JDBC-Hikari连接池**:HikariCP是目前广泛使用的高性能JDBC连接池。在Micronaut中,配合JDBC-Hikari,可以确保高效、稳定的数据库连接管理,提升应用性能。配置Hikari连接池,能够优化数据库连接的创建和回收,...

    produto-web-pipeline:produto-web com Kotlin-没有咖啡厅的开发

    2. **Hibernate-JPA**: Hibernate是一个流行的Java持久层框架,而JPA(Java Persistence API)是Java平台上的标准对象关系映射(ORM)规范。在Kotlin应用中,Hibernate-JPA提供了方便的数据模型到数据库表的映射,...

    Hibernate5用户手册中文版

    - Hibernate通过ConnectionProvider管理数据库连接,支持使用DataSources、c3p0、proxool、Hikari等连接池。 - 还涉及如何配置数据库方言(Database Dialect),以便Hibernate能够生成与特定数据库兼容的SQL语句。...

    微纳帕

    4. **JDBC-Hikari:高效的数据连接池** HikariCP是一个高性能的JDBC连接池,它在Micronaut中被用作默认的数据源。HikariCP以其极低的空闲连接开销和快速的连接创建速度而闻名,从而提高了数据库操作的效率。在配置...

Global site tag (gtag.js) - Google Analytics