SpringBoot-默认数据源HikariDataSource对数据库操作及自动装配原理

默认数据源HikariDataSource对数据库操作

  1. 在创建项目时选择JDBC以及MySQL驱动,让SpringBoot自动装配所需组件

[外链图片转存失败(img-QzCfeTn6-1565848669773)(/Users/guih/Desktop/1.png)]

创建完成后默认的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 http://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.7.RELEASE</version><relativePath/> <!-- lookup parent from repository --></parent><groupId>com.guih</groupId><artifactId>spring-boot-data-jdbc</artifactId><version>0.0.1-SNAPSHOT</version><name>spring-boot-data-jdbc</name><description>JDBC Demo project for Spring Boot</description><properties><java.version>1.8</java.version></properties><dependencies><!-- SpringBoot集成的JDBC以及数据库连接包 --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-jdbc</artifactId></dependency><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><scope>runtime</scope></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></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>
  1. 创建 application.yml 文件,配置连接数据库的参数
spring:datasource:username: rootpassword: 123456driver-class-name: com.mysql.cj.jdbc.Driverurl: jdbc:mysql://localhost:3306/jdbc?useUnicode=true&characterEncoding=utf8&useSSL=false
  1. 测试是否能获取到数据源
// 单元测试代码
@RunWith(SpringRunner.class)
@SpringBootTest
public class SpringBootDataJdbcApplicationTests {@Autowiredprivate DataSource dataSource;@Testpublic void test() throws SQLException {Connection data = dataSource.getConnection();System.out.println("------" + data.getClass());System.out.println("------" + dataSource.getClass());data.close();}}

输出结果如下,数据源获取成功,说明SpringBoot2.1.7默认使用的是Hikari连接池**(SpringBoot2.0之前使用的是tomcat连接池)**

