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)的更多相关文章

  1. 带着萌新看springboot源码8(spring ioc源码 完)

    上一节说到实例化了所有的单实例Bean,后面还有一步遍历 12.完成容器刷新(finishRefresh();) 那个和生命周期有关的后置处理器类型是LifecycleProcessor:监听器原理我 ...

  2. 带着萌新看springboot源码05

    上一节走了一遍从浏览器发出请求到得到向页面的流程,基本的功能是已经实现了.但是现在啊,我想自定义一个拦截器(拦截器可以做用户登录验证,如果登录了,就让你通过,如果没有登录,就重定向登录页面),这里就不 ...

  3. 带着萌新看springboot源码8(spring ioc源码上)

    emmm.....这次先不说springboot原理,先好好回顾一下以前的注解版spring原理,先把spring原理了解清晰了,再看springboot原理更容易. 要说起spring,最重要的就是 ...

  4. 带着萌新看springboot源码03

    上一节讲到了快速新建一个springboot应用,以及springboot的自动配置类起作用的时机,并且一起看了一个自动配置类的源码. 这一节我们来粗略看看当用户在浏览器输入一个url,怎么样返回一个 ...

  5. 带着萌新看springboot源码12(启动原理 下)

    先继续接上一篇,那个启动原理还有一点没说完. 6. afterRefresh(context, applicationArguments); 看这个名字就知道,应该就是ioc容器刷新之后的一些操作了, ...

  6. 带着萌新看springboot源码11(springboot启动原理 源码上)

    通过前面这么多讲解,springboot原理应该也大概有个轮廓了,一些基本的配置,从客户端url到controller(配置一些要用的组件,servlet三大组件,处理器映射器,拦截器,视图解析器这些 ...

  7. 带着萌新看springboot源码10(springboot+JdbcTemplate+druid)

    上一节把springboot和jdbcTemplate大概用法说了一下,以及大概看了一下源码,还说了加载sql文件时的原理. 这一节来看看自动注入JdbcTemplate的原理,顺便用一用Druid数 ...

  8. 带着萌新看springboot源码04

    继续开头说些废话,我也不知道什么鬼,每次写着写着经常会写到其他地方去了,太容易分神了. 这次说一下springboot对于springmvc的大概整个流程,以请求动态网页为例 . 1.梳理一下spri ...

  9. 带着萌新看springboot源码8(spring ioc源码下)

    继续接着上一节,到了第六步(温馨提醒,内容有点小多,不过看完ioc原理就差不多了) 6.注册Bean后置处理器(registerBeanPostProcessors(beanFactory)) 最后一 ...

随机推荐

  1. js中常用的正则表达式总结

    去除所有空格: str = str.replace(/\s+/g,""); 去除两头空格: str = str.replace(/^\s+|\s+$/g,"") ...

  2. Android全平台书籍

    <Android Database Programming>:全书研究Android平台下的数据库技术. <Android Application Programming with ...

  3. 通过源码理解HashMap的并发问题

    最近在学习有关于Java的基础知识,在学习到HashMap的相关知识的时候,了解了HashMap的并发中会出现的问题,在此记录,加深理解(这篇文章是基于Java1.7的,主要是为了更加直观,更新版本的 ...

  4. BZOJ1386 : [Baltic2000]Stickers

    显然每一位的限制独立,对于每一位求出仅限制该位下的最大数,然后求最小值即可. 假设当前要求数字$d$的答案: 考虑填数字的过程,可以看作依次考虑一个序列中的每个数,当前缀和$<0$时退出. 设$ ...

  5. [NodeJs Windows编译学习]

    https://blog.csdn.net/gesturexiaoxin/article/details/80162944

  6. MUI消息推送

    一.push通过H5+实现 简单实现方式:通过轮询服务器是否有新消息推送过来 mui.plusReady(function() { plus.navigator.closeSplashscreen() ...

  7. node06

    1.数据库: server端:数据存在 client端:管理工具,node mysql内有两个单位: 库:类似文件夹,容纳表 表:存储数据 行:一条数据 列(字段,域):一个数据项 主键:数据的唯一标 ...

  8. 30、vue 过滤器(filters)

    filter Vue.js 允许你自定义过滤器,可被用于一些常见的文本格式化.过滤器可以用在两个地方:双花括号插值和 v-bind 表达式 (后者从 2.1.0+ 开始支持).过滤器应该被添加在 Ja ...

  9. Jmeter之Non HTTP response code: java.net.SocketException/Non HTTP response message: Permission denied: connect

    最近在做性能测试过程中遇到了高并发时,后台监控各项指标都很正常,但是测试结果中很多Non HTTP response code: java.net.SocketException/Non HTTP r ...

  10. 让webstorm里提示nodejs智能补全

    webstorm里是默认没有nodejs只能提示的, 比如,输入requ到现在还不提示出require这个函数名,非常不方便. 设置方式: file  --> setting -->edi ...