新聞中心
Hibernate、TopLink等OR Mapping操作數(shù)據(jù)庫的技術(shù)都是建立JDBC技術(shù)之上的,實(shí)際來說,他們的性能和JDBC是有很大差距的,但反過來說,如果JDBC用不好,還不如hibernate呢。暫且不說這些孰優(yōu)孰劣的話了,再次主要是對Java的基礎(chǔ)技術(shù)做個(gè)總結(jié),以加深認(rèn)識(shí)。

專注于為中小企業(yè)提供成都網(wǎng)站設(shè)計(jì)、網(wǎng)站建設(shè)服務(wù),電腦端+手機(jī)端+微信端的三站合一,更高效的管理,為中小企業(yè)??诿赓M(fèi)做網(wǎng)站提供優(yōu)質(zhì)的服務(wù)。我們立足成都,凝聚了一批互聯(lián)網(wǎng)行業(yè)人才,有力地推動(dòng)了上1000家企業(yè)的穩(wěn)健成長,幫助中小企業(yè)通過網(wǎng)站建設(shè)實(shí)現(xiàn)規(guī)模擴(kuò)充和轉(zhuǎn)變。
一、JDBC的基本原理
JDBC是Java操作數(shù)據(jù)庫的技術(shù)規(guī)范。他實(shí)際上定義了一組標(biāo)準(zhǔn)的操作數(shù)據(jù)庫的接口。為了能讓Java操作數(shù)據(jù)庫,必須要有實(shí)現(xiàn)了JDBC這些接口的類,不同的數(shù)據(jù)庫廠商為了讓Java語言能操作自己的數(shù)據(jù)庫,都提供了對JDBC接口的實(shí)現(xiàn)--這些實(shí)現(xiàn)了JDBC接口的類打成一個(gè)jar包,就是我們平時(shí)看到的數(shù)據(jù)庫驅(qū)動(dòng)。由于不同的數(shù)據(jù)庫操作數(shù)據(jù)的機(jī)制不一樣,因此JDBC的具體實(shí)現(xiàn)也就千差萬別,但是你作為java程序員,你只和Java JDBC的接口打交到,才不用理會(huì)他們怎么實(shí)現(xiàn)的!呵呵,現(xiàn)在知道JDBC驅(qū)動(dòng)是怎么回事了。當(dāng)然,這些類可以自己去寫--如果你很牛!
二、JDBC編程的步驟
為了說明這個(gè)步驟,假設(shè)你要通過java程序執(zhí)行一個(gè)sql查詢,你需要按照如下的步驟去走:
1、創(chuàng)建指定數(shù)據(jù)庫的URL
這個(gè)URL實(shí)際上還是統(tǒng)一資源定位器,里面包含了一些連接數(shù)據(jù)庫的信息:數(shù)據(jù)庫類型、端口、驅(qū)動(dòng)類型、連接方式、數(shù)據(jù)庫服務(wù)器的ip(或名字)、數(shù)據(jù)庫名(有的是別名)等。其格式如下:
jdbc:subProtocol:subName://DBserverIP:port/DatabaseName
例如mysql的一個(gè)url:jdbc:mysql://192.168.3.143:3306/zfvims
2、加載驅(qū)動(dòng)類到JVM內(nèi)存區(qū)域中
有兩種方法:
一種是用Class.forName()方法加載指定的驅(qū)動(dòng)程序。
一種是將驅(qū)動(dòng)程序添加到j(luò)ava.lang.System的屬性jdbc.drivers中。
最后說明一點(diǎn),有時(shí)候添加到系統(tǒng)的CLASSPATH環(huán)境變量是不行的,原因是在使用JDBC接口操作數(shù)據(jù)庫前,JVM還沒有加載上驅(qū)動(dòng)。
Class.forName("com.mysql.jdbc.Driver")
3、、通過DriverManager類管理驅(qū)動(dòng)、創(chuàng)建數(shù)據(jù)庫連接。
DriverManager類作用于程序員和JDBC驅(qū)動(dòng)程序之間,提供注冊管理驅(qū)動(dòng)建立連接細(xì)節(jié)等方法,它所有成員均為靜態(tài)的。通過其getConnection方法會(huì)創(chuàng)建一個(gè)JDBC Connection對象。
Connection conn=DriverManager.registerDriver("jdbc:mysql://192.168.3.143:3306/zfvims","lavasoft","password");
4、Connection類--數(shù)據(jù)庫連接
這里所說的Connection類實(shí)際上是實(shí)現(xiàn)了JDBC的Connection接口的類,這個(gè)類一般都是jdbc驅(qū)動(dòng)程序?qū)崿F(xiàn)了。Connection類表示了數(shù)據(jù)庫連接,通過其對象可以獲取一個(gè)獲取數(shù)據(jù)庫和表等數(shù)據(jù)庫對象的詳細(xì)信息。但更多的是通過這個(gè)連接更進(jìn)一步去向數(shù)據(jù)庫發(fā)送SQL語句去執(zhí)行,下面會(huì)講到。
數(shù)據(jù)庫的連接的建立是很耗費(fèi)資源和時(shí)間的,因此在不用連接的情況下要通過其close()方法將連接關(guān)閉,以釋放系統(tǒng)資源。
5、Statement類--發(fā)送并執(zhí)行(靜態(tài))SQL語句
通過Connection對象的createStatement()方法可以創(chuàng)建一個(gè)Statement對象,通過該對象的方法可以(發(fā)送)并執(zhí)行一個(gè)靜態(tài)sql語句。如果要執(zhí)行動(dòng)態(tài)的sql(sql串中有參數(shù)),那么就用PreparedStatement類,用法和Statement類似。
Statement stmt=con.createStatement()
6、ResultSet類--結(jié)果集
當(dāng)你執(zhí)行一條sql查詢后,就會(huì)產(chǎn)生一個(gè)查詢結(jié)果。ResultSet就表示數(shù)據(jù)庫結(jié)果集的數(shù)據(jù)表,通常通過執(zhí)行查詢數(shù)據(jù)庫的語句生成。ResultSet 對象具有指向其當(dāng)前數(shù)據(jù)行的指針。通過ResultSet對象不但可以結(jié)果集數(shù)據(jù),還可以獲取結(jié)果集表的列名、數(shù)據(jù)類型等信息。
ResultSet rs=stmt.executeQuery(sql)
7、關(guān)閉數(shù)據(jù)庫連接
當(dāng)對sql操作完成后,應(yīng)該關(guān)閉數(shù)據(jù)庫連接,這樣避免因?yàn)檫B接未關(guān)閉而耗費(fèi)系統(tǒng)資源,如果每次都不關(guān)閉,多次操作將建立多個(gè)連接,最終數(shù)據(jù)庫連接會(huì)達(dá)到最大限度,或者耗盡系統(tǒng)的資源,從而導(dǎo)致應(yīng)用崩潰。因此要注意關(guān)閉資源,尤其是數(shù)據(jù)庫連接。
三、JDBC編程最基本的實(shí)例
下面通過一個(gè)執(zhí)行一條簡單的MySQL查詢來說名上面的JDBC編程的一般方法和步驟。
- public class TestJDBC(){
- public static Connection getConnectionByJDBC() {
- Connection conn = null;
- try {
- //裝載驅(qū)動(dòng)類
- Class.forName("com.mysql.jdbc.Driver");
- } catch (ClassNotFoundException e) {
- System.out.println("裝載驅(qū)動(dòng)異常!");
- e.printStackTrace();
- }
- try {
- //建立JDBC連接
- conn = DriverManager.getConnection(""jdbc:mysql://192.168.3.143:3306/zfvims","lavasoft","password");
- } catch (SQLException e) {
- System.out.println("鏈接數(shù)據(jù)庫異常!");
- e.printStackTrace();
- }
- return conn;
- }
- public static String test() {
- String sqlx = "select t.code,t.name from province t order by t.code asc";
- try {
- //創(chuàng)建一個(gè)JDBC聲明
- Statement stmt = conn.createStatement(ResultSet.TYPE_FORWARD_ONLY, ResultSet.CONCUR_READ_ONLY);
- //執(zhí)行查詢
- ResultSet = stmt.executeQuery(sqlx);
- while (rs.next()) {
- String code = rs.getString("code");
- String name = rs.getString("name");
- System.out.println(code+name);
- }
- } catch (SQLException e) {
- System.out.println(e.getMessage());
- e.printStackTrace();
- } finally {
- //預(yù)防性關(guān)閉連接(避免異常發(fā)生時(shí)在try語句塊關(guān)閉連接沒有執(zhí)行)
- try {
- if (conn != null) conn.close();
- } catch (SQLException e) {
- System.out.println(e.getMessage());
- e.printStackTrace();
- }
- }
- }
- public static void main(String args[]) {
- new TestJDBC().test();
- }
- }
四、JDBC編程的陷阱
1、conn一定要在finally語句塊進(jìn)行關(guān)閉。
2、Statement、ResultSet盡可能縮小其變量作用域。
3、Statement可以使用多次,定義多個(gè)。一個(gè)Statement對象只和一個(gè)ResultSet對象關(guān)聯(lián),并且是最后一次查詢。
4、ResultSet在Connection、ResultSet關(guān)閉后自動(dòng)關(guān)閉。
還有很多需要寫的,以后再慢慢總結(jié)。
【編輯推薦】
- 在Weblogic中實(shí)現(xiàn)JDBC的功能
- 詳解JDBC與Hibernate區(qū)別
- JDBC連接MySQL數(shù)據(jù)庫關(guān)鍵四步
- 五步精通SQL Server 2000 JDBC驅(qū)動(dòng)安裝與測試
- 詳解JDBC驅(qū)動(dòng)的四種類型
- JDBC存儲(chǔ)過程在Oracle中的獲取結(jié)果集
網(wǎng)站欄目:JavaJDBC編程總結(jié)
文章URL:http://www.dlmjj.cn/article/djdjpsg.html


咨詢
建站咨詢
