【开发篇】四、数据源、JdbcTemplate、内嵌H2

news2024/11/28 9:29:01

文章目录

  • 1、数据源DataSource
  • 2、SpringBoot的内嵌数据源对象
  • 3、Spring的内置持久化方案JdbcTemplate
  • 4、SpringBoot内嵌数据库
  • 5、内嵌数据库H2的访问

请添加图片描述

1、数据源DataSource

了解数据源这个概念前,先看下原生JDBC的基本步骤:


Connection conn= null;
Statement statement = null;
try{
    //注册驱动
    Class.forName("com.mysql.cj.jdbc.Driver");
    //获取连接
    conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/testDB","root","95279527");
    //获取数据库操作对象
    statement = conn.createStatement();
    //执行SQL语句
    String sql = "UPDATE dept SET dname='智能研发' WHERE deptno=1";
    int count = statement.executeUpdate(sql);
    System.out.println(count == 1 ? "更新成功" : "更新失败");
}catch(Exception e){
    e.printStackTrace();
} finally{
	//关闭资源
}


数据源,即数据的来源。在数据源对象中存储了所有建立数据库连接的信息,如驱动类型,host、port、username、password,来构建数据库连接和连接池(注意不是所有的数据源都提供连接池),这个连接池,我理解的是上面的Connection对象的一个集合。

普通的连接数据库是建立一个连接,执行完sql之后,就会关闭,即销毁connection对象,再次连接还需要重复上述步骤。当与数据库交互频繁时,这种模式会严重影响程序的性能。时间和空间消耗大多数消耗在连接和销毁中,而非数据库处理。而数据源连接池会根据你的参数建立多个数据库连接并缓存,你每次连接数据库的时候就可以从连接池中获取一个连接,去执行sql,用完会放入连接池。这样,就避免了连接数据库的开销,也减少了对数据库的压力。

2、SpringBoot的内嵌数据源对象

前面项目中,数据层解决方案的技术选型是:

  • 数据源用DruidDataSource
  • 数据库用MySQL
  • 持久化框架用:MyBatis-plus

数据源的配置格式有:

spring:
  datasource:
     driver-class-name: com.mysql.cj.jdbc.Driver
     url: jdbc:mysql://localhost:3306/ssm_db?serverTimezone=UTC    
     username: root    
     password: root
     type: xxx

当引入了Druid的起步依赖后,这个配置还可以写为:

在这里插入图片描述

SpringBoot提供了3种内嵌的数据源对象供开发者选择:

  • Hikari CP:默认内置数据源对象
  • Tomcat提供DataSource:HikariCP不可用的情况下,且在web环境中,将使用tomcat服务器配置的数据源对象
  • Commons DBCP:Hikari不可用,tomcat数据源也不可用,将使用dbcp数据源

注意除通用配置外,具体的连接配置,要视具体的数据源类型来在下一级配置中设定,如maximum-pool-size:

在这里插入图片描述

注释掉Druid的起步依赖,重启模块,可以看到日志中不再有之前Druid的信息,而是输出Hikaricp。

3、Spring的内置持久化方案JdbcTemplate

接下来不用之前的MyBatis或者MyBatisPlus,使用Spring的JdbcTemplate来完成持久化,引入起步依赖:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>

<!--MySQL的驱动别忘了-->
<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <scope>runtime</scope>
</dependency>

其实看下mybatis或者mybatisplus的依赖,会发现他们里面包含jdbc的起步依赖spring-boot-starter-jdbc,因为这两个框架当然也是以jdbc为基础做的封装。它们之间的关系,我理解的是原生JDBC => JDBC Template => MyBatis => MyBatisPlus

在这里插入图片描述

关于JDBC Template的使用,粗糙的查询如下,此时返回结果的类型是List<Map<String,Object>>,可能使用不便。

@Test
void testJdbcTemplate(@Autowired JdbcTemplate jdbcTemplate){

	String sql = "select * from tbl_book where id = 1";
	List<Map<String,Object>> list = jdbcTemplate.queryForList(sql);
}

