SpringBoot系列之JDBC数据访问

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

环境准备:

  • IDEA
  • Maven

先新建一个项目:

New->Project or Module->Spring Initializer

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

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

org.springframework.bootspring-boot-starter-jdbcmysqlmysql-connector-javaruntime

新建一个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;@SpringBootTestclass SppringbootJdbcApplicationTests {@AutowiredDataSource dataSource;@Testpublic 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驱动版本

mysqlmysql-connector-java5.1.27runtime

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 scripts = getScripts("spring.datasource.schema", this.properties.getSchema(), "schema");
private List getResources(String propertyName, List locations, boolean validate) {List 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

boot访问resources下边的图片_SpringBoot系列之JDBC数据访问相关推荐

  1. ASP.NET企业开发框架IsLine FrameWork系列之六--DataProvider 数据访问(下)

    ASP.NET企业开发框架IsLine FrameWork系列之六--DataProvider 数据访问(下) 接上文 对文件系统的操作: 对于文件目前内置3中支持对象:XML.TEXT.CONFIG ...

  2. ASP.NET企业开发框架IsLine FrameWork系列之五--DataProvider 数据访问(中)

    ASP.NET企业开发框架IsLine FrameWork系列之五--DataProvider 数据访问(中) 接上文 使用DataProvider前,需要先在web.config中配置以下节点,添加 ...

  3. ASP.NET企业开发框架IsLine FrameWork系列之四--DataProvider 数据访问(上)

    ASP.NET企业开发框架IsLine FrameWork系列之四--DataProvider 数据访问(上) 接上文 DataProvider是日常编程中最常用的Provider,它为项目提供了与数 ...

  4. Spring Boot中使用Spring-data-jpa让数据访问更简单、更优雅

    在上一篇Spring中使用JdbcTemplate访问数据库 中介绍了一种基本的数据访问方式,结合构建RESTful API和使用Thymeleaf模板引擎渲染Web视图的内容就已经可以完成App服务 ...

  5. Spring.Net+NHibenate+Asp.Net mvc +ExtJs 系列 3 ----数据访问层

    在上一篇中,我们已经搭建起了整个解决方案的项目,并且建好了数据库,完成了实体类和Nhibernate映射文件.在本文中,将定义数据访问接口,并利用Nhibernate实现接口,利用Spring.net ...

  6. SpringData核心数据访问接口--PagingAndSortingRepository

    PagingAndSortingRepository继承自CrudRepository接口,所以除了拥有CrudReposirory的功能外,他还增加了排序和分页查询的功能. 创建一个Maven项目, ...

  7. PP团队圣经巨著《Application Architecture Guide2.0》14章-数据访问层

    第十四章 数据访问层指导 概览 这一章主要描述设计数据访问层时要注意的主要原则.它们覆盖了设计数据访问层遇到的通常问题及错误.下面的图表展示了数据层怎样嵌入一个通用的应用架构. (cnblog我的图片 ...

  8. 转载:使用Spring进行数据访问(Data Access With Spring)

    Table of Contents 1.1. 统一的数据访问异常层次体系(Consistent Exception Hierarchy In Spring) 1.1.1. DAO模式的背景(Backg ...

  9. 十步优化SQL Server中的数据访问

    故事开篇:你和你的团队经过不懈努力,终于使网站成功上线,刚开始时,注册用户较少,网站性能表现不错,但随着注册用户的增多,访问速度开始变慢,一些用户开始发来邮件表示抗议,事情变得越来越糟,为了留住用户, ...

最新文章

  1. pyhton 中的字符串切片问题
  2. 【vue】使用localStorage解决vuex在页面刷新后数据被清除的问题
  3. FFmpeg滤镜使用指南
  4. Git使用方法——原创
  5. 从发小(一起长大的玩伴)聚会引发的思考
  6. 安卓线程相关 HandlerThread Handler Thread Looper Message Runnable
  7. Android中ExpandableListView控件基本使用
  8. 快速幂||取余运算【模板】(洛谷P1226题题解,Java语言描述)
  9. Python zipfile模块(压缩解压zip)
  10. Office CVE-2017-11882复现
  11. 用VS2013如何编写C语言
  12. Ajax学习笔记-get请求参数-3
  13. 网站建设的一般原则及网站推广技巧
  14. AVOD阅读笔记(一):摘要+特征提取----Aggregate View Obeject Detection network
  15. 在线图片托管服务imgur
  16. 让WIN2003和2008服务器iis支持安卓应用.apk文件下载的配置方法
  17. MQTT——服务质量Qos
  18. 小样儿老师:我的嵌入式学习之路(一)
  19. 图形驱动程序和显卡驱动什么区别_更新电脑显卡驱动有什么作用 更新电脑显卡驱动操作介绍【详解】...
  20. php 容器源码分析,Pimple运行流程浅析(PHP容器)

热门文章

  1. 注释的编写方式:写明白来龙去脉提高代码产出率
  2. LINUX学习笔记高度浓缩版之一 :用户管理、启动过程、硬盘管理
  3. 古怪的ConfigurationManager
  4. JustForex开始提供比特币和比特币现金支付方式
  5. HDU-1789-Doing Homework again
  6. java集合框架综述
  7. 【跃迁之路】【473天】刻意练习系列232(2018.05.24)
  8. nsq 源码分析之tcp协议部分
  9. centos 服务器安全优化细则
  10. 基于VMware vSphere 5.0的服务器虚拟化实践(9)