JDBC个人理解

关于JDBC的一些学习

JDBC误区

之前自己一直以为JDBC是一个jar包,有次下班同事问我你知道JDBC是啥不,我脱口而出,jar包,其实并不是的,官方来说是一个面向关系型数据库的,用自己的话来讲感觉就是一个封装起来的框架,用于不同的数据库,比如mysql,orcale,你总不能用一个数据库就写一套吧,优点就是方便。

JDBC驱动程序类型

  1. JDBC-ODBC桥 ,简单来说就是驱动把JDBC的传给ODBC,然后ODBC去调用数据库厂商提供的数据库,也就是操作二进制代码库,一般是.dll结尾的文件;
  2. 本地API驱动:就是通过驱动加载数据库厂商提供的本地数据库;
  3. 网络协议驱动,驱动使用套接字去调用中间件,后续转成API使用;
  4. 本地协议驱动,使用socket,直接在客户端和数据库之间通信,这个有点像驱动的两个架构,第一个是双层架构,直接进行通信。第二层是三层架构,其实就是多了一个中间层,也正是因为这个中间层,让Java语言得到了更好的使用;

JDBC编程

接下来就到了写代码的时候了,总是说一些理论知识,其实我也是似懂非懂,创建一个空项目,就开始研究吧!
1.pom依赖我用的是

        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
        <version>5.1.47</version>
    </dependency>

2.加载驱动,注册驱动
在我同事的安利下,我突然想了解一下JDBC,他看到我准备学习JDBC,直接上来咔咔给我写一个注册驱动,并给我分享了一个知识
在这里插入图片描述在我们平时写JDBC那六步中就没有注册驱动这一行代码,但是注册驱动肯定是必须的,然后同事给我点进了Driver类,在这里插入图片描述在实例化Driver的时候,他回去调用静态代码块,直接就给注册驱动了。

3.学JDBC已经是三年前的事儿了,学的也不深入,然后我又跟着网上步骤去写。
加载驱动:Class.forName("com.mysql.jdbc.Driver");
然后我就好奇这个forName方法,那就点进去看看呗
在这里插入图片描述其实这些东西对我来说都是未知的,因为我之前从来不点进去看这些,看不懂还懒得钻研。
首先说这个注解@CallerSensitive,是因为下面一行代码Reflection.getCallerClass()方法调用所在的方法必须用@CallerSensitive进行注解,这样它在加载类的时候会跳过所有加了这个注解的方法,就是避免它扫描到自身。

其次说说这个方法Reflection.getCallerClass()
在这里插入图片描述点进去之后发现是一个加了native关键字的方法,加了native关键字就是证明没在该类实现,是在C++文件实现的方法

接着研究返回的值,forName0(className, true, ClassLoader.getClassLoader(caller), caller);
这个forName0就是当前封装的一个方法,这个方法也是加了native关键字的,看不了实现,这里面有一个眼熟的代码ClassLoader,类加载器。那就看一下类加载器的内容吧,之前学的内容早就丢了。

类加载器三种类型:
1.bootstrap class Loader
2.extension class Loader 扩展类加载器
3.application class Loader ,用户类路径的方法就是这个加载类加载的,这个也可以我们自定义
类加载器是有优先级的,他的优先级就是我写的顺序

上面说到这个方法Reflection.getCallerClass(),调用这个方法是需要权限的,而用户自定义的是没有权限调用这个方法的。
以上这些都是加载驱动了解到的内容,接下来就开始第二步,获取数据库连接

DriverManager.getConnection("jdbc:mysql:///test","root","root");

老规矩点进去方法看一看
在这里插入图片描述单纯的获取连接,传账号密码的的时候,会把值传给参数,这个info 感觉有点怪怪的,进去看看,在这里插入图片描述实例化的时候是没有值的,上面的注释也说了,创建一个属性值为空的列表,初始化的时候,如果没有账号,密码,那这个info就始终是null。

看看返回的getConnection()方法在这里插入图片描述

可以看到精髓就是遍历了registeredDrivers,然后从中获取账号密码来得到连接结果。
在这里插入图片描述
registeredDrivers是一个复制写入集合,在原有的有的情况下,不会变动原有数据,会再复制一份,放入副本,修改完的副本再去代替原有数据,这样不会影响读的问题。

isDriverAllowed就是对于mysql连接jar进行加载。

第三步:创建statement对象

     connection.createStatement();

创建完对象,就可以写sql,然后执行了。以上就是对JDBC的个人理解。


版权声明:本文为weixin_46021272原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。