带着萌新看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)) 最后一 ...
随机推荐
- leetcode刷题四<寻找两个有序数组的中位数>
给定两个大小为 m 和 n 的有序数组 nums1 和 nums2. 请你找出这两个有序数组的中位数,并且要求算法的时间复杂度为 O(log(m + n)). 你可以假设 nums1 和 nums2 ...
- 查看Android应用包名、Activity的几个方法
一.有源码情况 直接打开AndroidManifest.xml文件,找到包含android.intent.action.MAIN和android.intent.category.LAUNCHER对应的 ...
- 英语口语练习系列-C41-食物词汇-鹊桥仙
词汇 1, rice [raɪs] n. 稻:米饭 vt. 把-捣成米糊状 Rice: 米饭 | 大米 | 稻 2, bread [bred] n. 面包:生计 vt. 在-上洒面包屑 Bread: ...
- synchronized关键字的详细分析和代码实例
在Java中,一般都是通过同步机制来解决线程安全问题的,在JDK 5.0之后又新增了Lock的方式来实现线程安全.所以说实现线程安全方式一共有三种方法 方式一: synchronized(同步监视器) ...
- ES8 async/await语法
Async/await的主要益处是可以避免回调地狱(callback hell)问题 Chromium JavaScript引擎 从v5.5开始支持async/await功能,Chromium Jav ...
- 20175324 2018-2019-2 《Java程序设计》第5周学习总结
20175324 2018-2019-2 <Java程序设计>第5周学习总结 教材学习内容总结 抽象类和具体类的区别在于抽象类中有抽象方法而具体类中没有.且抽象类不能实例化. 接口:如果一 ...
- Linux 管理进程
探查进程 参数 描述 -A 显示所有进程 -N 显示与指定参数不符的所有进程 -a 显示除控制进程(session leader1)和无终端进程外的所有进程 -d 显示除控制进程外的所有进程 -e 显 ...
- Linux下如何查看定位当前正在运行的Nginx的配置文件
1. 查看nginx的PID,以常用的80端口为例: [root@xiaoyuer scripts]# netstat -lntup|grep 80 tcp 0 0 0.0.0.0:80 0.0.0. ...
- AI-逻辑回归函数、激活函数、损失函数
最近开始学习人工智能,先从基本的概念学起 逻辑回归函数(预测函数):z = dot(w,x) + b 解释:假设有三个特征,即x可以表示为(x1,x2,x3),w表示权重,对应每个特征的重要程度,b表 ...
- XLua----热更新
一.xLua 环境配置 1).Xlua中 Plugin Xlua复制到 需要热更新的工程中---->Assets子目录 2).开启宏HOTFIX_ENABLE File---->bui ...