当前位置: 首页 > news >正文

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

public interface UserRepository extends JpaRepository<UserModel, Long> {UserModel getByIdIs(Long id);UserModel findByNickName(String nickName);int countByAge(int age);List<UserModel> findByNickNameLike(String nickName);
}

具体的关键字,使用方法和生产成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

<?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 https://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.1.8.RELEASE</version><relativePath/> <!-- lookup parent from repository --></parent><groupId>com.springboot</groupId><artifactId>spring-boot-jpa-hikari</artifactId><version>0.0.1-SNAPSHOT</version><name>spring-boot-jpa-hikari</name><description>spring-boot-jpa-hikari</description><properties><java.version>1.8</java.version></properties><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>mysql</groupId><artifactId>mysql-connector-java</artifactId><scope>runtime</scope></dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><optional>true</optional></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency></dependencies><build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId></plugin></plugins></build>
</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

server:port: 8080
spring:application:name: spring-boot-jpa-hikarijpa:database: mysqlshow-sql: truegenerate-ddl: truedatabase-platform: org.hibernate.dialect.MySQL5InnoDBDialecthibernate:ddl-auto: updatedatasource:url: jdbc:mysql://192.168.0.128:3306/test?serverTimezone=Asia/Shanghai&useUnicode=true&characterEncoding=UTF-8&useSSL=falseusername: rootpassword: 123456driver-class-name: com.mysql.cj.jdbc.Drivertype: com.zaxxer.hikari.HikariDataSourcehikari:auto-commit: trueminimum-idle: 2idle-timeout: 60000connection-timeout: 30000max-lifetime: 1800000pool-name: DatebookHikariCPmaximum-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

@Entity
@Data
@Table(name = "user")
public class UserModel {@Id@GeneratedValue(generator = "paymentableGenerator")@GenericGenerator(name = "paymentableGenerator", strategy = "uuid")@Column(name ="ID",nullable=false,length=36)private String id;@Column(nullable = true, unique = true)private String nickName;@Column(nullable = false)private int age;
}

unique : 唯一约束

主键生成策略为uuid

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

public interface UserRepository extends JpaRepository<UserModel, Long> {UserModel getByIdIs(Long id);UserModel findByNickName(String nickName);int countByAge(int age);List<UserModel> findByNickNameLike(String nickName);
}

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

@RestController
public class UserController {@AutowiredUserRepository userRepository;/*** 查询用户列表* @return*/@GetMapping("/user")public List<UserModel> user() {return userRepository.findAll(Sort.by("id").descending());}/*** 新增或更新用户信息* @param user* @return*/@PostMapping("/user")public UserModel user(UserModel user) {return userRepository.save(user);}/*** 根据id删除用户* @param id* @return*/@DeleteMapping("/user")public String deleteUserById(Long id) {userRepository.deleteById(id);return "success";}
}

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

相关文章:

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

数据库方面我们选用 Mysql &#xff0c; Spring Boot 提供了直接使用 JDBC 的方式连接数据库&#xff0c;毕竟使用 JDBC 并不是很方便&#xff0c;需要我们自己写更多的代码才能使用&#xff0c;一般而言在 Spring Boot 中我们常用的 ORM 框架有 JPA 和 Mybaties &#xff0c;本…...

Wireshark抓包分析ICMP协议

「作者主页」&#xff1a;士别三日wyx 「作者简介」&#xff1a;CSDN top100、阿里云博客专家、华为云享专家、网络安全领域优质创作者 「推荐专栏」&#xff1a;对网络安全感兴趣的小伙伴可以关注专栏《网络安全入门到精通》 分析目的&#xff1a;分析ICMP协议的数据格式、报文…...

C++——安装环境、工具

一、进入官网下载 Visual Studio 下载地址&#xff1a;https://visualstudio.microsoft.com/zh-hans/ 二、安装 三、安装完后如果出现window SDK 下载失败&#xff0c;可自行下载&#xff0c;如果没有请跳过这一步 Window SDK 官方地址&#xff1a;https://developer.microsoft…...

征稿啦!第 18 届「中国 Linux 内核开发者大会」重磅启动

第十八届中国 Linux 内核开发者大会&#xff08;CLK &#xff09;如期而至。CLK 以“自由、协作、创新”为理念&#xff0c;以开源技术的推广和普及为使命&#xff0c;旨在促进 Linux 内核开发爱好者相互交流&#xff0c;共同进步。 经过组委会公开征集承办单位和各意向承办单…...

JDBC8.0+

首先创建工程&#xff0c;导入jar包 1.注册驱动 //注册驱动//利用反射&#xff0c;较为灵活Class.forName("com.mysql.cj.jdbc.Driver");/**问题&#xff1a;会注册俩次驱动* 解决方案&#xff1a;只触发静态代码块* 触发静态代码块&#xff1a;* 类加载机制&…...

聊聊常见的IO模型 BIO/NIO/AIO 、DIO、多路复用等IO模型

