知识小罐头02
Posted wyq1995
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了知识小罐头02相关的知识,希望对你有一定的参考价值。
萌新科普文
这次来简单说说mysql驱动,不要用了这么久的框架,突然被人问起什么叫做mysql驱动、内部怎么工作的啊,你却突然的不知道了,那就尴尬了。
注:最好用jdk1.6(这个看DriverManager源码一目了然),mysql驱动嘛,不要用太高版本了,版本越高封装的越彻底,不利于萌新看底层原理。
然而我并没有装1.6,于是我就到处找了一些材料加上我自己找的一些代码凑数啊!(继续偷懒。。。。)
大家是不是对于mysql,oracle,SQL Server,DB2等数据库的其中一种或者几种用法很是熟悉了,很多的框架都会用到。
以mysql为例,在java中连接数据库,最开始是用jdbc,想必大家对下面这几句代码很是熟悉了。
首先是加载mysql驱动,然后是获取连接,很初级的代码。
我最开始学jdbc的时候,我就纳闷了!为什么要加载驱动,驱动又是什么鬼啊?反正就只知道要想连接数据库就要下载个驱动。
那个DriverManager是哪里来的啊?还有,这样就获取连接了,为什么这个方法就能获取连接啊?
这种问题最是让初学者困惑不已(我就是这样的,嘿嘿)。
其实吧,用大白话说一下,就是java里面提供了一个接口(java.sql.Driver)用于和任意的数据库连接,而mysql数据库开发商此时看到java这么火就要默默的写个实现类(就是所谓的数据库驱动),去实现这个接口,不然java语言用不了你这个数据库(那数据库的推广就会受到限制,赚的钱就少了嘛!)。
而java中还会有一个类DriverManager,顾名思义,就是来管理别人传过来的Driver类(里面肯定有个属性是一个容器,通过类似set作用的方法把Driver的实例存起来,供其他的方法使用),这就是口述版mysql驱动的原理。
下面来看看源码,分析分析。
打开上图的第一个标记
现在打开registerDriver方法,看看是怎么包装Driver实例的(jdk1.6)。
也可以看看jdk1.8的
我们来看看DriverInfo里面有哪些属性
(jdk1.6)是不是发现还有一个initialize方法啊,其实这个方法简单说一下,就是遍历所有的数据库驱动(实现了java.sql.Driver的实现类),并用系统类加载器去加载。还有,在,图上还有一个writeDrivers(就是负责注册驱动)和readDrivers(注册成功的驱动复制到这里,后面要我们要用就直接来这里取);
因为其中涉及的东西太细了,就粗略说一下,感兴趣的小伙伴可以自己进去仔细研究啊!
jdk1.8就不去看了,里面变化了很多算法什么的,但是大概的逻辑还是这样的。
接下来,看看怎么通过DriverManager的静态方法去获得connection(这里我把很多判断性的代码删除了,留下一些基本逻辑)。
到达这里,就差不多了,本质就是去实现类里面看实现类的connect方法,是怎么通过传递过去的过去的url、用户名、密码,最后返回给我们connection对象。
打开这个父类,看connect方法里面大概的做法
emmmm....后面的太多了,要分析太涉及底层了,我把大概的逻辑说一下吧!就是通过socket(内部封装了io流)去链接mysql 服务端(进行三次握手),并进行用户名和密码的校验,以及一些数据加密的工作等等, 想仔细了解的小伙伴可以自己翻看源码。
其实,还有很多的东西,比如后面的预编译啊什么原理啊,还没说呢,咳咳,毕竟是一个给萌新科普的随笔,就不说多了,哈哈,偷个懒!
到这里,萌新们是不是对mysql驱动了解了一点啦!
继续说废话(嘿嘿~):学东西要学本质才能印象深刻啊,不然睡一觉之后就忘了!比如学mysql驱动,本质就是io流+socket+类+一些基本逻辑的处理;就比如学javase的容器(list,set.,map),本质就是Object数组和类的组合嘛!再加一些扩容等条件的判断以及一些算法,最后就叫做容器;
以上是关于知识小罐头02的主要内容,如果未能解决你的问题,请参考以下文章