jsp中加載jdbc驅(qū)動:
成都網(wǎng)站建設(shè)、網(wǎng)站設(shè)計的關(guān)注點不是能為您做些什么網(wǎng)站,而是怎么做網(wǎng)站,有沒有做好網(wǎng)站,給成都創(chuàng)新互聯(lián)一個展示的機會來證明自己,這并不會花費您太多時間,或許會給您帶來新的靈感和驚喜。面向用戶友好,注重用戶體驗,一切以用戶為中心。
Java加載JDBC的實現(xiàn)方法:
通過調(diào)用Class.forName()方法可以顯式地加載一個驅(qū)動程序。該方法的入口參數(shù)為要加載的驅(qū)動程序。例如:Class.forName("sun.jdbc.odbc.JdbcOdbcDriver")語句加載了SUN 公司開發(fā)的JDBC-ODBC 橋接器。對數(shù)據(jù)庫進行連接的時候,驅(qū)動管理器(DriverManager)會使用這個被加載的驅(qū)動程序。通過DriverManager 的getDriver()方法可以獲得已經(jīng)加載的驅(qū)動程序信息。程序代碼要求:
1.編寫useDBDriver 類的基本框架,在該類中僅包括main()方法,在main()方法中加載驅(qū)動程序。
2.程序代碼如下:
public class useDBDriver
{
public static void main(String arg[])
{
try
{
//初始化并加載JDBC-ODBC 驅(qū)動程序
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
Enumeration enum=DriverManager.getDrivers();
//顯示驅(qū)動程序信息
while(enum.hasMoreElements())
{
System.out.println(enum.nextElement());
}
//處理加載數(shù)據(jù)庫中可能出現(xiàn)的異常
}
catch(java.lang.Exception exec)
{
System.out.println("加載數(shù)據(jù)庫驅(qū)動程序出現(xiàn)異常");
}
}
}
3.因為程序中使用了JDBC 類和Enumeration 類,所以要引入的包有:
import java.sql.*;
import java.util.*;
三種加載方式
1.Class.forName(“com.mysql.jdbc.Driver”);
2.DriverManager.registerDriver(new com.mysql.jdbc.Driver())
3.System.setProperty(“jdbc.drivers”,”com.mysql.jdbc.Driver”);
你這個程序是一個stand alone的程序,所以你把mysql-connector-java-5.0.5-bin.jar放到tomcat/common/lib目錄下肯定是不對的。放到j(luò)re/lib/ext也不一定會加載。如果你用IDE開發(fā)的話,在Classpath中把mysql-connector-java-5.0.5-bin.jar添加進去執(zhí)行就OK了,如果不是的話,你需要在執(zhí)行的時候這么寫(比如你放到d:\)
java -cp d:\mysql-connector-java-5.0.5-bin.jar data
可能你還沒有理解什么是 JDBC, 個人感覺 JDBC 就像是一個協(xié)議,規(guī)定了一些具體的接口和方法,而 JDBC 的驅(qū)動,也就是你說的具體到每個數(shù)據(jù)庫的驅(qū)動程序,是對這個協(xié)議的具體實現(xiàn)。
1. 這個驅(qū)動是怎樣加載的? 直接實例化,但是并沒有使用這個對象呀!驅(qū)動加載到哪兒了?
驅(qū)動不是在實例化的時候加載的,你知道連接數(shù)據(jù)庫的時候會使用
Connection?con?=?DriverManager.getConnection(String?uri);
如果你看 DriverManager 的源碼就會發(fā)現(xiàn),它會先跟句 uri (就是 每個數(shù)據(jù)庫不同的一個字符串,也可以說是特定數(shù)據(jù)庫的 key) 去得到具體的驅(qū)動名稱和 Class 的名字,然后使用 ClassLoader 加載這個驅(qū)動類。至于 ClassLoader 怎么找到 ClassPath 下面的類,這是另外一個故事了。
2. 并且我試著把加載驅(qū)動的代碼去掉,依然可以連接數(shù)據(jù)庫讀取數(shù)據(jù)沒有錯誤,這個驅(qū)動的生存期是怎樣的?
因為你去的不是加載的地方。這個驅(qū)動存在于每次你獲取 connection 的時候,也就說每次你跟數(shù)據(jù)庫的互動(增刪改查),都需要這個驅(qū)動類參與。
3. 加載SQLServer的驅(qū)動是這樣寫,還可以直接new
com.microsoft.sqlserver.jdbc.SQLServerDriver();
try?{????Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");}?catch?(ClassNotFoundException?ex)?{????System.err.println(ex.getMessage());}
為什么大家這樣寫,這是直接先把這個類加載啦,但是獲取連接的時候還是會去加載,至于 Java 虛擬機是不是重新加載,這又是另外一個故事啦。
所以,寫不寫這個都行,因為這不是必須的步驟。
建議看看 JDBC (??)的定義,看看 DrvierManager 源碼。一切都在代碼里。
Java語言本身只提供了數(shù)據(jù)庫連接和操作接口,而實現(xiàn)這些接口的就是數(shù)據(jù)庫廠商了,所以每次你要連接數(shù)據(jù)庫就必須下載對應(yīng)數(shù)據(jù)庫廠商的JDBC驅(qū)動,也就是接口實現(xiàn)程序。這個需要持久的預設(shè)環(huán)境,就是你必須告訴你的程序你的接口實現(xiàn)程序在哪。也就是哪個jdbc驅(qū)動程序的包在哪,java程序在連接數(shù)據(jù)庫之前需要通過反射機制創(chuàng)建jdbc驅(qū)動程序包中的所有類。