网易首页 > 网易号 > 正文 申请入驻

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

0
分享至

如果我的文章对您有帮助,请关注支持下作者的公众号:极客挖掘机,谢谢:)

前面两篇文章我们介绍了如何快速创建一个 Spring Boot 工程《Spring Boot(一):快速开始》和在 Spring Boot 中如何使用模版引擎 Thymeleaf 渲染一个Web页面《Spring Boot (二):模版引擎 Thymeleaf 渲染 Web 页面》,本篇文章我们继续介绍在 Spring Boot 中如何使用数据库。

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

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

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如下表所示:

KeywordSampleJPQL snippetAndfindByLastnameAndFirstname… where x.lastname = ?1 and x.firstname = ?2OrfindByLastnameOrFirstname… where x.lastname = ?1 or x.firstname = ?2Is,EqualsfindByFirstname,findByFirstnameIs,findByFirstnameEquals… where x.firstname = 1?BetweenfindByStartDateBetween… where x.startDate between 1? and ?2LessThanfindByAgeLessThan… where x.age < ?1LessThanEqualfindByAgeLessThanEqual… where x.age <= ?1GreaterThanfindByAgeGreaterThan… where x.age > ?1GreaterThanEqualfindByAgeGreaterThanEqual… where x.age >= ?1AfterfindByStartDateAfter… where x.startDate > ?1BeforefindByStartDateBefore… where x.startDate < ?1IsNullfindByAgeIsNull… where x.age is nullIsNotNull,NotNullfindByAge(Is)NotNull… where x.age not nullLikefindByFirstnameLike… where x.firstname like ?1NotLikefindByFirstnameNotLike… where x.firstname not like ?1StartingWithfindByFirstnameStartingWith… where x.firstname like ?1 (parameter bound with appended %)EndingWithfindByFirstnameEndingWith… where x.firstname like ?1 (parameter bound with prepended %)ContainingfindByFirstnameContaining… where x.firstname like ?1 (parameter bound wrapped in %)OrderByfindByAgeOrderByLastnameDesc… where x.age = ?1 order by x.lastname descNotfindByLastnameNot… where x.lastname <> ?1InfindByAgeIn(Collection ages)… where x.age in ?1NotInfindByAgeNotIn(Collection age)… where x.age not in ?1TruefindByActiveTrue()… where x.active = trueFalsefindByActiveFalse()… where x.active = falseIgnoreCasefindByFirstnameIgnoreCase… where UPPER(x.firstame) = UPPER(?1)

3. 工程实战

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

3.1 工程依赖 pom.xml

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

  • 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. 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. 2. 有关 HikariCP 更多的配置可以参考源码类 com.zaxxer.hikari.HikariConfig ,笔者这里仅简单配置了自动提交、超时时间、最大最小连接数等配置。

3.3 映射实体类 UserModel.java

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

  • unique : 唯一约束

  • 主键生成策略为uuid

3.4 资源类 UserRepository.java

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

3.5 接口测试类 UserController.java

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

4. 测试

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

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

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

执行删除操作,如图:

至此,测试完成。

5. 示例代码

示例代码-Github

示例代码-Gitee

6. 参考

https://github.com/brettwooldridge/HikariCP

https://docs.spring.io/spring-data/jpa/docs/current/reference/html/

http://www.ityouknow.com/springboot/2016/08/20/spring-boot-jpa.html

特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。

Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.

相关推荐
热点推荐
彻底废了!曼城王牌巨星沦为累赘,球迷怒喷:他已完全过气

彻底废了!曼城王牌巨星沦为累赘,球迷怒喷:他已完全过气

澜归序
2026-02-09 06:12:57
严格要求俄罗斯归还北方领土

严格要求俄罗斯归还北方领土

杨兴文
2026-02-07 22:01:16
高市早苗深夜感谢,特朗普表态

高市早苗深夜感谢,特朗普表态

第一财经资讯
2026-02-09 09:27:51
辽宁一政务大厅工作人员,8年收好处费1614万元!

辽宁一政务大厅工作人员,8年收好处费1614万元!

极目新闻
2026-02-07 10:04:58
2015年饭局上,是谁举报了毕福剑?举报者和老毕的最终结局如何?

2015年饭局上,是谁举报了毕福剑?举报者和老毕的最终结局如何?

文史道
2026-02-03 06:45:08
亲哥去世弟弟请假未获批去奔丧被辞,公司:丧假主要适用于直系亲属,且其未经同意请假;法院判了

