JDBC是Java操作數(shù)據(jù)庫的技術(shù)規(guī)范。他實際上定義了一組標準的操作數(shù)據(jù)庫的接口。為了能讓Java操作數(shù)據(jù)庫,必須要有實現(xiàn)了JDBC這些接口的類,不同的數(shù)據(jù)庫廠商為了讓Java語言能操作自己的數(shù)據(jù)庫,都提供了對JDBC接口的實現(xiàn)--這些實現(xiàn)了JDBC接口的類打成一個jar包,就是我們平時看到的數(shù)據(jù)庫驅(qū)動。由于不同的數(shù)據(jù)庫操作數(shù)據(jù)的機制不一樣,因此JDBC的具體實現(xiàn)也就千差萬別,但是你作為java程序員,你只和Java JDBC的接口打交到,才不用理會他們怎么實現(xiàn)的!呵呵,現(xiàn)在知道JDBC驅(qū)動是怎么回事了。當然,這些類可以自己去寫--如果你很牛!
西安達內(nèi)培訓(xùn)機構(gòu)(http://www.xatarena.cn)的Java培訓(xùn)講師表示,JDBC是一種可用于執(zhí)行SQL語句的JavaAPI(ApplicationProgrammingInterface應(yīng)用程序設(shè)計接口)。它由一些Java語言編寫的類和界面組成。JDBC為數(shù)據(jù)庫應(yīng)用開發(fā)人員、數(shù)據(jù)庫前臺工具開發(fā)人員提供了一種標準的應(yīng)用程序設(shè)計接口,使開發(fā)人員可以用純Java語言編寫完整的數(shù)據(jù)庫應(yīng)用程序。JDBC(Java Data Base Connectivity,java數(shù)據(jù)庫連接),由一些接口和類構(gòu)成的API。J2SE的一部分,由java.sql,javax.sql包組成。
1、JDBC驅(qū)動
JDBC驅(qū)動是JDBC API接口的具體實現(xiàn),不同數(shù)據(jù)庫的實現(xiàn)細節(jié)不同。
驅(qū)動類型(四種類型),一般優(yōu)先使用純Java的驅(qū)動,已獲得更好的效率。
2、JDBC操作數(shù)據(jù)庫的一般步驟
注冊驅(qū)動 (只做一次)
建立連接(Connection)
創(chuàng)建執(zhí)行SQL的語句(Statement)
執(zhí)行語句
處理執(zhí)行結(jié)果(ResultSet)
釋放資源
3、注冊JDBC驅(qū)動
有三種方式:
Class.forName(“com.mysql.jdbc.Driver”);
推薦這種方式,不會對具體的驅(qū)動類產(chǎn)生依賴。
DriverManager.registerDriver(com.mysql.jdbc.Driver);
會造成DriverManager中產(chǎn)生兩個一樣的驅(qū)動,并會對具體的驅(qū)動類產(chǎn)生依賴。
System.setProperty(“jdbc.drivers”,“driver1:driver2”);
雖然不會對具體的驅(qū)動類產(chǎn)生依賴;但注冊不太方便,所以很少使用。
DriverManager是一個驅(qū)動管理器,內(nèi)部有一個驅(qū)動注冊表(Map結(jié)構(gòu)),可以向其注冊多個JDBC驅(qū)動。
4、建立Connection
Connection conn= DriverManager.getConnection(url, user, password);
url格式:JDBC:子協(xié)議:子名稱//主機名:端口/數(shù)據(jù)庫名?屬性名=屬性值&…
User,password可以用“屬性名=屬性值”方式告訴數(shù)據(jù)庫;
其他參數(shù)如:useUnicode=true&characterEncoding=GBK。
5、建立Statement、PreparedStatement
Statement是一個SQL執(zhí)行器,可以用來執(zhí)行一個靜態(tài)的SQL語句。
Statement st =conn.createStatement();
st.executeQuery(sql);
PreparedStatement是一個與定義的SQL執(zhí)行器,一般較Statement有防止SQL注入的功能,還有較好的執(zhí)行效率。
String sql ="select * from table_name where col_name=?";
PreparedStatementps = conn.preparedStatement(sql);
ps.setString(1,"col_value");
ps.executeQuery();
在數(shù)據(jù)庫連接沒有關(guān)閉的情況下,數(shù)據(jù)庫和驅(qū)動可以對PreperedStatement進行優(yōu)化,PreperedStatement對象可以被重用,從而避免頻繁編譯SQL。
6、處理ResultSet
ResultSet表示一個查詢結(jié)果集。
ResultSet rs =statement.executeQuery(sql);
While(rs.next()){
rs.getString(“col_name”);
rs.getInt(“col_name”);
//…
}
7、釋放資源
釋放資源的順序是ResultSet,Statement,Connection;
Connection在使用完成后,必須關(guān)閉,ResultSet,Statement無所謂,只要Connection關(guān)閉了,它們也會被自動關(guān)閉(但資源不是立即被釋放)。
Connection的使用原則是盡量晚創(chuàng)建,盡量早的釋放。
在關(guān)閉資源異常的情況下,應(yīng)該將資源賦null值,以確保資源最大可能的被釋放掉。
8、數(shù)據(jù)類型
幾種特殊且比較常用的類型
1.DATA,TIME,TIMESTAMP? date,time,datetime
存:ps.setDate(i,d);ps.setTime(i,t); ps.setTimestamp(i, ts);
?。?/span>rs.getDate(i);rs.getTime(i); rs.getTimestamp(i);
2.CLOB ? text
存:ps.setCharacterStream(index,reader, length);
ps.setString(i, s);
?。?/span>reader = rs.getCharacterStream(i);
reader =rs.getClob(i).getCharacterStream();
string = rs.getString(i);
3.BLOB ? blob
存:ps.setBinaryStream(i,inputStream, length);
?。?/span>rs.getBinaryStream(i);
rs.getBlob(i).getBinaryStream();
9、事物
原子性(atomicity):組成事務(wù)處理的語句形成了一個邏輯單元,不能只執(zhí)行其中的一部分。
一致性(consistency):在事務(wù)處理執(zhí)行前后,數(shù)據(jù)庫是一致的(兩個賬戶要么都變,或者都不變)。
隔離性(isolcation):一個事務(wù)處理對另一個事務(wù)處理沒有影響。
持續(xù)性(durability):事務(wù)處理的效果能夠被永久保存下來。
connection.setAutoCommit(false);//打開事務(wù)。
connection.commit();//提交事務(wù)。
connection.rollback();//回滾事務(wù)。
10、執(zhí)行存儲過程
CallableStatement(從PreperedStatement擴展來)
cs =connection.prepareCall(“{call psname(?,?,?)}”);
cs.registerOutParameter(index,Types.INTEGER);
cs.setXXX(i,xxxx);
cs.executeUpdate();
intid=cs.getInt(index);