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

SpringBoot入门 - 添加内存数据库H2

上文我们展示了通过学习经典的MVC分包结构展示了一个用户的增删查改项目,但是我们没有接入数据库;本文将在上文的基础上,增加一个H2内存数据库,并且通过Spring 提供的数据访问包JPA进行数据查询。

准备知识点

在介绍通过Spring JPA接入真实H2数据时,需要首先了解下:
什么是H2数据库?
什么是JPA?

什么是H2内存数据库

H2是一个用Java开发的嵌入式数据库,它本身只是一个类库,可以直接嵌入到应用项目中。

官方网站

有哪些用途

  • H2最大的用途在于可以同应用程序打包在一起发布,这样可以非常方便地存储少量结构化数据。

  • 它的另一个用途是用于单元测试。启动速度快,而且可以关闭持久化功能,每一个用例执行完随即还原到初始状态。

  • H2的第三个用处是作为缓存,作为NoSQL的一个补充。当某些场景下数据模型必须为关系型,可以拿它当Memcached使,作为后端MySQL/Oracle的一个缓冲层,缓存一些不经常变化但需要频繁访问的数据,比如字典表、权限表。不过这样系统架构就会比较复杂了。

H2的产品优势?

  • 纯Java编写,不受平台的限制;

  • 只有一个jar文件,适合作为嵌入式数据库使用;

  • h2提供了一个十分方便的web控制台用于操作和管理数据库内容;

  • 功能完整,支持标准SQL和JDBC。麻雀虽小五脏俱全;

  • 支持内嵌模式、服务器模式和集群。

什么是JPA,和JDBC是什么关系

什么是JDBC, ORM, JPA? 之间的关系是什么?
  • 什么是JDBC

JDBC(JavaDataBase Connectivity)就是Java数据库连接,说白了就是用Java语言来操作数据库。原来我们操作数据库是在控制台使用SQL语句来操作数据库,JDBC是用Java语言向数据库发送SQL语句。

  • 什么是ORM

对象关系映射(Object Relational Mapping,简称ORM), 简单的说,ORM是通过使用描述对象和数据库之间映射的元数据,将java程序中的对象自动持久化到关系数据库中。本质上就是将数据从一种形式转换到另外一种形式,具体如下:

具体映射:

  1. 数据库的表(table) --> 类(class)

  1. 记录(record,行数据)--> 对象(object)

  1. 字段(field)--> 对象的属性(attribute)

  • 什么是JPA

JPA是Spring提供的一种ORM,首先让我们回顾下Spring runtime体系:

Spring Data是基于Spring runtime体系的,JPA 属于Spring Data, 和JDBC的关系如下:

案例

这里承接上文, 使用H2存放用户表,并通过JPA操作用户数据。

添加H2和JPA的依赖

<dependency><groupId>com.h2database</groupId><artifactId>h2</artifactId><scope>runtime</scope>
</dependency>
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>

配置H2和JPA注入参数

spring:datasource:data: classpath:db/data.sqldriverClassName: org.h2.Driverpassword: saplatform: h2schema: classpath:db/schema.sqlurl: jdbc:h2:mem:dbtestusername: sah2:console:enabled: truepath: /h2settings:web-allow-others: truejpa:hibernate:ddl-auto: updateshow-sql: true

其中资源下还需要配置数据库的表结构schema.sql

create table if not exists tb_user (
USER_ID int not null primary key auto_increment,
USER_NAME varchar(100)
);

以及数据文件 data.sql, 默认插入一条‘赵一’的数据

INSERT INTO tb_user (USER_ID,USER_NAME) VALUES(1,'赵一');

实体关联表

给User添加@Entity注解,和@Table注解

package tech.pdai.springboot.h2.entity;import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.Table;@Entity
@Table(name = "tb_user")
public class User {@Idprivate int userId;private String userName;public int getUserId() {return userId;}public void setUserId(int userId) {this.userId = userId;}public String getUserName() {return userName;}public void setUserName(String userName) {this.userName = userName;}
}

Dao继承JpaRepository

package tech.pdai.springboot.h2.dao;import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;
import tech.pdai.springboot.h2.entity.User;@Repository
public interface UserRepository extends JpaRepository<User, Integer> {}

(其它service,App启动类等代码和前文一致)

运行程序

一些思考

这里补充一些H2数据库的知识点(特别是如何用H2做单元测试), 可以跳过。

H2数据库通常如何使用?

  • 嵌入式模式 (上文例子)

在嵌入式模式下,应用程序使用JDBC从同一JVM中打开数据库。这是最快也是最容易的连接方式。缺点是数据库可能只在任何时候在一个虚拟机(和类加载器)中打开。与所有模式一样,支持持久性和内存数据库。对并发打开数据库的数量或打开连接的数量没有限制。

  • 服务器模式