以下这个写法返回实体类的List。中间使用RowMapper接口做了转换:

@SpringBootTest
class Springboot15SqlApplicationTests {    
	@Autowired    
	private JdbcTemplate jdbcTemplate;    
	@Test    
	void testJdbc(){        
		String sql = "select * from tbl_book where id = 1";
		List<Book> query = jdbcTemplate.query(sql, new RowMapper<Book>() {           
			@Override            
			public Book mapRow(ResultSet rs, int rowNum) throws SQLException {                
				Book temp = new Book();               
				temp.setId(rs.getInt("id"));               
				temp.setName(rs.getString("name"));                
				temp.setType(rs.getString("type"));                
				temp.setDescription(rs.getString("description"));               
				return temp;           
			}       
			});        
		System.out.println(query);    
	}
}

关于JdbcTemplate的配置:

spring:
  jdbc:    
    template:      
      query-timeout: -1   # 查询超时时间      
      max-rows: 500       # 最大行数      
      fetch-size: -1      # 缓存行数

这个缓存行数,即不会一次把查询的所有行都装进来,每次先存fetch-size行

4、SpringBoot内嵌数据库

SpringBoot提供了3种内嵌数据库供开发者选择,提高开发测试效率:

  • H2
  • HSQL
  • Derby

H2是一个采用java语言编写的嵌入式关系型数据库,只是一个类库(即只有一个 jar 文件),可以直接嵌入到应用项目中,不受平台的限制。

以H2数据库为例,首先导入依赖的坐标:

<dependency>    
	<groupId>org.springframework.boot</groupId>
	<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>

<dependency>    
	<groupId>com.h2database</groupId>    
	<artifactId>h2</artifactId>    
	<scope>runtime</scope>
</dependency>

再设置当前项目于为web工程(直接引入spring-boot-starter-web起步依赖就行),并配置H2管理控制台参数:

spring:
   h2:    
     console:   
       enabled: true  # 开启可视化控制台  
       path: /h2     # 配置控制台访问路径
       
# 访问用户名sa,默认密码123456

第一次在控制台启动测试连接可能会失败,没有这个库(对应磁盘~目录下没这个文件夹),存C盘有点烦,可按需自己改,如:

jdbc:h2:D:/software/h2/data/test

在这里插入图片描述

改下配置,把上面表单的配置贴datasource里:

在这里插入图片描述

重启服务后再登录,即可成功:

在这里插入图片描述

H2启动成功。

5、内嵌数据库H2的访问

server:
  port: 80

spring:  
  datasource:    
    driver-class-name: org.h2.Driver    
    url: jdbc:h2:~/test    
    username: sa    
    password: 123456  
  h2:    
    console:      
      path: /h2      
      enabled: true

SpringBoot可以根据url地址自动识别数据库种类,在保障驱动类存在的情况下,可以省略配置,即driver-class-name: org.h2.Driver 这行可注释掉。使用JDBC来操作一下H2数据库:

String sql = "inser into xxx";
jdbcTemplate.update(sql);

这里可能会报错:

The file is locked:nio:C:/Users/yourname/test.mv.db
Database may be already in use:null. Close all other connections

这是因为默认是嵌入式的连接方式,这种连接方式默认情况下只允许有一个客户端连接到H2数据库,有客户端连接到H2数据库之后,此时数据库文件就会被锁定,那么其他客户端就无法再连接了。最后,H2数据库控制台仅用于开发阶段,线上项目请务必关闭控制台功能。(或者分配置文件,dev、pro)

在这里插入图片描述

更多H2数据库的信息,如运行模式是内嵌模式、服务器模式、混合模式,连接模式是不是内存模式等,参考这篇:https://blog.csdn.net/qq_34845394/article/details/107190256

到此,关于数据层的技术选型搭配就很多了:

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1052528.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【JVM】双亲委派模型

