SpringBoot系列之JDBC数据访问

SpringBoot jdbc是比较常用的内容,本博客通过实验并简单跟源码的方式进行介绍,希望可以帮助学习者更好地理解

环境准备:

  • IDEA
  • Maven

先新建一个项目:

New->Project or Module->Spring Initializer



选择JDBC和mysql驱动,为了方便测试web等等也可以选上

项目创建成功之后,会自动配上如下的配置:

<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>

新建一个application.yml配置文件:

spring:
datasource:
username: root
password: root
url: jdbc:mysql://127.0.0.1:3306/springboot
driver-class-name: com.mysql.jdbc.Driver

新建一个junit测试类进行测试:

package com.example.springboot.jdbc;

import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest; import javax.sql.DataSource;
import java.sql.Connection;
import java.sql.SQLException; @SpringBootTest
class SppringbootJdbcApplicationTests { @Autowired
DataSource dataSource; @Test
public void contextLoads() throws SQLException {
System.out.println(dataSource.getClass());
Connection connection = dataSource.getConnection();
System.out.println(connection);
connection.close();
} }

启动调试,发现控制台抛出异常信息:

Caused by: com.mysql.cj.exceptions.UnableToConnectException: CLIENT_PLUGIN_AUTH is required

at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)

at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)

at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)

at java.lang.reflect.Constructor.newInstance(Constructor.java:408)

at com.mysql.cj.exceptions.ExceptionFactory.createException(ExceptionFactory.java:61)

at com.mysql.cj.exceptions.ExceptionFactory.createException(ExceptionFactory.java:85)

at com.mysql.cj.protocol.a.NativeAuthenticationProvider.connect(NativeAuthenticationProvider.java:205)

at com.mysql.cj.protocol.a.NativeProtocol.connect(NativeProtocol.java:1340)

at com.mysql.cj.NativeSession.connect(NativeSession.java:157)

at com.mysql.cj.jdbc.ConnectionImpl.connectOneTryOnly(ConnectionImpl.java:956)

at com.mysql.cj.jdbc.ConnectionImpl.createNewIO(ConnectionImpl.java:826)

... 90 more

原因是我的mysql服务器是5.+版本,而最新版2.2.1默认配置的mysql驱动版本是8.+的,8.+的驱动类是com.mysql.cj.jdbc.Driver,而非com.mysql.jdbc.Driver,所以解决方法还是手动加一下mysql驱动版本

<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.27</version>
<scope>runtime</scope>
</dependency>

ok,现在正常测试,测试通过:

class com.zaxxer.hikari.HikariDataSource

2019-12-14 15:47:25.241 INFO 6772 --- [ main] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Starting...

2019-12-14 15:47:27.403 INFO 6772 --- [ main] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Start completed.

HikariProxyConnection@23906266 wrapping com.mysql.jdbc.JDBC4Connection@717ed

可以看出2.2.1版本的Springboot默认数据源类是com.zaxxer.hikari.HikariDataSource,而1.+版本很多都是以org.apache.tomcat.jdbc.pool.DataSource为默认数据源类的,具体哪个版本开始改变的不清楚

既然Springboot默认使用hikari数据源,那就可以加上hikari的一些自定义配置

spring:
datasource:
url: jdbc:mysql://127.0.0.1:3306/springboot?characterEncoding=utf8&useSSL=true
username: root
password: root
driver-class-name: com.mysql.jdbc.Driver
initialization-mode: always
type: com.zaxxer.hikari.HikariDataSource hikari:
jdbc-url: jdbc:mysql://127.0.0.1:3306/springboot?characterEncoding=utf8&useSSL=true
minimum-idle: 5
maximum-pool-size: 15
auto-commit: true
idle-timeout: 30000
pool-name: DatebookHikariCP
max-lifetime: 1800000
connection-timeout: 30000
connection-test-query: select 1

经过调试,属性配置是有起效的



ok,掌握简单应用之后,还是要跟一下源码,依照经验,找到对应的自动配置类DataSourceAutoConfiguration.java

不需要全部看懂源码,只要找到关键的信息即可,如图在这个自动配置类路其实就可以看出Springboot2.2.1支持的数据源种类有如下:



点一下DataSourceConfiguration类,里面都是各种DataSource的配置,用了很多@Conditional注解,条件符合才会起效



然后为什么说2.2.1版本默认是Hikari作为Datasource的?可以看一下项目的依赖图,可以看出默认引入了Hikari的jar



而且条件都符合,所以HikariDataSource就会进行自动配置



源码里用import引入了一个DataSourceInitializationConfiguration类,看其命名,应该是个初始化配置类



挑重点,如图,很明显要用了Spring框架很重要的后置处理器,还有一个DataSourceInitializerInvoker类



DataSourceInitializerInvoker类是做什么的?看其源码应该是一个初始化操作的监听器类,主要操作由DataSourceInitializer执行



DataSourceInitializer源码,里面有很多操作都是进行schema脚本的操作,只要非isEnabled就可以执行



只要两个条件符合就执行,DataSourceInitializationMode属性,看起来是通过配置文件获取的



getScripts,获取对应的脚本



读取schema脚本,所以可以看出只要将一些sql文件放在resources即可,默认文件命名为schema.sql,schema‐all.sql;



再通过资料,确认了这个类确实是执行一些初始化schema脚本的,根据application提示,发现有个属性,将其改为always即可

改为embedded是不能执行的,虽然源码里代码是这样的



还有这个关键代码,从配置spring.datasource.schema获取信息,

List<Resource> scripts = getScripts("spring.datasource.schema", this.properties.getSchema(), "schema");

