JDBC:加载数据库驱动、连接数据库(详细讲解)
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命名规则,例如“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;java类的概念
ii. 原因很简单,数据库的JDBC驱动必须要运⾏起来才能起到作⽤,在Java中就是要运⾏该类,⽽运
⾏⼀个类⾸先会想到命令"java 要运⾏的类的类名“了,既然要直接执⾏该命令,那就必须得将⽬标类的路径添加到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(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/具体数据库名,例如"sql://192.23.21.9:8889/student_data
ii. user和passwd代表⽤户名和登陆密码,这都是数据库管理员分配的;
iii. 返回值是⼀个Connection对象,该对象表⽰Java程序和数据库所建⽴的⼀个屋⾥连接会话,之后可以通过Connection对象和数据库进⾏交流(操作数据库);
8. 建⽴连接的⽰例:Connection conn = Connection("jdbc:mysql://127.0.0.1:3306/select_test", "root", "1234");
3. ⼀个完整的加载驱动建⽴连接的代码:
Class.forName("sql.jdbc.Driver");
Connection conn = Connection("jdbc:mysql://127.0.0.1:3306/select_test"); // 利⽤conn和数据库交流
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论