文章目录 一、前言1. 什么是IO模型2. 为什么需要IO模型 二、常见的IO模型1. 同步阻塞IO&#xff08;Blocking IO&#xff0c;BIO&#xff09;2. 同步非阻塞IO&#xff08;Non-blocking IO&#xff0c;NIO&#xff09;3. 异步非阻塞IO&#xff08;Asynchronous IO&#xff0c;AI…...

Linux- 网络编程初探

原始套接字&#xff08;Raw Socket&#xff09; 原始套接字&#xff08;Raw Socket&#xff09;是一种提供较低级别网络访问的套接字。通过使用原始套接字&#xff0c;应用程序可以直接发送或接收网络层如IP的数据包&#xff0c;或者传输层如TCP、UDP的段&#xff0c;而无需通…...

AVLoadingIndicatorView - 一个很好的Android加载动画集合

官网 GitHub - HarlonWang/AVLoadingIndicatorView: DEPRECATED 项目简介 AVLoadingIndicatorView is a collection of nice loading animations for Android. You can also find iOS version of this here. Now AVLoadingIndicatorView was updated version to 2.X , If …...

我想设计一套游戏的奖励系统,有什么值得注意的?

游戏上&#xff1a; 游戏成就系统的价值 游戏中的成就可以延长游戏时间&#xff0c;让玩家不仅仅是将游戏通关&#xff0c;而是必须完成游戏内所有挑战及发现秘密&#xff0c;这些成就可以与游戏本身的目标一致&#xff0c;也可以独立于游戏的主要或次要目标之外&#xff0c;…...

精通git,没用过git cherry-pick?

前言 git cherry-pick是git中非常有用的一个命令&#xff0c;cherry是樱桃的意思&#xff0c;cherry-pick就是挑樱桃&#xff0c;从一堆樱桃中挑选自己喜欢的樱桃&#xff0c;在git中就是多次commit中挑选一个或者几个commit出来&#xff0c;也可以理解为把特定的commit复制到…...

QT5|C++|通过创建子线程方式实现进度条更新

背景&#xff1a; 一开始是通过在主线程中写一个for循环&#xff0c;每次加1后睡眠1s进行进度条更新。但这样写的结果是 --> 无法动态显示进度条进度。后通过上一篇文章 [ QT5|C|通过信号槽机制实现进度条更新 ] 中的写信号槽机制实现。实现后 考虑了下有没有其他方式实现&a…...

基于mediasoup的webrtc server,性能压测时发现带宽利用率偏低(40%)

基于mediasoup的webrtc server&#xff0c;进行性能压测时发现&#xff0c;在1gbps的网络条件下&#xff0c;带宽利用率在40%(400Mbps)时&#xff0c;就会出现过高丢包率的(packet loss > 10%)的情况。这个结果是合理的吗&#xff1f;如果不合理&#xff0c;要如何提升性能&…...

Ubuntu Redis开机自启动服务

1. 建立service文件 sudo vim /etc/systemd/system/redis-server.service2. redis service文件 [Unit] DescriptionAdvanced key-value store Afternetwork.target Documentationhttp://redis.io/documentation, man:redis-server(1)[Service] Typenotify ExecStart/usr/bin/…...

Stm32_标准库_呼吸灯_按键控制

Stm32按键和输出差不多 PA1为LED供给正电&#xff0c;PB5放置按键&#xff0c;按键一端接PB5,另一端接负极 void Key_Init(void){RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE); //APB2总线连接着GPIOBGPIO_InitStructur.GPIO_Mode GPIO_Mode_IPU;GPIO_InitStructur.…...

MySQL作业:索引、视图、存储、函数

学生表&#xff1a;Student (Sno, Sname, Sex , Sage, Sdept) 学号&#xff0c;姓名&#xff0c;性别&#xff0c;年龄&#xff0c;所在系 Sno为主键 课程表&#xff1a;Course (Cno, Cname,) 课程号&#xff0c;课程名 Cno为主键 学生选课表&#xff1a;SC (Sno, Cno, Score) …...

漫谈:C语言 C++ 所有编程语言 =和==的麻烦

这次不只是C语言很麻拐&#xff0c;是所有编程语言都很麻拐了。 赋值和比较是编程语言最基本的操作之二&#xff0c;C和所有类C语言都使用“”和“”来分别表示赋值和比较。 数学上等号“”是个单一的概念&#xff0c;含义是“相等”&#xff0c;左右两边是等价的&#xff0c;很…...

十五、异常(1)

本章概要 异常概念基本异常 异常参数 异常捕获 try 语句块异常处理程序终止与恢复 Java 的基本理念是“结构不佳的代码不能运行”。 改进的错误恢复机制是提高代码健壮性的最强有力的方式。错误恢复在我们所编写的每一个程序中都是基本的要素&#xff0c;但是在 Java 中它显得…...

Redis 哨兵模式搭建教程

一、介绍 本文实战搭建一主两从三哨兵&#xff0c;通过使用哨兵模式&#xff0c;可以有效避免某台服务器的 Redis 挂掉出现的不可用问题&#xff0c;保障系统的高可用。 本文通过虚拟机搭建的三台 Centos7 服务器进行测试&#xff0c;使用的 Redis 版本为 6.25。 二、准备环…...

