带着萌新看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的原理。。。。。下节再说吧。。。