Posted on 2009-06-21 22:13
Gavin.lee 閱讀(985)
評(píng)論(0) 編輯 收藏 所屬分類:
JDBC
在JDBC 中包括了兩個(gè)包:java.sql和javax.sql。
① java.sql 基本功能。
這個(gè)包中的類和接口主要針對(duì)基本的數(shù)據(jù)庫編程服務(wù),如生成連接、執(zhí)行語句以及準(zhǔn)備語句和運(yùn)行批處理查詢等。
同時(shí)也有一些高級(jí)的處理,比如批處理更新、事務(wù)隔離和可滾動(dòng)結(jié)果集等。
② javax.sql 擴(kuò)展功能。
它主要為數(shù)據(jù)庫方面的高級(jí)操作提供了接口和類。
如為連接管理、分布式事務(wù)和舊有的連接提供了更好的抽象,它引入了容器管理的連接池、分布式事務(wù)和行集等。
API 說明
Connection 與特定數(shù)據(jù)庫的連接(會(huì)話)。能夠通過getMetaData方法獲得數(shù)據(jù)庫提供的信息、
所支持的SQL語法、存儲(chǔ)過程和此連接的功能等信息。代表了數(shù)據(jù)庫。
Driver 每個(gè)驅(qū)動(dòng)程序類必需實(shí)現(xiàn)的接口,每個(gè)數(shù)據(jù)庫驅(qū)動(dòng)程序也都應(yīng)該提供一個(gè)實(shí)現(xiàn)Driver接口的類。
DriverManager(Class) 管理一組JDBC驅(qū)動(dòng)程序的基本服務(wù)。作為初始化的一部分,此接口會(huì)嘗試加載
在”jdbc.drivers”系統(tǒng)屬性中引用的驅(qū)動(dòng)程序。只是一個(gè)輔助類,是工具。
Statement 用于執(zhí)行靜態(tài)SQL語句并返回其生成結(jié)果的對(duì)象。
PreparedStatement 繼承Statement接口,表示預(yù)編譯的SQL語句的對(duì)象,SQL語句被預(yù)編譯并且存儲(chǔ)
在PreparedStatement對(duì)象中。然后可以使用此對(duì)象高效地多次執(zhí)行該語句。
CallableStatement 用來訪問數(shù)據(jù)庫中的存儲(chǔ)過程。它提供了一些方法來指定語句所使用的輸入/輸出參數(shù)。
ResultSet 指的是查詢返回的數(shù)據(jù)庫結(jié)果集。
ResultSetMetaData 可用于獲取關(guān)于ResultSet對(duì)象中列的類型和屬性信息的對(duì)象。
注:除了標(biāo)出的Class,其它均為接口。每個(gè)都是“java.sql.”包下的。
1. Statement —— SQL語句執(zhí)行接口
代表了一個(gè)數(shù)據(jù)庫的狀態(tài),在向數(shù)據(jù)庫發(fā)送相應(yīng)的SQL語句時(shí),都需要?jiǎng)?chuàng)建Statement接口或PreparedStatement接口。
在具體應(yīng)用中,Statement主要用于操作不帶參數(shù)(可以直接運(yùn)行)的SQL語句,比如刪除語句、添加或更新。
2. PreparedStatement:預(yù)編譯的Statement
第一步:通過連接獲得PreparedStatement對(duì)象,用帶占位符(?)的sql語句構(gòu)造。
PreparedStatement pstm = con.preparedStatement(“select * from test where id=?”);
第二步:設(shè)置參數(shù)
pstm.setString(1,“ganbin”);//第一個(gè)字段是“ganbin”;需一個(gè)個(gè)字段寫
第三步:執(zhí)行sql語句
Rs = pstm.excuteQuery();
statement發(fā)送完整的Sql語句到數(shù)據(jù)庫不是直接執(zhí)行而是由數(shù)據(jù)庫先編譯,再運(yùn)行。每次都需要編譯。
而PreparedStatement是先發(fā)送帶參數(shù)的Sql語句,由數(shù)據(jù)庫先編譯,再發(fā)送一組組參數(shù)值。(同構(gòu)時(shí)不需重復(fù)編譯)
如果是同構(gòu)的sql語句,PreparedStatement的效率要比statement高。而對(duì)于異構(gòu)的sql則兩者效率差不多。
一般都用PreparedStatement代替Statement,因?yàn)樗穷愋桶踩?。Statement對(duì)參數(shù)類型不作檢查,故不夠安全。
同構(gòu):兩個(gè)Sql語句可編譯部分是相同的,只有參數(shù)值不同。
異構(gòu):整個(gè)sql語句的格式是不同的
注意點(diǎn):1、使用預(yù)編譯的Statement編譯多條Sql語句一次執(zhí)行
2、可以跨數(shù)據(jù)庫使用,編寫通用程序
3、能用預(yù)編譯時(shí)盡量用預(yù)編譯
4、如果第二個(gè)SQL語句與前一個(gè)是異構(gòu)的,需要再次編譯“ps = con.prepareStatement(sql);“
3. ResultSet —— 結(jié)果集操作接口
ResultSet接口是查詢結(jié)果集接口,它對(duì)返回的結(jié)果集進(jìn)行處理。ResultSet是程序員進(jìn)行JDBC操作的必需接口。
4. ResultSetMetaData —— 元數(shù)據(jù)操作接口
ResultSetMetaData是對(duì)元數(shù)據(jù)進(jìn)行操作的接口,可以實(shí)現(xiàn)很多高級(jí)功能。
Hibernate運(yùn)行數(shù)據(jù)庫的操作,大部分都是通過此接口??梢哉J(rèn)為,此接口是SQL查詢語言的一種反射機(jī)制。
ResultSetMetaData接口可以通過數(shù)組的形式,遍歷數(shù)據(jù)庫的各個(gè)字段的屬性,對(duì)于開發(fā)者來說,此機(jī)制的意義重大。
JDBC通過元數(shù)據(jù)(MetaData)來獲得具體的表的相關(guān)信息,例如,可以查詢數(shù)據(jù)庫中有哪些表,表有哪些字段,以及字段的
屬性等。MetaData中通過一系列g(shù)etXXX將這些信息返回給我們。
數(shù)據(jù)庫元數(shù)據(jù) Database MetaData 用connection.getMetaData()獲得;包含了關(guān)于數(shù)據(jù)庫整體元數(shù)據(jù)信息。
結(jié)果集元數(shù)據(jù) ResultSet MetaData 用resultSet.getMetaData()獲得;比較重要的是獲得表的列名,列數(shù)等信息。
結(jié)果集元數(shù)據(jù)對(duì)象:ResultSetMetaData meta = rs.getMetaData();
字段個(gè)數(shù):meta.getColomnCount();
字段名字:meta.getColumnName();
字段JDBC類型:meta.getColumnType();
字段數(shù)據(jù)庫類型:meta.getColumnTypeName();
數(shù)據(jù)庫元數(shù)據(jù)對(duì)象:DatabaseMetaData dbmd = con.getMetaData();
數(shù)據(jù)庫名:dbmd.getDatabaseProductName();
數(shù)據(jù)庫版本號(hào):dbmd.getDatabaseProductVersion();
數(shù)據(jù)庫驅(qū)動(dòng)名:dbmd.getDriverName();
數(shù)據(jù)庫驅(qū)動(dòng)版本號(hào):dbmd.getDriverVersion();
數(shù)據(jù)庫Url:dbmd.getURL();
該連接的登陸名:dbmd.getUserName();