private List<Resource> getResources(String propertyName, List<String> locations, boolean validate) {
List<Resource> resources = new ArrayList<>();
for (String location : locations) {
for (Resource resource : doGetResources(location)) {
if (resource.exists()) {
resources.add(resource);
}
else if (validate) {
throw new InvalidConfigurationPropertyValueException(propertyName, resource,
"The specified resource does not exist.");
}
}
}
return resources;
}

location就是一个字符类型的位置信息,所以可以使用如下配置,显然就可以自定义schema脚本,不需要固定为schema.sql或者schema-all.sql

代码例子下载:github下载链接

SpringBoot系列之JDBC数据访问的更多相关文章

  1. Spring04-SpringEL&Spring JDBC数据访问

    一. SpringEL入门 Spring动态语言(简称SpEL) 是一个支持运行时查询和操作对象图的强大的动态语言,语法类似于EL表达式,具有诸如显示方法和基本字符串模板函数等特性. 1. 准备工作 ...

  2. jdbc数据访问技术

    jdbc数据访问技术 1.JDBC如何做事务处理? Con.setAutoCommit(false) Con.commit(); Con.rollback(); 2.写出几个在Jdbc中常用的接口 p ...

  3. SpringBoot详细研究-02数据访问

    Springboot对数据访问部分提供了非常强大的集成,支持mysql,oracle等传统数据库的同时,也支持Redis,MongoDB等非关系型数据库,极大的简化了DAO的代码,尤其是Spring ...

  4. SpringBoot:Mybatis + Druid 数据访问

    西部开源-秦疆老师:基于SpringBoot 2.1.7 的博客教程 秦老师交流Q群号: 664386224 未授权禁止转载!编辑不易 , 转发请注明出处!防君子不防小人,共勉! 简介 对于数据访问层 ...

  5. SpringBoot(3):SpringData 数据访问

    一. 简介 Spring Data是一个用于简化数据库访问,并支持云服务的开源框架:其主要目标是 使得对数据的访问变得方便快捷.对于数据访问层,无论是 SQL(关系型数据库) 还是 NOSQL(非关系 ...

  6. Spring JDBC 数据访问

    Spring JDBC是Spring所提供的持久层技术,它的主要目标是降低使用JDBC API的门槛,以一种更直接,更简介,更简单的方式使用JDBC API, 在Spring JDBC里,仅需做那些与 ...

  7. SpringBoot系列之集成Druid配置数据源监控

    SpringBoot系列之集成Druid配置数据源监控 继上一篇博客SpringBoot系列之JDBC数据访问之后,本博客再介绍数据库连接池框架Druid的使用 实验环境准备: Maven Intel ...

  8. SpringBoot系列之学习教程汇总

    对应SpringBoot系列博客专栏,例子代码,本博客不定时更新 一.配置篇 SpringBoot系列之@PropertySource读取yaml文件     >> source down ...

  9. SpringBoot系列之从入门到精通系列教程

    对应SpringBoot系列博客专栏,例子代码,本博客不定时更新 Spring框架:作为JavaEE框架领域的一款重要的开源框架,在企业应用开发中有着很重要的作用,同时Spring框架及其子框架很多, ...

随机推荐

  1. mysql双主互为主从配置

    在使用双主互为主从的模式前提是互为主从的两个数据库,表的主键必须是自增的. 环境不多说了 ,多台mysql单实例或单台多实例都可以.多实例的配置请参考:https://www.cnblogs.com/ ...

  2. Python之tkinter.messagebox弹窗

    messagebox:tkinter的消息框.对话框 一.messagebox.showinfo(title='提示', message='错误') from tkinter import * fro ...

  3. JS简单循环遍历json数组的方法

    例如数据库里面的json字符串是这样的 1 2 3 4 5 var str = '[{"name":"宗2瓜","num":"1& ...

  4. Django 项目笔记

    Django 环境的搭建 Django 安装 pip install django==2.1.4 Django 创建项目 django-admin startproject mysite Django ...

  5. nyoj 259-茵茵的第一课 (python, input, print)

    259-茵茵的第一课 内存限制:64MB 时间限制:3000ms 特判: No 通过数:23 提交数:36 难度:0 题目描述: 茵茵今年已经六年级了,爸爸给她报了一个学习程序设计的班. 第一节课上, ...

  6. ArcGIS API For Javascript :如何在地图上做出点位脉冲闪烁的效果

    日常地图表达中我们通常使用的地图符号多是静态地图符号,时间久了会造成视觉审美疲劳,也没有现代感. 在这种背景下,对现有地图符号进行简单处理,即可得到色彩鲜艳,对比度强烈,活灵活现的地图表达形式. 灵感 ...

  7. secureCRT安装与激活

    SecureCRT安装及激活方式 百度网盘地址: SecureCRT及激活软件的地址: 1. 安装secureCRT 百度网盘下载,点击scrt814-x64.exe,按照提示安装secureCRT, ...

  8. error: (-215:Assertion failed) size.width>0 && size.height>0 in function 'cv::imshow'

    用Python打开图像始终提示错误 error: OpenCV(4.1.1) C:\projects\opencv-python\opencv\modules\highgui\src\window.c ...

  9. 就该这样理解 OSI 七层参考模型、浅谈不同局域网之间的通信

    简介 说到OSI参考模型,理解网络与网络之间的关系,不说太深入难以理解的东西,只求能最大程度上理解与使用. 参考模型是国际标准化组织(ISO)制定的一个用于计算机或通信系统间互联的标准体系,一般称为O ...

  10. think PHP 查询、更改

    最近公司没有什么新项目,故准备搞搞PHP,正好后端有一些小东西需要搞一下,我就来试试吧. PHP 基于think PHP 3 实现功能: 1.为销售绑定虚拟号码分组(查询可以绑定的分组 -> 绑 ...