------class com.zaxxer.hikari.pool.HikariProxyConnection
------class com.zaxxer.hikari.HikariDataSource
  1. 使用数据源对数据库进行操作

    1. 为了方便测试,这里使用的数据库是本机上的数据库

      [)]

    2. 编写代码测试访问数据库

      @Controller
      public class JDBCTest {@Autowiredprivate JdbcTemplate jdbcTemplate;@RequestMapping("/query")@ResponseBodypublic Map<String, Object> query() {List<Map<String, Object>> list = jdbcTemplate.queryForList("SELECT * FROM test1");return list.get(0);} 
      }
      
    3. 启动SpringBoot程序并使用Postman进行测试

      [外链图片转存失败(img-Md6eDEJQ-1565848669774)(/Users/guih/Desktop/6.png)]

    SpringBoot默认数据源自动装配原理

    1. 参考org.springframework.boot.autoconfigure.jdbc包下的DataSourceConfigration类

      package org.springframework.boot.autoconfigure.jdbc;import javax.sql.DataSource;import com.zaxxer.hikari.HikariDataSource;import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
      import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
      import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
      import org.springframework.boot.context.properties.ConfigurationProperties;
      import org.springframework.boot.jdbc.DatabaseDriver;
      import org.springframework.context.annotation.Bean;
      import org.springframework.context.annotation.Configuration;
      import org.springframework.util.StringUtils;abstract class DataSourceConfiguration {@SuppressWarnings("unchecked")protected static <T> T createDataSource(DataSourceProperties properties, Class<? extends DataSource> type) {return (T) properties.initializeDataSourceBuilder().type(type).build();}// 根据容器中的情况来进行逻辑判断,添加不同的数据源@Configuration@ConditionalOnClass(org.apache.tomcat.jdbc.pool.DataSource.class)@ConditionalOnMissingBean(DataSource.class)@ConditionalOnProperty(name = "spring.datasource.type", havingValue = "org.apache.tomcat.jdbc.pool.DataSource",matchIfMissing = true)static class Tomcat {@Bean@ConfigurationProperties(prefix = "spring.datasource.tomcat")public org.apache.tomcat.jdbc.pool.DataSource dataSource(DataSourceProperties properties) {org.apache.tomcat.jdbc.pool.DataSource dataSource = createDataSource(properties,org.apache.tomcat.jdbc.pool.DataSource.class);DatabaseDriver databaseDriver = DatabaseDriver.fromJdbcUrl(properties.determineUrl());String validationQuery = databaseDriver.getValidationQuery();if (validationQuery != null) {dataSource.setTestOnBorrow(true);dataSource.setValidationQuery(validationQuery);}return dataSource;}}@Configuration@ConditionalOnClass(HikariDataSource.class)@ConditionalOnMissingBean(DataSource.class)@ConditionalOnProperty(name = "spring.datasource.type", havingValue = "com.zaxxer.hikari.HikariDataSource",matchIfMissing = true)static class Hikari {@Bean@ConfigurationProperties(prefix = "spring.datasource.hikari")public HikariDataSource dataSource(DataSourceProperties properties) {HikariDataSource dataSource = createDataSource(properties, HikariDataSource.class);if (StringUtils.hasText(properties.getName())) {dataSource.setPoolName(properties.getName());}return dataSource;}}// 也可以指定其他的数据源@Configuration@ConditionalOnClass(org.apache.commons.dbcp2.BasicDataSource.class)@ConditionalOnMissingBean(DataSource.class)@ConditionalOnProperty(name = "spring.datasource.type", havingValue = "org.apache.commons.dbcp2.BasicDataSource",matchIfMissing = true)static class Dbcp2 {@Bean@ConfigurationProperties(prefix = "spring.datasource.dbcp2")public org.apache.commons.dbcp2.BasicDataSource dataSource(DataSourceProperties properties) {return createDataSource(properties, org.apache.commons.dbcp2.BasicDataSource.class);}}@Configuration@ConditionalOnMissingBean(DataSource.class)@ConditionalOnProperty(name = "spring.datasource.type")static class Generic {@Beanpublic DataSource dataSource(DataSourceProperties properties) {// 使用DataSourceBuilder创建数据源,利用反射创建响应type的数据源,并且绑定相关属性return properties.initializeDataSourceBuilder().build();}}}
      

      从代码中可以看出SpringBoot是根据用户的配置来自动配置不同的数据源,目前支持的数据源有以下三种

      com.zaxxer.hikari.HikariDataSourceSpring Boot 2.0 以上,默认使用此数据源)org.apache.tomcat.jdbc.pool.DataSourceorg.apache.commons.dbcp2.BasicDataSource
      

      还可以在配置文件中使用 “spring.datasource.type” 属性来配置用户指定的数据源

    2. 在同一个包下的另一个类 DataSourceInitializer,当我们要在SpringBoot启动时运行sql建表语句或插入数据时就会用得上

      // DataSourceInitializer类部分代码public boolean createSchema() {List<Resource> scripts = getScripts("spring.datasource.schema", this.properties.getSchema(), "schema");if (!scripts.isEmpty()) {if (!isEnabled()) {logger.debug("Initialization disabled (not running DDL scripts)");return false;}String username = this.properties.getSchemaUsername();String password = this.properties.getSchemaPassword();runScripts(scripts, username, password);}return !scripts.isEmpty();}public void initSchema() {List<Resource> scripts = getScripts("spring.datasource.data", this.properties.getData(), "data");if (!scripts.isEmpty()) {if (!isEnabled()) {logger.debug("Initialization disabled (not running data scripts)");return;}String username = this.properties.getDataUsername();String password = this.properties.getDataPassword();runScripts(scripts, username, password);}}private void runScripts(List<Resource> resources, String username, String password) {if (resources.isEmpty()) {return;}ResourceDatabasePopulator populator = new ResourceDatabasePopulator();populator.setContinueOnError(this.properties.isContinueOnError());populator.setSeparator(this.properties.getSeparator());if (this.properties.getSqlScriptEncoding() != null) {populator.setSqlScriptEncoding(this.properties.getSqlScriptEncoding().name());}for (Resource resource : resources) {populator.addScript(resource);}DataSource dataSource = this.dataSource;if (StringUtils.hasText(username) && StringUtils.hasText(password)) {dataSource = DataSourceBuilder.create(this.properties.getClassLoader()).driverClassName(this.properties.determineDriverClassName()).url(this.properties.determineUrl()).username(username).password(password).build();}DatabasePopulatorUtils.execute(populator, dataSource);}
      

      从代码中可以看出SpringBoot会从配置文件中读取 “spring.datasource.schema” 属性用于数据库建表,读取 “spring.datasource.data” 属性用于写入数据,所以在需要程序在创建时运行sql文件可以通过这个参数来配置

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

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