当使用服务器模式(有时称为远程模式或客户机/服务器模式)时,应用程序使用 JDBC 或 ODBC API 远程打开数据库。服务器需要在同一台或另一台虚拟机上启动,或者在另一台计算机上启动。许多应用程序可以通过连接到这个服务器同时连接到同一个数据库。在内部,服务器进程在嵌入式模式下打开数据库。

服务器模式比嵌入式模式慢,因为所有数据都通过TCP/IP传输。与所有模式一样,支持持久性和内存数据库。对每个服务器并发打开的数据库数量或打开连接的数量没有限制。

  • 混合模式

混合模式是嵌入式和服务器模式的结合。连接到数据库的第一个应用程序在嵌入式模式下运行,但也启动服务器,以便其他应用程序(在不同进程或虚拟机中运行)可以同时访问相同的数据。本地连接的速度与数据库在嵌入式模式中的使用速度一样快,而远程连接速度稍慢。

服务器可以从应用程序内(使用服务器API)启动或停止,或自动(自动混合模式)。当使用自动混合模式时,所有想要连接到数据库的客户端(无论是本地连接还是远程连接)都可以使用完全相同的数据库URL来实现。

以上不同的连接方式对应不同的 JDBC URL,可以参考如下附录表格中的连接格式。

如何使用H2做单元测试?

为何H2会被用来做单元测试 以及 如何使用H2做单元测试?

可以参考这篇文章 单元测试 - SpringBoot2+Mockito实战

H2数据库的兼容性?

H2会被用作单元测试的模拟库,所以必然也需要了解H2数据库的兼容性。

h2官网对此有详细的描述

示例源码

https://download.csdn.net/download/DeveloperFire/87519876

相关文章:

SpringBoot入门 - 添加内存数据库H2

上文我们展示了通过学习经典的MVC分包结构展示了一个用户的增删查改项目&#xff0c;但是我们没有接入数据库&#xff1b;本文将在上文的基础上&#xff0c;增加一个H2内存数据库&#xff0c;并且通过Spring 提供的数据访问包JPA进行数据查询。准备知识点在介绍通过Spring JPA接…...

高质量数字化转型创新发展大会暨中国信通院“铸基计划”年度会议成功召开

2023年3月3日&#xff0c;由中国信通院主办的高质量数字化转型创新发展大会暨中国信通院“铸基计划”年度会议在北京成功召开。本次大会深度展示了中国信通院在数字化领域的工作成果&#xff0c;并全面展望了2023年行业的数字化发展趋势。同时&#xff0c;大会发布了中国信通院…...

2023年如何通过软考初级程序员?

初级的考试难度不大&#xff0c;稍微有点编程基础&#xff0c;认真备考应该没什么大问题。 先清楚大纲&#xff1a; 高效备考&#xff01;理清考点&#xff0c;针对性复习 科目一&#xff1a;综合知识 75道单项选择题&#xff0c;1题1分&#xff0c;时长150分钟&#xff1b;…...

视频自动播放的实现与问题解决

一、前言 页面加载一个视频并且自动播放,这个需求看起来非常简单,实现起来感觉也非常简单;但是,实际做起来还是有几处容易产生问题的地方卡住进度。本文讨论基于Vue3的项目在实现页面加载视频后的自动播放遇到的几个问题。 二、页面实现 页面实现非常简单。在页面上放置一个…...

ThreadLocal 理解及面试

一、ThreadLocal 引用关系 图解关系说明&#xff1a; 每个线程拥有自己的 ThreadLocalMap 属性&#xff1b;ThreadLocalMap 的存储结构为 Entry[] 数组&#xff1b;Entry的Key是ThreadLocal类型且弱引用指向ThreadLocal对象&#xff0c;Value是我们自己定义的泛型值对象&#…...

巾帼绽芬芳 一起向未来(中篇)

编者按&#xff1a;为了隆重纪念纪念“三八”国际妇女节113周年&#xff0c;快来与你全方位、多层次分享交流“三八”国际妇女节的前世今生。分上篇&#xff08;节日简介、节日发展和节日意义&#xff09;、中篇&#xff08;节日活动宗旨和世界各国庆祝方式&#xff09;和下篇&…...

Qt学习2-Qt Creator新建项目小tips(哔站视频学习记录)

放送两个小tips: 1、MinGW和MSVC的区别 QT学习笔记&#xff08;二&#xff09;&#xff1a;QT MinGW 和 MSVC 编译方式_Leon_Chan0的博客-CSDN博客 2、如何安装QT对应版本的MSVC (1)问题描述&#xff1a;Qt5.12.8支持MSVC2015和MSVC2017&#xff0c;但是系统安装的是Visual…...

React-高阶组件