亲哥去世弟弟请假未获批去奔丧被辞,公司:丧假主要适用于直系亲属,且其未经同意请假;法院判了

极目新闻
2026-02-08 23:54:17
最低仅1℃!冷空气准时“到货”,过年期间广东天气预测→

最低仅1℃!冷空气准时“到货”,过年期间广东天气预测→

番禺台
2026-02-09 00:06:56
奇怪,在意大利的米兰冬奥会记者会上,美国运动员全员戴口罩

奇怪,在意大利的米兰冬奥会记者会上,美国运动员全员戴口罩

西楼知趣杂谈
2026-02-08 22:24:24
大疆某员工:发现公司很多女生口臭,每次聊天都得捂着

大疆某员工:发现公司很多女生口臭,每次聊天都得捂着

蚂蚁大喇叭
2026-02-08 16:58:15
NBA官宣三分赛名单:两届冠军利拉德意外入选 米切尔克努佩尔在列

NBA官宣三分赛名单:两届冠军利拉德意外入选 米切尔克努佩尔在列

罗说NBA
2026-02-09 04:47:45
高市大胜,将长期主宰政局

高市大胜,将长期主宰政局

难得君
2026-02-09 00:57:13
随着赵心童10-6夺冠,世界排名超越墨菲!最新前16出炉丁俊晖第13

随着赵心童10-6夺冠,世界排名超越墨菲!最新前16出炉丁俊晖第13

球场没跑道
2026-02-08 21:53:54
36年前陈宝国主演的盗墓恐怖片!尺度大到少儿不宜

36年前陈宝国主演的盗墓恐怖片!尺度大到少儿不宜

释凡电影
2025-08-14 09:33:19
太寒碜了!中山一3000多人电子厂举办年会,让员工吃自助餐引争议

太寒碜了!中山一3000多人电子厂举办年会,让员工吃自助餐引争议

火山诗话
2026-02-08 14:03:07
豪赌得手、保住相位,“高市2.0”即将上路,鹰派暴走模式全面开启?

豪赌得手、保住相位,“高市2.0”即将上路,鹰派暴走模式全面开启?

上观新闻
2026-02-08 22:17:02
日本自民党获得大胜,高市早苗将继续执政

日本自民党获得大胜,高市早苗将继续执政

辇毂
2026-02-08 23:13:57
中国妇女报发文:关键证据首次曝光,再次印证山西订婚强奸案判决无可辩驳

中国妇女报发文:关键证据首次曝光,再次印证山西订婚强奸案判决无可辩驳

上观新闻
2026-02-09 07:07:11
广州正佳广场老板为自家嘉年华表演魔性舞蹈出圈,员工:他平时“玩得比较开”

广州正佳广场老板为自家嘉年华表演魔性舞蹈出圈,员工:他平时“玩得比较开”

上游新闻
2026-02-08 14:50:07
爱泼斯坦假死实锤?监控曝光橙色人影,以色列小镇现神似面容

爱泼斯坦假死实锤?监控曝光橙色人影,以色列小镇现神似面容

老特有话说
2026-02-08 23:56:55
刹车踩死车速却还在上升?车主一家遭遇山路惊魂!理想客服回应

刹车踩死车速却还在上升?车主一家遭遇山路惊魂!理想客服回应

福建第一帮帮团
2026-02-06 19:00:40
2026-02-09 10:03:00
极客挖掘机
极客挖掘机
定期发表编程相关内容
17文章数 156关注度
往期回顾 全部

科技要闻

热血渐凉:被耗尽的小米SU7 Ultra

头条要闻

公司老板表演魔性舞蹈出圈 员工:他平时"玩得比较开"

头条要闻

公司老板表演魔性舞蹈出圈 员工:他平时"玩得比较开"

体育要闻

“我就是王楚钦” 王楚钦霸气指向球衣背后

娱乐要闻

金晨被罚1500后首露面,表情沉重心事重重

财经要闻

文玩假拍骗局调查:3500元瓷瓶估值300万

汽车要闻

预计6月份上市 上汽大众途观L ePro官图发布

态度原创

数码
教育
亲子
艺术
手机

数码要闻

赚翻了!一千多就拿下价值超9000元的SSD

教育要闻

揭秘赣州旅游学校国家奖学金获奖经验!

亲子要闻

宝宝盯着一桌美食双眼发光,渴望满满

艺术要闻

15字狂草,您能认全?看看书法的新变化!

手机要闻

消息称华为Pura X2会是首台阔大折手机,将升级麒麟9030芯片

无障碍浏览 进入关怀版