相关文章

matlab fgetl用法,Matlab fgetl strsplit 函数

函数功能&#xff1a;从文件中调用一行数据matlab中fgetl函数&#xff0c;并除去行末的换行符。语法格式&#xff1a;tline fgetl(fid)fid是通过fopen函数打开文件后得到的一个整型的文件标志。fgetl从这个文件中调用一行数据并丢弃其中的换行符。如果抓取成功tline容纳了调用…

HikariCP源码简洁剖析——HikariDataSource_HikariCP的使用和源码

文章目录HikariDataSource的作用源码剖析核心变量构造方法获取链接实例HikariCP的使用和源码简介HikariCP是什么&#xff1f;HikariCP 解决了哪些问题&#xff1f;为什么要使用 HikariCP&#xff1f;本文要讲什么&#xff1f;如何使用 HikariCP需求项目环境引入依赖编写 hikari…

MySQL如何创建沙箱,沙箱环境搭建 - osc_y8w65yuq的个人空间 - OSCHINA - 中文开源技术交流社区...

[toc]测试环境搭建沙箱环境&#xff1a;-------测试环境搭建基础配置&#xff1a;# 1、在沙箱环境下实名认证&#xff1a;https://openhome.alipay.com/platform/appDaily.htm?tabinfo# 2、电脑网站支付API&#xff1a;https://docs.open.alipay.com/270/105898/# 3、完成RSA密…

PHP单选框实现的方法,jQuery简单实现遍历单选框的方法

本文实例讲述了jQuery简单实现遍历单选框的方法。分享给大家供大家参考&#xff0c;具体如下&#xff1a;1、问题背景&#xff1a;有四个单选框&#xff0c;分别为一年四季&#xff0c;现在需要判断是否选中&#xff0c;如果选中这个单选框&#xff0c;就将其值赋值给输入框2、…

java.lang.StringIndexOutOfBoundsException: String index out of range: -1