双亲委派模型 1. 什么是双亲委派模型2. 双亲委派模型的优点 1. 什么是双亲委派模型 提到 类加载 机制&#xff0c;不得不提的一个概念就是“双亲委派模型”。 双亲委派模型指的就是 JVM 中的类加载器如何根据类的全限定名找到 .class 文件的过程 类加载器: JVM 里面专门提供…

坠落防护 挂点装置

声明 本文是学习GB 30862-2014 坠落防护 挂点装置. 而整理的学习笔记,分享出来希望更多人受益,如果存在侵权请及时联系我们 1 范围 本标准规定了高处坠落防护挂点装置的技术要求、检验方法、检验规则及标识。 本标准适用于防护高处坠落的挂点装置。 本标准不适用于体育及消…

【C++】unordered_set与unordered_map的封装

&#x1f307;个人主页&#xff1a;平凡的小苏 &#x1f4da;学习格言&#xff1a;命运给你一个低的起点&#xff0c;是想看你精彩的翻盘&#xff0c;而不是让你自甘堕落&#xff0c;脚下的路虽然难走&#xff0c;但我还能走&#xff0c;比起向阳而生&#xff0c;我更想尝试逆风…

Java | Maven(知识点查询)

文章目录 Maven知识速查1. Maven概述2. Maven的作用3. Maven的下载4. Maven的环境配置5. Maven 的基础组成5.1 Maven仓库5.1.1 本地仓库配置&#xff1a;5.1.2 中央仓库配置&#xff1a;5.1.3 镜像仓库配置 5.2 Maven坐标 6. Maven项目6.1 手工创建Maven项目6.2 自动构建项目 7…

7、Docker网络

docker网络模式能干嘛&#xff1f; 容器间的互联和通信以及端口映射 容器IP变动时候可以通过服务名直接网络通信而不受到影响 docker 网络模式采用的是桥接模式&#xff0c;当我们创建了一个容器后docker网络就会帮我们创建一个虚拟网卡&#xff0c;这个虚拟网卡和我们的容器网…

火热报名中 | 2天峰会、20+热门议题,AutoESG 2023数智低碳---中国汽车碳管理创新峰会亮点抢先看!

在碳中和的背景下&#xff0c;减碳之风吹遍全球&#xff0c;而汽车行业则由于产业链长、辐射面广、碳排放总量增长快、单车碳强度高的特点&#xff0c;成为各国碳排放管理的监管重点&#xff0c;聚焦汽车业的碳博弈也逐步升级。 2020年&#xff0c;国务院办公厅印发的《新能源…

Linux高级应用——web网站服务(2)

作者简介&#xff1a;一名云计算网络运维人员、每天分享网络与运维的技术与干货。 公众号&#xff1a;网络豆云计算学堂 座右铭&#xff1a;低头赶路&#xff0c;敬事如仪 个人主页&#xff1a; 网络豆的主页​​​​​ 目录 前言 一. httpd服务访问控制概述 1.为什么要…

用友U8 CRM客户关系管理任意文件上传漏洞复现【附POC】

文章目录 用友U8 CRM客户关系管理任意文件上传漏洞复现0x01 前言0x02 漏洞描述0x03 影响平台0x04 漏洞环境0x05 漏洞复现1.访问漏洞环境2.构造POC3.复现4.访问shell地址 0x06 整改建议 用友U8 CRM客户关系管理任意文件上传漏洞复现 0x01 前言 免责声明&#xff1a;请勿利用文…

