带着萌新看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)) 最后一 ...
随机推荐
- 处理Python2.7读写文件中的中文乱码问题
1.设置默认编码 在Python代码中的任何地方出现中文,编译时都会报错,这时可以在代码的首行添加相应说明,明确utf-8编码格式,可以解决一般情况下的中文报错.当然,编程中遇到具体问题还需具体分析啦 ...
- windows下编译SDL1.2
首先,官网下载开发库,我这里用的是tdm-gcc,因此下载mingw版的. 解压,写代码,编译…… 成功!...地出错了 这里提一下,编译命令是 g++ test.cpp -I include目录 ...
- 实现logstash6.4.3 同步mysql数据到Elasticsearch6.4.3
本文旨在实践把mysql已有的数据同步到elasticsearch中,使用的版本是6.4.3,对于其它6.x版本理应是一样的处理方式. 本文目录: 1.初始化Elasticsearch 6.4.3 1 ...
- iOS 获取app进程被杀死事件
程序被用户双击上滑杀死后,就对app做一些特殊的处理 下面的方法可以获取到用户双击上滑杀死的事件 - (void)applicationDidEnterBackground:(UIApplicatio ...
- Python面向对象编程指南
Python面向对象编程指南(高清版)PDF 百度网盘 链接:https://pan.baidu.com/s/1SbD4gum4yGcUruH9icTPCQ 提取码:fzk5 复制这段内容后打开百度网 ...
- css中文字体解决方案
html { font-family: -apple-system, "Noto Sans", "Helvetica Neue", Helvetica, &qu ...
- Android APT
APT APT(Annotation Processing Tool)是一种处理注释的工具,它对源代码文件进行检测找出其中的Annotation,使用Annotation进行额外的处理. Annota ...
- 不会git的程序员,会不会被鄙视?
昨天一朋友在微信上问了我一个问题,我觉得很有趣,于是将本次聊天的内容分享给大家. 我朋友说,如果一个程序员不会使用 git,会不会被别人觉得低一个档次? 事先声明啊,这与公司技术栈无关,不要说有些公司 ...
- python-简单邮件报警
在scrapy爬虫项目中经常遇到 爬取数据时报错无法及时处理 导致数据爬取不完整 只能先查看log才能发现报错 首先写一个简单的邮件发送模块 """ @file: ema ...
- Ajax实现聊天室
Ajax实现聊天室 运行效果如下: 代码显示: var net=new Object();//编写构造函数net.AjaxRequest=function(url,onload,onerror,met ...