[2022 中国 DevOps 现状调查全面启动&#xff01;>>> 字符串截取下标越界 java.lang.StringIndexOutOfBoundsException: String index out of range: -1at java.lang.String.substring(String.java:1967)出错代码 result.put("value", valueBuilder.toSt…

matlab 粘连分割代码,【求助】图像中粘连字符切分代码,求注释!!!

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼% 依然是切分 %MarkMarkabs(I(j1,i)-I(j,i)); % 检测是否通过笔划jj1;endSegY[SegY j-1]; % 第一次切分截止处if (j38)PXR1[PXR1 i];PXR2[PXR2 i];else % 单点粘连SLii;while ((…

java中如何获取项目的路径

记录是为了更好的成长&#xff01; 1、ssm项目中 1.以工程名为TEST为例&#xff1a; (1)得到包含工程名的当前页面全路径&#xff1a;request.getRequestURI() 结果&#xff1a;/TEST/test.jsp (2)得到工程名&#xff1a;request.getContextPath() 结果&#xff1a;/TEST (3…

php用a什么软件来下载,AMQB官方PHP库

AMQB官方PHP库namespace PhpAmqpLib\Channel;use PhpAmqpLib\Exception\AMQPBasicCancelException;use PhpAmqpLib\Exception\AMQPProtocolChannelException;use PhpAmqpLib\Exception\AMQPRuntimeException;use PhpAmqpLib\Message\AMQPMessage;use PhpAmqpLib\Wire\AMQPReade…

String怎么转成BigDecimal_Java.math.BigDecimal类的使用

1.引言 浮点数值不适用于无法接受舍入误差的金融计算中。 例如&#xff0c;命令System.out.prmtln (2.0-1.1)将打印出0.8999999999999999&#xff0c;而不是人们想象的0.9 。 2.0-1.1的运算结果 这种舍入误差的主要原因是浮点数值采用二进制系统表示&#xff0c;而在二进制系统…

loadrunner支持php包吗,Loadrunner自带的WebTours

Loadrunner自带的WebTours发表于&#xff1a;2013-07-28来源&#xff1a;Csdn作者&#xff1a;Ocean-Lee点击数&#xff1a;由于今天花了时间去移动(Loadruner自带的WebTours例子程序)到其他的电脑上&#xff0c;方便练习Loadrunner&#xff0c;偷懒。 很久没有动部署的东西了&…

@Value(“#{}“)与@Value(“${}“)的区别

Value(“#{}”) 表示SpEl表达式通常用来获取bean的属性&#xff0c;或者调用bean的某个方法。当然还有可以表示常量用 Value(“${xxxx}”)注解从配置文件读取值的用法 一、 Value(“#{}”) 1 Value(“#{}”) SpEL表达式&#xff08;https://blog.csdn.net/ya_1249463314/articl…

JTS Java空间几何计算、距离、最近点、subLine等计算

文章目录前言地理坐标系和投影坐标系地理坐标系投影坐标系地图投影墨卡托/Web墨卡托常见坐标系地理坐标系和投影坐标系互转EPSG:3857和EPSG:4326Java各坐标系之间的转换&#xff08;高斯、WGS84经纬度、Web墨卡托、瓦片坐标&#xff09;GeotoolsJTSvividsolutions和locationtec…

ecshop nginx php-fpm,ecshop在nginx下配置常见问题

我们前面讲述了nginx安装和配置&#xff0c;知道如何将ecshop建立在linux环境下的nginx上。但是为了让ecshop能更好的在nginx下跑出性能。我们必须对ecshop以及nginx的配置做出调整和改进&#xff0c;不然很容易浪费了nginx的性能。我们将结合一些实际情况&#xff0c;谈谈ecsh…

JTS学习笔记

简介 JTS由加拿大的VividSolutions公司开发&#xff0c;是一个用Java语言描述的几何拓扑套件&#xff0c;遵循OpenGIS的Simple Feature Specification&#xff0c;封装了2D几何类型和非常多的空间分析操作&#xff0c;而且包含了不少常见的计算几何算法实现。 JTS被广泛地应用…

matlab数学实验结课作业答案,matlab数学实验第一次答案

常用的高分子材料大致有哪几类&#xff1f;常用矿物硬度计为指甲和小刀&#xff0c;其中指甲的硬度为 ( )&#xff0c;小刀的硬度为( )。常用的自我增强的方式有六种。()常用的瓶插固定法有 。常用的静态网页制作软件有Dreamweaver、Access等。( )常用除草剂的类型有常见栽培…

填坑:Maven工程引用GeoTools依赖

这两天在做一个系统的后台&#xff0c;需要用到GeoTools做后端空间分析&#xff0c;记录一下自己遇到的问题。 项目通过Maven进行构建&#xff0c;参照文档Maven Quickstart添加GeoTools依赖和远程仓库地址。 <dependencies><dependency><groupId>org.geotoo…

php byte stringbuffer,重拾java基础(十三):String姐妹StringBuffer、StringBuilder总结

重拾java基础(十三)&#xff1a;String姐妹StringBuffer、StringBuilder总结一、StringBuffer类概述buffer&#xff1a;缓冲2. 字符串缓冲区&#xff0c;跟String非常相似&#xff0c;都是用来存字符串数据的3. String类和StringBuffer类中都有一个char数组&#xff0c;它就是缓…

php 页面开启错误提示,php开启与关闭错误提示

windows系统开关php错误提示如果不具备修改php.ini的权限&#xff0c;可以将如下代码加入php文件中&#xff1a;代码如下 复制代码ini_set("display_errors", "On");error_reporting(E_ALL | E_STRICT);当然&#xff0c;如果能够修改php.ini的话&#xff0…

Maven下载jar包时出错、Maven仓库中出现.lastUpdated结尾的文件问题及解决

创建一个新项目&#xff0c;下载依赖时&#xff0c;出现以下错误&#xff0c;在本地maven仓库中的远程镜像地址配置也正确的情况下&#xff0c;分析了以下问题&#xff1a; 在这里插入图片描述1.idea报依赖冲突的错误&#xff0c;打开Project Structure&#xff0c;如果发现相…

ga tsp matlab,遗传算法(GA)求解TSP问题MATLAB程序

本程序求解常见的组合优化问题TSP问题&#xff0c;如果仅仅是用一个程序去求解一个优化问题&#xff0c;显然这样的工作意义并不大。主要是因为求解的好坏往往是很难评价的&#xff0c;另外尤其对于遗传算法来说&#xff0c;遗传算法交叉变异方法不同&#xff0c;交叉率&#x…