文章目錄
- 2.1串連MySql資料庫執行個體
- 2.2MySqlJDBC執行個體解析(ps:2011-11-17補充)
- 3.1串連oralce資料庫執行個體
- 3.2MyOracleJDBC執行個體解析
0.參考文獻
參考1:http://dustin.iteye.com/blog/44291
1.前言
測試資料庫是否正確串連時j2ee開發首先要做的事情,因為如果資料庫連接不正確,後期的錯誤就無法正確判定。所有得先排除資料庫連接錯誤。下面將詳細介紹一下mysql與oracle資料庫連接的測試程式
2.mysql資料庫連接執行個體
首先我們給出mysql資料庫連接的代碼執行個體,然後再通過這個代碼進行詳細解析,代碼執行個體如下:
2.1串連MySql資料庫執行個體View Code
import java.sql.Connection;import java.sql.DriverManager;import java.sql.ResultSet;import java.sql.Statement;public class MySqlJDBC { public static void main(String args[]) { try { /* * 方法一: 載入MYSQL JDBC驅動程式 */ // Class.forName("org.gjt.mm.mysql.Driver"); /* * 方法二: 載入MYSQL JDBC驅動程式 */ Class.forName("com.mysql.jdbc.Driver"); /* * 方法三:建立com.mysql.jdbc.Driver執行個體 */ // com.mysql.jdbc.Driver driver = new com.mysql.jdbc.Driver(); /* * 方法四:建立com.mysql.jdbc.Driver執行個體 */ // new com.mysql.jdbc.Driver(); System.out.println("Success loading Mysql Driver!"); } catch (Exception e) { System.out.print("Error loading Mysql Driver!"); e.printStackTrace(); } try { Connection connect = DriverManager.getConnection( "jdbc:mysql://localhost:3306/test", "root", "123456"); // 串連URL為 jdbc:mysql//伺服器位址/資料庫名 // 後面的2個參數分別是登陸使用者名稱和密碼 System.out.println("Success connect Mysql server!"); Statement stmt = connect.createStatement(); ResultSet rs = stmt.executeQuery("select * from userinfo"); while (rs.next()) { System.out.println(rs.getString("username")); } } catch (Exception e) { System.out.print("get data error!"); e.printStackTrace(); } }}
運行結果如下所示:
Success loading Mysql Driver!Success connect Mysql server!zhangsanlisi
2.2MySqlJDBC執行個體解析(ps:2011-11-17補充)
大家可能都看出個大概來了,我們只需要在調用DriverManager的getConnection方法之前,保證相應的Driver類已經被載入到 jvm中,並且完成了類的初始化工作就行了,而具體是怎樣實現這個功能卻是沒有講究的。上面四種方法都可以實現這個功能,因此程式可以正常運行。我們通常看到的都是使用方法二來載入Driver類到JVM中。這也是大多數教材中所採用的方法
但是經過我的測試,即使沒有將com.mysql.jdbc.Driver載入到JVM中,程式也能夠正常運行,程式如下所示:View Code
import java.sql.Connection;import java.sql.DriverManager;import java.sql.ResultSet;import java.sql.Statement;public class MySqlJDBC { public static void main(String args[]) { try { Connection connect = DriverManager.getConnection( "jdbc:mysql://localhost:3306/test", "root", "123456"); // 串連URL為 jdbc:mysql//伺服器位址/資料庫名 // 後面的2個參數分別是登陸使用者名稱和密碼 System.out.println("Success connect Mysql server!"); Statement stmt = connect.createStatement(); ResultSet rs = stmt.executeQuery("select * from userinfo"); while (rs.next()) { System.out.println(rs.getString("username")); } } catch (Exception e) { System.out.print("get data error!"); e.printStackTrace(); } }}
運行結果為:
Success connect Mysql server!zhangsanlisi
如果將程式中載入的mysql-connector-java-5.1.18-bin.jar去掉,再次運行程式報錯,錯誤如下所示:
get data error!java.sql.SQLException: No suitable driver found for jdbc:mysql://localhost:3306/test
報錯是正常的,後面oracle也會包類似的錯誤,這裡先列出來以便後面進行比較。
3.串連oracle資料庫執行個體
同樣,我們首先給出oracle資料庫連接的代碼執行個體
3.1串連oralce資料庫執行個體View Code
import java.sql.Connection;import java.sql.DriverManager;import java.sql.ResultSet;import java.sql.Statement;import oracle.jdbc.driver.OracleDriver;public class MyOracleJDBC { public static void main(String args[]) { try { /* * 方法一: 載入Oracle JDBC驅動程式 */ Class.forName("oracle.jdbc.driver.OracleDriver"); /* * 方法二:建立oracle.jdbc.driver.OracleDriver執行個體 */ //oracle.jdbc.driver.OracleDriver driver = new oracle.jdbc.driver.OracleDriver(); /* * 方法三:建立oracle.jdbc.driver.OracleDriver執行個體 */ //new oracle.jdbc.driver.OracleDriver(); System.out.println("Success loading Oracle Driver!"); } catch (Exception e) { System.out.print("Error loading Oracle Driver!"); e.printStackTrace(); } try { Connection connect = DriverManager.getConnection( "jdbc:oracle:thin:@localhost:1521:ORCL", "test", "test"); System.out.println("Success connect Oracle server!"); Statement stmt = connect.createStatement(); ResultSet rs = stmt.executeQuery("select * from userinfo"); while (rs.next()) { System.out.println(rs.getString("username")); } } catch (Exception e) { System.out.print("get data error!"); e.printStackTrace(); } }}
通過上述代碼我們發現和串連mysql資料庫的代碼執行個體相差不多。不同之處基本有連點,分別是:
- 載入的Driver名稱不同,oracle載入的Driver是oracle.jdbc.driver.OracleDriver,mysql載入的Driver是com.mysql.jdbc.Driver
- 串連資料的url不同,oracle串連資料庫url是jdbc:oracle:thin:@localhost:1521:ORCL,mysql串連資料庫url是jdbc:mysql://localhost:3306/test
注意點:在mysql資料庫下建立資料名叫做test,裡面建立了一張表叫做userinfo。而在oracle中則是在預設資料庫orcl中建立使用者test,在test使用者下建立表userinfo。
3.2MyOracleJDBC執行個體解析上述的三種方法同樣都能夠載入Driver。如果我們也像前面MySqlJDBC執行個體那樣不載入Driver會出現什麼情況呢。假設我們注釋掉所有載入Driver的語句,代碼如下所示:View Code
import java.sql.Connection;import java.sql.DriverManager;import java.sql.ResultSet;import java.sql.Statement;import oracle.jdbc.driver.OracleDriver;public class MyOracleJDBC { public static void main(String args[]) { try { Connection connect = DriverManager.getConnection( "jdbc:oracle:thin:@localhost:1521:ORCL", "test", "test"); System.out.println("Success connect Oracle server!"); Statement stmt = connect.createStatement(); ResultSet rs = stmt.executeQuery("select * from userinfo"); while (rs.next()) { System.out.println(rs.getString("username")); } } catch (Exception e) { System.out.print("get data error!"); e.printStackTrace(); } }}
再次執行此程式,會出錯,提示錯誤如下:
java.sql.SQLException: No suitable driver found for jdbc:oracle:thin:@localhost:1521:ORCL at java.sql.DriverManager.getConnection(DriverManager.java:602) at java.sql.DriverManager.getConnection(DriverManager.java:185) at edu.sjtu.erplab.jdbc.MyOracleJDBC.main(MyOracleJDBC.java:33)get data error!
這表示必須得先將oracle.jdbc.driver.OracleDriver載入到JVM中以後才能建立資料庫連接。
疑問:至今不明白為什麼mysql資料庫連接可以不需要 Class.forName("com.mysql.jdbc.Driver");4.上述測試案例中demo資料庫的user表
CREATE TABLE `userinfo` ( `userid` int(10) NOT NULL AUTO_INCREMENT, `username` varchar(20) DEFAULT NULL, PRIMARY KEY (`userid`)) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8;-- ------------------------------ Records of userinfo-- ----------------------------INSERT INTO userinfo VALUES ('1', 'zhangsan');INSERT INTO userinfo VALUES ('2', 'lisi');
5.org.gjt.mm.mysql.Driver 和com.mysql.jdbc.Driver的區別
從MysqlJdbc.java中我們看到有兩種方式載入MySql JDBC驅動程式,分別是
Class.forName("org.gjt.mm.mysql.Driver"); //方法一: 載入MYSQL JDBC驅動程式Class.forName("com.mysql.jdbc.Driver");//方法二: 載入MYSQL JDBC驅動程式
這兩種方法都能夠載入MYSQL JDBC驅動程式,那麼到底有何區別呢?其實org.gjt.mm.mysql.Driver是早期的MySQL JDBC驅動程式,但它不是MySQL公司的,後來MySQL將MM的JDBC驅動收為官方的JDBC驅動,並將其改名為com.mysql.jdbc.Driver,在最新版本的mysql jdbc驅動中,為了保持對老版本的相容,仍然保留了org.gjt.mm.mysql.Driver這個路徑的引用,但是實際上org.gjt.mm.mysql.Driver中調用了com.mysql.jdbc.Driver,因此現在這兩個驅動沒有什麼區別。
View Code
//org.gjt.mm.mysql.Driver的原始碼import java.sql.SQLException;/*** Here for backwards compatibility with MM.MySQL** @author Mark Matthews*/public class Driver extends com.mysql.jdbc.Driver {//~ Constructors//-----------------------------------------------------------/*** Creates a new instance of Driver** @throws SQLException* if a database error occurs.*/ public Driver() throws SQLException { super(); }}