认识高级组件 高阶函数的维基百科定义:至少满足以下条件之一 1、接受一个或多个函数作为输入; 2、输出一个函数; JavaScript中比较常见的 filter、map、reduce 都是高阶函数 那么说明是高阶组件呢? 高阶组件的英文是 Higher-Order Components&#xff0c;简称为 HOC;官方的…...

python学习——【第一弹】

前言 Python是一种跨平台的计算机程序设计语言&#xff0c;是ABC语言的替代品&#xff0c;属于面向对象的动态类型语言&#xff0c;最初被设计用于编写自动化脚本&#xff0c;随着版本的不断更新和语言新功能的添加&#xff0c;越来越多被用于独立的、大型项目的开发。 从这篇…...

数据结构——链表讲解(1)

作者&#xff1a;几冬雪来 时间&#xff1a;2023年3月3日 内容&#xff1a;数据结构链表讲解 目录 前言&#xff1a; 链表的概念&#xff1a; 1.为什么要有链表&#xff1a; 2.链表的运行原理&#xff1a; 3.链表的形态多少&#xff1a; 4.单链表的代码书写&#xff1…...

docker部署MySQL主从服务

一.主从同步流程关于MySQL主从复制主要同步的是binlog日志&#xff0c;涉及到三个线程&#xff0c;一个运行在主节点&#xff08;log dump thread&#xff09;&#xff0c;其余两个(I/O thread, SQL thread)运行在从节点&#xff0c;如下图所示:当主库数据发生变更时&#xff0…...

儿童护目台灯哪种好用?几款真的保护视力的台灯品牌推荐

儿童眼睛还未发育完全&#xff0c;眼睛比较脆弱&#xff0c;但是现在的小孩子学习任务也比较繁重&#xff0c;经常晚上看书写字&#xff0c;所以选择合适的护眼台灯来保护眼睛很重要。 选择儿童护目台灯需要注意以下几个方面&#xff1a; &#xff08;一&#xff09;色温和亮…...

游戏逆向基础之OD找CALL实践

在逆向中除了分析数据之外&#xff0c;另外一个重要的工作就是找算法&#xff0c;找CALL 例如各种功能函数&#xff1a;攻击CALL,走路CALL,喊话CALL等等 以及加密解密等算法需要我们先锁定其位置&#xff0c;然后进行逆向分析。 最常见方法一 API函数下断&#xff0c;例如send …...

File 文件操作

File 文件操作&#xff1a; 一、常用方法&#xff1a; 方法类型描述public File(String pathname&#xff09;构造给定一个要操作文件的完整路径public File(File parent, String child)构造给定要操作文件的父路径和子文件名称public boolean createNewFile() throws IOExce…...

QT基础(18)- QAbstractSocket

QT基础&#xff08;18&#xff09;- QAbstractSocket1 创建简单的客户端2 QAbstractSocket2.1 简介2.2 枚举2.2.1 BingFlag2.2.2 NetworkLayerProtocol2.2.3 PauseMode2.2.4 SocketError2.2.5 SocketOption2.2.6 SocketType2.2.7 SocketState2.3 公有函数2.3.1 构造函数2.3.2 a…...

机器学习与目标检测作业:安装pytorch

机器学习与目标检测作业&#xff1a;安装pytorch一、 进入官网复制下载命令二、 下载的过程2.1 conda命令运行三、 测试pytorch是否安装成功安装pytorch教程 一、 进入官网复制下载命令 进入官网复制下载命令如下图所示 二、 下载的过程 下载的过程如下图所示 2.1 conda命令运…...

Android 源码中的 JNI,到底是如何使用的?

Linux下 JNI的使用学习 Android 其中涉及对 JNI 的使用&#xff1b;JNI的使用对于 Android 来说又是十分的重要和关键。那么到底 Java 到底是如何调用 C/C 的&#xff0c;下面是非常简单的计算器源码&#xff0c;只是用来熟悉JNI的基本语法&#xff0c;其中我自己碰到过的一个问…...

重磅新品 / 酷炫展品 / 强大生态,广和通玩转 MWC Barcelona 2023

2月27日&#xff0c;2023世界移动通信大会&#xff08;MWC Barcelona 2023&#xff09;在西班牙巴塞罗那正式开幕。全球知名移动运营商、设备制造商、技术提供商、物联网企业齐聚一堂&#xff0c;以领先的技术、创新的场景、前瞻的洞察向全行业输送最新鲜的行业观点。作为全球领…...

Hbuilder+uniapp 从零开始创建一个小程序

当你看到这篇博客的时候&#xff0c;那~说明~我的这篇博客写完了……哈哈哈哈哈哈哈哈。好的&#xff0c;清耐心往下看哈。如果有需要的&#xff0c;可以关注一下小作&#xff0c;后面还有小程序的云开发嗷~一、申请一个小程序账号&#xff08;已经有账号的小可爱可以跳过&…...

亚商投资顾问早餐FM/0303支持新能源汽车消费

