[疯狂Java]JDBC:加载数据库驱动、连接数据库

本文详细介绍了Java中加载数据库驱动的原理,包括为何需要加载驱动、Class.forName方法的作用以及数据库厂商的驱动类命名。此外,还讨论了JDBC如何通过DriverManager管理加载后的驱动并建立数据库连接,强调了单例模式的应用,以及getConnection方法的参数和返回值。最后给出了一个完整的加载驱动并建立连接的代码示例。
摘要由CSDN通过智能技术生成

1. 加载数据库驱动:

    1) 由于Java是一个纯面向对象语言,任何事物在其中都必须抽象成类或者类对象,数据库也不例外,JDBC同样也把数据库抽象成面向对象的结构;

    2) JDBC将整个数据库驱动器在底层抽象成一个对象(即驱动器对象),所有对数据库的操作都可以通过该对象进行;

    3) 只不过数据库驱动对象和普通的Java对象有所不同:

         i. 首先大多数普通的Java对象都是运行该Java程序前不存在的,而是运行的时候临时创建的,程序退出后这些对象也随之释放;

         ii. 但数据库不一样,数据库往往是不依赖程序运行的,数据库通常都是24小时持续运行,只不过应用程序可以访问它而已,因此数据库对象不能像普通对象那样从无到有地“创建”;

         iii. 也就是说一个在应用程序运行之前就已经存在并且正常运行的数据库实例如何在Java程序中访问呢?

    4) 加载数据库驱动的方法:

         i. 加载数据库驱动其实就是将操作系统中正在运行的数据库进程(实例)转化成Java对象供Java程序使用(操作数据库);

         ii. 这里首先要了解以下类驱动器的概念:

             a. 其实在Java中任何类(Object、String等)想要正常运行,底层都要有相应的驱动器驱动它;

             b. 但是我们平时看不出来这些类对象需要什么驱动器驱动啊!那是因为这些基础类的驱动器就是JVM虚拟机本身,其驱动的加载是在底层伴随着JVM的启动进行的,都对用户隐藏起来了,所以你看不到;

             c. 而那些不依赖虚拟机驱动的程序(比如非常典型的就是数据库程序、大多数图形程序,基本都是用C/C++编写,肯定不能靠JVM驱动)想在Java中访问就必须自己手动编写加载驱动器的代码了!!

         iii. 手动加载类的驱动器——使用Class类的forName静态方法:static Class<?> Class.forName(String className);

             a. className就是那个不依赖JVM驱动的外部进程的Java类名,这个类名必须符合Java命名规则,例如“com.xxx.Xxx"之类的;

             b. 你在Java中访问外部进程(将外部进程抽象成Java类或者对象)还一定要有Java类名?那这个类名是不是要事先就准备好咯?

             c. 是的!并不是任何外部进程都可以被Java访问,想要被Java访问就必须让那个程序自己准备好被Java调用的接口,并事先命名好Java类名才行,而程序准备好的Java接口就是该程序的Java驱动器(让JVM控制程序行为的东西就是Java驱动器);

             d. 因此数据库厂商必须自行别写好数据库的Java驱动器(称作数据库Connector,即连接器,用于和Java程序连接),并准备好类名,好让Class.forName加载它;

         iv. forName的加载原理:

             a. 首先任意一个提供Java接口的程序都会拥有一个Java类名(加载到JVM中就是用该类名来访问该程序实例的);

             b. 这样的程序运行后,这个Java类名就会被记录到改程序的进程信息中(而改程序的Java接口(驱动器)的句柄也会被记录到进程信息中);

             c. forName传入该类名以后就会到操作系统的进程表中查找具有该Java类名的线程;

             d. 找到对应的进程后就会找到该进程对应的Java驱动,然后将该驱动加载进JVM;

             e. 之后就可以在Java程序中通过这个类名(或者对象)来调用该进程的功能,或者访问进程中的数据了;

    5) 数据库厂商对驱动类名的命名:

         i. 厂商之间各不相同,而且也没有规律可循,因此必须要查阅相应厂商的JDBC手册才能知道;

         ii. MySQL的命名:com.sql.jdbc.Driver

         iii. Oracle的命名:oracle.jdbc.driver.OracleDriver

         iv. 从命名的包路径来看,各个厂商驱动的实现差异较大;

