带着萌新看springboot源码09(springboot+JdbcTemplate)
emmm.....常规开局,继续说一下废话,前面简单的说了一下spring的ioc容器创建原理(花了不少时间去看了别人的博客+查了不少资料+自己的理解),相信大家对ioc容器有了一个初步的认识了。
springboot学了这么久了,也该和数据库打打交道了。大家还记不记得,以前最初用spring和数据库打交道的一个东西,JdbcTemplate(就是对jdbc做了一个简单的封装,忘记了的小伙伴去看看别人的博客回顾一下),今天就用springboot如何使用JdbcTemplate和数据库交互以及基本原理,顺便看看源码。
还是由于我个人比较懒,我只用到Dao层,就实现一个add方法,再用一下测试方法;咳咳,不要在意细节。
1.新建一个springboot项目(web+mysql+jdbc+1.5xx版本)


2.配置数据源(也就是常说的连接池)
这里用默认的连接池(org.apache.tomcat.jdbc.pool.DataSource),后面可能会说说怎么用其他比较牛的连接池(比如阿里云的druid,这个都可以监控你给数据库发了什么sql,多长时间等,反正是很多很多的东西),暂时先用默认的。
配置文件配置(yml和properties都行,我用yml为例)

3.准备两个.sql文件(一个是建表的,一个是插入语句的)
这两个sql文件放进类路径下(就是java文件夹,resource文件夹,以及以前ssm框架编译之后webapp下的classes文件夹),这sql文件自己就可以做出来(利用navicat),我就以我的为例(navicat premium12),我的是试用版,还有几天就过期了..

之后的目录是这样的(注意:sql文件名称默认是有要求的;schema-all.sql是建表语句,data-all.是插入初识数据的语句)

好了,然后就可以写个Dao和数据库交互了,是不是贼快,嘿嘿。
下面进行测试,我这极其简陋的Dao

测试方法(记得测试的时候把数据库里面的表删除哦~还要mysql是打开状态的)


是不是很容易,大概的总结一下:准备两个sql文件丢到类路径下----------->yml配置数据源(连接池)--------------->写个Dao,然后测试
接下来,那么问题来了,为什么我这么简单的配置就能直接用了,不像以前xml配个数据源都要好半天,然后配置JdbcTemplate....好麻烦!
我以前说过,springboot看原理,入口在xxxAutoConfiguration。
在IDEA中,ctrl+N全局搜索DataSourceAutoConfiguration

最重要的就是这个初始化器干了什么,在此之前,可以打开那个properties类(DataSourceProperties),可以发现这就是一个和配置文件绑定的类,我们在yml文件里配置的数据源其实就是和这个类绑定的(可以直接在yml文件里属性那里ctrl+鼠标左键进入)

所以初始化器就是拿到ioc容器和我们配置的数据源信息,要去做点什么事,点进去看看(还记得监听器的原理吧,只要ioc容器发布事件,就会触发事件派发器去遍历所有的监听器,执行监听器里面的onApplicationEvent方法,我在spring ioc源码那里说了的)



我们再来看看runSchemaScripts方法是怎么找到sql文件的

我可以看看getScripts方法里面是怎么找sql文件的(由下图可知,sql建表文件默认规则:schema-all.sql或者schema.sql)

由于容器发布了事件,此监听器又会自动调用onApplicationEvent方法

进入runDataScripts方法,其实就跟上面一样,只是换了一个参数,把schema换成了data,所以插入数据的sql文件默认是在类路径下data-all.sql和data.sql