01/亚商投资顾问早间导读高层调研集成电路企业并主持召开座谈会商务部&#xff1a;今年将积极出台新政策措施支持新能源汽车消费商务部&#xff1a;推动农村消费进一步恢复和扩大更好助力乡村振兴干细胞应用接连获重大突破机构密集调研相关上市公司02/亚商投资顾问新闻早餐// 热…...

Xinference-v1.17.1智能家居控制系统开发

Xinference-v1.17.1智能家居控制系统开发 1. 智能家居控制新体验 想象一下&#xff0c;早上醒来窗帘自动拉开&#xff0c;阳光洒进房间&#xff0c;咖啡机开始工作&#xff0c;音响播放你喜欢的音乐。这不是科幻电影&#xff0c;而是用Xinference-v1.17.1构建的智能家居控制系…...

Python实战:5分钟搞定Paillier同态加密的安装与基础使用(附避坑指南)

Python实战&#xff1a;5分钟搞定Paillier同态加密的安装与基础使用&#xff08;附避坑指南&#xff09; 隐私计算领域近年来发展迅猛&#xff0c;而同态加密作为其核心技术之一&#xff0c;正在金融、医疗等行业的数据协作场景中发挥越来越重要的作用。Paillier算法作为支持加…...

基于springboot框架的校园外卖管理系统的设计与实现

目录需求分析与功能规划技术选型与架构设计数据库设计与建模核心功能实现系统集成与测试部署与运维优化与扩展项目技术支持源码获取详细视频演示 &#xff1a;文章底部获取博主联系方式&#xff01;同行可合作需求分析与功能规划 明确校园外卖管理系统的核心需求&#xff0c;包…...

【问题处理】如何解决PSQLException中2-byte值超出范围导致的整数溢出错误

1. 什么是PSQLException中的2-byte值溢出错误 最近在调试一个Java应用时&#xff0c;遇到了一个让人头疼的错误&#xff1a;Tried to send an out-of-range integer as a 2-byte value: 110629。这个错误看起来有点晦涩&#xff0c;但其实理解起来并不复杂。简单来说&#xff0…...

Project Sistine核心代码剖析:从图像分割到鼠标事件模拟

Project Sistine核心代码剖析&#xff1a;从图像分割到鼠标事件模拟 【免费下载链接】sistine Turn a MacBook into a Touchscreen with $1 of Hardware 项目地址: https://gitcode.com/gh_mirrors/si/sistine Project Sistine是一个创新的开源项目&#xff0c;它能让普…...

Postiz消息队列:任务优先级与重试机制的终极指南

Postiz消息队列&#xff1a;任务优先级与重试机制的终极指南 【免费下载链接】clickvote Add upvotes, likes, and reviews to any context ⭐️ 项目地址: https://gitcode.com/GitHub_Trending/cl/clickvote Postiz是一款功能强大的开源项目&#xff0c;专注于为开发者…...

别再只盯着GPS了!从手机导航到无人机测绘,聊聊SPP、DGPS、RTK、PPP这几种定位技术到底该怎么选?

定位技术实战指南&#xff1a;从厘米级精度到全球覆盖的智能决策 站在一片待测绘的工地上&#xff0c;无人机工程师小王正面临一个关键抉择——该为这批新设备配置哪种定位模块&#xff1f;RTK的厘米级精度令人心动&#xff0c;但架设基准站的成本让他犹豫&#xff1b;PPP技术号…...

Vue3 的 JSX 函数组件,每次更新都会重新运行吗?

我用最直白、最无歧义、100%准确的方式&#xff0c;只回答你这一个问题&#xff1a; ✅ 最终答案&#xff08;背它&#xff09; 在 Vue3 中&#xff1a; 你写的 JSX 函数组件&#xff0c;整个函数 只会在组件初始化时运行 1 次&#xff01; 更新时&#xff0c;整个函数 不会重新…...

3分钟搞定Vue时间轴组件:打造优雅时间线应用的终极指南

3分钟搞定Vue时间轴组件&#xff1a;打造优雅时间线应用的终极指南 【免费下载链接】timeline-vuejs Minimalist Timeline ⏳ with VueJS &#x1f49a; 项目地址: https://gitcode.com/gh_mirrors/ti/timeline-vuejs 还在为Vue项目中的时间线展示而烦恼吗&#xff1f;t…...

AI 开发实战:需求变更后,如何让 AI 自动补回归范围

AI 开发实战&#xff1a;需求变更后&#xff0c;如何让 AI 自动补回归范围 一、这个问题为什么值得专门拿出来做&#xff1f; 在 AI 工程落地里&#xff0c;真正拖慢团队的往往不是模型本身&#xff0c;而是流程和协作方式没有跟上。 围绕“需求变更后&#xff0c;如何让 AI 自…...