牛客 ( 计算几何

#include <bits/stdc.h> using namespace std; using ll long long; using PII pair<double , double>; int n; PII p[3000010]; vector<PII> pp; PII yuan(PII a , PII b , PII c) {//已知三个点确定圆的半径和圆心double x1 a.first,x2 b.first,x3 c.…

Spring面试题25:Spring如何控制bean加载先后顺序

该文章专注于面试,面试只要回答关键点即可,不需要对框架有非常深入的回答,如果你想应付面试,是足够了,抓住关键点 面试官:Spring如何控制bean加载先后顺序 Spring框架提供了两种方式来控制Bean的加载顺序: depends-on属性:通过在Bean配置中使用depends-on属性,可以明…

AIOT入门指南:探索人工智能与物联网的交汇点

AIOT入门指南&#xff1a;探索人工智能与物联网的交汇点 1. 引言 随着技术的快速发展&#xff0c;人工智能&#xff08;AI&#xff09;和物联网&#xff08;IoT&#xff09;已经成为当今最热门的技术领域。当这两个领域交汇时&#xff0c;我们得到了AIOT - 一个结合了AI的智能…

MySQL学习笔记25

逻辑备份 物理备份 在线热备&#xff1a; 真实案例&#xff1a; 数据库架构是一主两从&#xff0c;但是两台从数据库和主数据不同步。但是每天会全库备份主服务器上的数据到从服务器上。需要解决主从不同步的问题。 案例背后的核心技术&#xff1a; 1、熟悉MySQL数据库常见…

一点C知识:数据类型和内存地址。

当你需要存储一份数据到内存里的时候&#xff0c;你需要通过需要存储的方式和精度&#xff0c;向操作系统申请一份内存地址&#xff0c;形容怎么样申请地址的关键字就是数据类型。 例如&#xff0c;32位的处理器就有着32位的地址位宽&#xff0c;定义了一个char类型的数据&…

QSS之QScrollArea

QScrollArea在实际的开发过程中经常使用&#xff0c;主要是有些界面一屏显示不下&#xff0c;所以得用QScorllArea带滚动条拖动显示剩余的界面。默认的QScrollArea滚动条不满设计的风格&#xff0c;因此我们必须设置自已的滚动条风格&#xff0c;QScrollBar分为水平horizontal和…

if条件分支计算分段函数

分别罗列x的值域区间&#xff0c;if条件跳转相应分支计算函数值。 (本笔记适合正在研学if条件分支语句的 coder 翻阅) 【学习的细节是欢悦的历程】 Python 官网&#xff1a;https://www.python.org/ Free&#xff1a;大咖免费“圣经”教程《 python 完全自学教程》&#xff0c…

Adams齿轮副

1.运动副 添加旋转副的时候&#xff0c;必须先物体后公共part(即此处的ground&#xff09;&#xff0c;最后再选择质心点 2.啮合点 啮合点marker的z轴必须是齿轮分度圆的切线方向 3.啮合点 两齿轮的旋转副&#xff0c;和啮合点&#xff0c;即cv marker &#xff0c;必须属…

解决Nacos配置刷新问题: 如何启用配置刷新功能以及与`@RefreshScope`注解的关联问题

&#x1f337;&#x1f341; 博主猫头虎 带您 Go to New World.✨&#x1f341; &#x1f984; 博客首页——猫头虎的博客&#x1f390; &#x1f433;《面试题大全专栏》 文章图文并茂&#x1f995;生动形象&#x1f996;简单易学&#xff01;欢迎大家来踩踩~&#x1f33a; &a…

《HelloGitHub》第 90 期

兴趣是最好的老师&#xff0c;HelloGitHub 让你对编程感兴趣&#xff01; 简介 HelloGitHub 分享 GitHub 上有趣、入门级的开源项目。 https://github.com/521xueweihan/HelloGitHub 这里有实战项目、入门教程、黑科技、开源书籍、大厂开源项目等&#xff0c;涵盖多种编程语言 …

轻量自高斯注意力(LSGA)机制

light&#xff08;轻量&#xff09;Self-Gaussian-Attention vision transformer&#xff08;高斯自注意力视觉transformer&#xff09; for hyperspectral image classification&#xff08;高光谱图像分类&#xff09; 论文&#xff1a;Light Self-Gaussian-Attention Vision…

第7讲:VBA中利用FIND的代码实现单值查找实例

【分享成果&#xff0c;随喜正能量】心真如&#xff0c;随缘生起一切法&#xff0c;一切法还归于真如。《大乘起信论》讲心真如门就是体&#xff0c;心生灭门就是相用&#xff0c;心生灭、心真如都从一心而起&#xff0c;离开心别无二法。我们想从心真如门修行不易进入&#xf…