总结:自动配置类DataSourceAutoConfiguration启动---------->向容器里导入DataSourceProperties类(和我们写的yml绑定),DataSourceInitializer(本质就是一个监听器)------------->将DataSourceProperties类绑定属性值和ioc容器都传入监听器------------------>监听器内部有个初始化方法运行建表语句(通过路径拼接schema-all.sql和schema.sql拿到文件,利用用户名和密码连接数据库运行)----------->向数据库执行建表语句并且ioc容器发布事件---------------------->发布事件又会触发onApplicationEvent方法--------------------->利用用户名和密码执行插入数据的sql文件(内部也是先要进行路径拼接成类路径data-all.xml和data.xml,拿到文件)
·还有一点没说完,就是jdbcTemplate的原理。。。。。下节再说吧。。。
带着萌新看springboot源码09(springboot+JdbcTemplate)的更多相关文章
- 带着萌新看springboot源码8(spring ioc源码 完)
上一节说到实例化了所有的单实例Bean,后面还有一步遍历 12.完成容器刷新(finishRefresh();) 那个和生命周期有关的后置处理器类型是LifecycleProcessor:监听器原理我 ...
- 带着萌新看springboot源码05
上一节走了一遍从浏览器发出请求到得到向页面的流程,基本的功能是已经实现了.但是现在啊,我想自定义一个拦截器(拦截器可以做用户登录验证,如果登录了,就让你通过,如果没有登录,就重定向登录页面),这里就不 ...
- 带着萌新看springboot源码8(spring ioc源码上)
emmm.....这次先不说springboot原理,先好好回顾一下以前的注解版spring原理,先把spring原理了解清晰了,再看springboot原理更容易. 要说起spring,最重要的就是 ...
- 带着萌新看springboot源码03
上一节讲到了快速新建一个springboot应用,以及springboot的自动配置类起作用的时机,并且一起看了一个自动配置类的源码. 这一节我们来粗略看看当用户在浏览器输入一个url,怎么样返回一个 ...
- 带着萌新看springboot源码12(启动原理 下)
先继续接上一篇,那个启动原理还有一点没说完. 6. afterRefresh(context, applicationArguments); 看这个名字就知道,应该就是ioc容器刷新之后的一些操作了, ...
- 带着萌新看springboot源码11(springboot启动原理 源码上)
通过前面这么多讲解,springboot原理应该也大概有个轮廓了,一些基本的配置,从客户端url到controller(配置一些要用的组件,servlet三大组件,处理器映射器,拦截器,视图解析器这些 ...
- 带着萌新看springboot源码10(springboot+JdbcTemplate+druid)
上一节把springboot和jdbcTemplate大概用法说了一下,以及大概看了一下源码,还说了加载sql文件时的原理. 这一节来看看自动注入JdbcTemplate的原理,顺便用一用Druid数 ...
- 带着萌新看springboot源码04
继续开头说些废话,我也不知道什么鬼,每次写着写着经常会写到其他地方去了,太容易分神了. 这次说一下springboot对于springmvc的大概整个流程,以请求动态网页为例 . 1.梳理一下spri ...
- 带着萌新看springboot源码8(spring ioc源码下)
继续接着上一节,到了第六步(温馨提醒,内容有点小多,不过看完ioc原理就差不多了) 6.注册Bean后置处理器(registerBeanPostProcessors(beanFactory)) 最后一 ...
随机推荐
- 记录以下docker的基本命令
docker search xxx(tag) 在OFFICIAL上ok的是官方镜像 这里也可以去dockerhub上面看到 搜索xxx镜像docker images查看本地所安装的 ...
- C#代码总结01---如何清空页面上所有文本框的内容。(用于录入后的清空)
/// <summary> /// 清空页面上所有TextBox的内容.用于录入后的清空 /// </summary> /// <param name="top ...
- LevelDB C API 整理分类
// 结构体列表 typedef struct leveldb_t leveldb_t; // 数据库 typedef struct leveldb_cache_t leveldb_cache_t; ...
- String.matches()的用法
https://blog.csdn.net/victoryckl/article/details/6930409
- 基于.net的Socket异步编程总结
最近在为公司的分布式服务框架做支持异步调用的开发,这种新特性的上线需要进行各种严格的测试.在并发性能测试时,性能一直非常差,而且非常的不稳定.经过不断的分析调优,发现Socket通信和多线程异步回调存 ...
- 180815 Python自学成才001
1.为什么学习Python? Python:脚本语言,易入门,可移植. Python适用范围:web开发.自动化测试工具编写. 适用岗位:运维开发(运维).自动化测试(软件测试).Python开发(软 ...
- Java之hashCode的作用和equals方法的重构规则
这个是博主对hashcode的初步理解,以后加深了会再来更新: 1.hashcode是什么? hashcode是对象的散列码,不同的对象几乎不一样,说几乎是因为还是可以一样的. 特点:每一个对象都有h ...
- 面试题5-[剑指offer] 二维数组中的查找
题目 在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序.请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数. ...
- Filter(过滤器)
一.Filter简介 Filter也称之为过滤器,它是Servlet技术中最激动人心的技术,WEB开发人员通过Filter技术,对web服务器管理的所有web资源:例如Jsp, Servlet, 静态 ...
- [微信小程序]编译.wxss出错,2 not found
小程序新建项目就出错:2 not found 编译.wxss文件出错(不是一般的郁闷,新建项目就报错...) 大概的情况是开发工具没有更新.或更新不到, 第一,可以删掉开发工具重新下载最新安装: 第 ...