【C++】gnustl_static 与 c++_shared 的区别

参考&#xff1a;GNU与cSTL的区别与联系-爱代码爱编程​ gnustl_static 与 c_shared 的区别&#xff1a; 不同版本的 STL TSL是一个与STL兼容的多线程支持库。 STLport是一个可移植、高度兼容的STL实现。 SGI STL是最早的STL实现之一&#xff0c;对STL的发展起到了重要的作用…...

怎样选择第三方检测机构获取功能测试报告?

数字化时代&#xff0c;软件给人们的生活带来了越来越多的便利&#xff0c;产品功能测试也成为了软件开发方在研发时的重要环节&#xff0c;这关系到用户使用产品的体验感。所以做好软件功能测试对把控产品质量有着很大影响&#xff0c;通过有效的功能测试能够发现系统潜在的问…...

【大模型RAG】拍照搜题技术架构速览:三层管道、两级检索、兜底大模型

摘要 拍照搜题系统采用“三层管道&#xff08;多模态 OCR → 语义检索 → 答案渲染&#xff09;、两级检索&#xff08;倒排 BM25 向量 HNSW&#xff09;并以大语言模型兜底”的整体框架&#xff1a; 多模态 OCR 层 将题目图片经过超分、去噪、倾斜校正后&#xff0c;分别用…...

椭圆曲线密码学(ECC)

一、ECC算法概述 椭圆曲线密码学&#xff08;Elliptic Curve Cryptography&#xff09;是基于椭圆曲线数学理论的公钥密码系统&#xff0c;由Neal Koblitz和Victor Miller在1985年独立提出。相比RSA&#xff0c;ECC在相同安全强度下密钥更短&#xff08;256位ECC ≈ 3072位RSA…...

WordPress插件:AI多语言写作与智能配图、免费AI模型、SEO文章生成

厌倦手动写WordPress文章&#xff1f;AI自动生成&#xff0c;效率提升10倍&#xff01; 支持多语言、自动配图、定时发布&#xff0c;让内容创作更轻松&#xff01; AI内容生成 → 不想每天写文章&#xff1f;AI一键生成高质量内容&#xff01;多语言支持 → 跨境电商必备&am…...

SpringTask-03.入门案例

一.入门案例 启动类&#xff1a; package com.sky;import lombok.extern.slf4j.Slf4j; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cache.annotation.EnableCach…...

ios苹果系统,js 滑动屏幕、锚定无效

现象&#xff1a;window.addEventListener监听touch无效&#xff0c;划不动屏幕&#xff0c;但是代码逻辑都有执行到。 scrollIntoView也无效。 原因&#xff1a;这是因为 iOS 的触摸事件处理机制和 touch-action: none 的设置有关。ios有太多得交互动作&#xff0c;从而会影响…...

Java面试专项一-准备篇

一、企业简历筛选规则 一般企业的简历筛选流程&#xff1a;首先由HR先筛选一部分简历后&#xff0c;在将简历给到对应的项目负责人后再进行下一步的操作。 HR如何筛选简历 例如&#xff1a;Boss直聘&#xff08;招聘方平台&#xff09; 直接按照条件进行筛选 例如&#xff1a…...

如何理解 IP 数据报中的 TTL?

目录 前言理解 前言 面试灵魂一问&#xff1a;说说对 IP 数据报中 TTL 的理解&#xff1f;我们都知道&#xff0c;IP 数据报由首部和数据两部分组成&#xff0c;首部又分为两部分&#xff1a;固定部分和可变部分&#xff0c;共占 20 字节&#xff0c;而即将讨论的 TTL 就位于首…...

蓝桥杯 冶炼金属

原题目链接 &#x1f527; 冶炼金属转换率推测题解 &#x1f4dc; 原题描述 小蓝有一个神奇的炉子用于将普通金属 O O O 冶炼成为一种特殊金属 X X X。这个炉子有一个属性叫转换率 V V V&#xff0c;是一个正整数&#xff0c;表示每 V V V 个普通金属 O O O 可以冶炼出 …...

从“安全密码”到测试体系:Gitee Test 赋能关键领域软件质量保障

关键领域软件测试的"安全密码"&#xff1a;Gitee Test如何破解行业痛点 在数字化浪潮席卷全球的今天&#xff0c;软件系统已成为国家关键领域的"神经中枢"。从国防军工到能源电力&#xff0c;从金融交易到交通管控&#xff0c;这些关乎国计民生的关键领域…...

基于鸿蒙(HarmonyOS5)的打车小程序

1. 开发环境准备 安装DevEco Studio (鸿蒙官方IDE)配置HarmonyOS SDK申请开发者账号和必要的API密钥 2. 项目结构设计 ├── entry │ ├── src │ │ ├── main │ │ │ ├── ets │ │ │ │ ├── pages │ │ │ │ │ ├── H…...