!因此MySQL数据库的加载就是:Class.forName("com.sql.jdbc.Driver");

    6) 准备好数据库连接器:

         i. 必须事先将数据库的JDBC-Connector加入到CLASSPATH路径当中,Connector由数据库厂商提供,而MySQL的JDBC-Connector文件是mysql-connector-java-版本号-bin.jar;

         ii. 原因很简单,数据库的JDBC驱动必须要运行起来才能起到作用,在Java中就是要运行该类,而运行一个类首先会想到命令"java 要运行的类的类名“了,既然要直接执行该命令,那就必须得将目标类的路径添加到CLASSPATH中去才行,因此必须先将上面讲的jar包添加到CLASSPATH路径中去才行;

         iii. 在Eclipse中这样设置:window -> preferences -> java -> install jres -> 选中当前采用的JRE点击edit -> add external jars -> 选择jar包路径保存即可;


2. JDBC如何管理加载后的数据库驱动——用DriverManager建立连接:

    1) forName加载完类后如果发现这是一个数据库类的驱动那就会做一定的特殊处理了;

    2) JDBC专门(注意!“专门”)用DriverManager类来管理数据库驱动!也就是说DriverManager类是专门用来管理JDBC驱动的!不要因为类命中没有出现JDBC之类的字眼就认为该类还可以管理其它驱动!不!DriverManager只用来管理JDBC驱动!

    3) 加载后的驱动会被抽象成Java类型的对象保存在DriverManager的静态变量driver中;

    4) JDBC规定,一个Java进程只能同时持有(最多持有)一个JDBC驱动,也就是说上述的driver在加载后就有且仅有它一个了,也就是说你一次只能持有一个数据库对象,这就不允许你一个Java进程同时连多个数据库了;

    5) 还有一点要强调的是,数据库访问跟HTTP协议的原理一样,都是基于连接的,即查询数据库前必须现建立连接,连接上了以后可以进行多次查询,最后查询完毕后关闭连接才算一次完整的数据库操作,而这里的要素是什么?

         i. 那就是一个进程同时(最多)只能建立一个连接;

         ii. 这是很显然的,一个进程就代表一个用户,这和HTTP一样,一个用户不能同时向一个服务器建立两个连接,即同一个人要建立第二个连接除非是第一个连接已经断开(上一次服务已经结束);

         iii. 因此加载后的驱动器driver是受到同不监视的,即driver是一个同步监视器!

    6) 可以看一下DriverManager的getConnection方法,它利用driver来建立和数据库的连接(就跟HTTP中客户端和服务器端建立连接一样一样滴),它是一个同步方法!

public static synchronized Connection DriverManager.getConnection(String url, String user, String passwd);
!driver是DriverManager的静态对象,该方法是同步方法,因此driver在该方法中就是同步监视器了;

!!可以看到这样的结构就是单例模式,JDBC让一个进程最多只能得到一个数据库驱动器!

    7) 看一下getConnection的参数和返回值:

         i. url:要访问的数据库往往都是在远程(处在某个网络节点中),因此需要对数据库进行定位;

            a. 这个url的写法有讲究,不同数据库的写法不一样,需要参考数据库的JDBC手册;

            b. 但是JDBC标准还是规定了该URL的框架,其格式是:jdbc:数据库品牌:具体定位信息(该部分各数据库有差异)

            c. MySQL的写法:jdbc:mysql://hostname:port/具体数据库名,例如"jdbc.mysql://192.23.21.9:8889/student_data

         ii. user和passwd代表用户名和登陆密码,这都是数据库管理员分配的;

         iii. 返回值是一个Connection对象,该对象表示Java程序和数据库所建立的一个屋里连接会话,之后可以通过Connection对象和数据库进行交流(操作数据库);

    8) 建立连接的示例:Connection conn = DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/select_test", "root", "1234");


3. 一个完整的加载驱动建立连接的代码:

Class.forName("com.mysql.jdbc.Driver");
Connection conn = DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/select_test");
// 利用conn和数据库交流


     

  • 6
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值