JDBC編程總結

JDBC編程總結

 

JDBC的基本原理
JDBC是Java操做數據庫的技術規範。他實際上定義了一組標準的操做數據庫的接口。爲了能讓Java操做數據庫,必需要有實現了JDBC這些接口的類,不一樣的數據庫廠商爲了讓Java語言能操做本身的數據庫,都提供了對JDBC接口的實現--這些實現了JDBC接口的類打成一個jar包,就是咱們平時看到的數據庫驅動。因爲不一樣的數據庫操做數據的機制不同,所以JDBC的具體實現也就千差萬別,可是你做爲java程序員,你只和Java JDBC的接口打交到,纔不用理會他們怎麼實現的!呵呵,如今知道JDBC驅動是怎麼回事了。固然,這些類能夠本身去寫--若是你很牛!
 
 
一、JDBC
JDBC(Java Data Base Connectivity,java數據庫鏈接),由一些接口和類構成的API。J2SE的一部分,由java.sql,javax.sql包組成。
 
二、JDBC驅動
JDBC驅動是JDBC API接口的具體實現,不一樣數據庫的實現細節不一樣。
驅動類型(四種類型),通常優先使用純Java的驅動,已得到更好的效率。
 
三、JDBC操做數據庫的通常步驟
註冊驅動 (只作一次)
創建鏈接(Connection)
建立執行SQL的語句(Statement)
執行語句
處理執行結果(ResultSet)
釋放資源
 
四、註冊JDBC驅動
有三種方式:
Class.forName(「com.mysql.jdbc.Driver」);
 推薦這種方式,不會對具體的驅動類產生依賴。
DriverManager.registerDriver(com.mysql.jdbc.Driver);
 會形成DriverManager中產生兩個同樣的驅動,並會對具體的驅動類產生依賴。
System.setProperty(「jdbc.drivers」, 「driver1:driver2」);
 雖然不會對具體的驅動類產生依賴;但註冊不太方便,因此不多使用。
 
DriverManager是一個驅動管理器,內部有一個驅動註冊表(Map結構),能夠向其註冊多個JDBC驅動。
 
 
五、創建Connection
Connection conn = DriverManager.getConnection(url, user, password);
url格式:JDBC:子協議:子名稱//主機名:端口/數據庫名?屬性名=屬性值&…
User,password能夠用「屬性名=屬性值」方式告訴數據庫;
其餘參數如:useUnicode=true&characterEncoding=GBK。
 
六、創建Statement、PreparedStatement
Statement是一個SQL執行器,能夠用來執行一個靜態的SQL語句。
Statement st = conn.createStatement();
st.executeQuery(sql);
 
PreparedStatement是一個與定義的SQL執行器,通常較Statement有防止SQL注入的功能,還有較好的執行效率。
String sql = "select * from table_name where col_name=?";
PreparedStatement ps = conn.preparedStatement(sql);
ps.setString(1, "col_value");
ps.executeQuery();
 
在數據庫鏈接沒有關閉的狀況下,數據庫和驅動能夠對PreperedStatement進行優化,PreperedStatement對象能夠被重用,從而避免頻繁編譯SQL。
 
七、處理ResultSet
ResultSet表示一個查詢結果集。
ResultSet rs = statement.executeQuery(sql);
While(rs.next()){
 rs.getString(「col_name」);
 rs.getInt(「col_name」);
 //…
}
 
八、釋放資源
釋放資源的順序是ResultSet, Statement,Connection;
Connection在使用完成後,必須關閉,ResultSet, Statement無所謂,只要Connection關閉了,它們也會被自動關閉(但資源不是當即被釋放)。
Connection的使用原則是儘可能晚建立,儘可能早的釋放。
在關閉資源異常的狀況下,應該將資源賦null值,以確保資源最大可能的被釋放掉。
 
九、數據類型
幾種特殊且比較經常使用的類型
1.DATA,TIME,TIMESTAMP date,time,datetime
存:ps.setDate(i,d); ps.setTime(i,t); ps.setTimestamp(i, ts);
取:rs.getDate(i); rs.getTime(i); rs.getTimestamp(i);
2.CLOB  text
存:ps.setCharacterStream(index, reader, length);
    ps.setString(i, s);
取:reader = rs. getCharacterStream(i);
    reader = rs.getClob(i).getCharacterStream();
    string = rs.getString(i);
3.BLOB  blob
存:ps.setBinaryStream(i, inputStream, length);
取:rs.getBinaryStream(i);
    rs.getBlob(i).getBinaryStream();
 
十、事務
原子性(atomicity):組成事務處理的語句造成了一個邏輯單元,不能只執行其中的一部分。
一致性(consistency):在事務處理執行先後,數據庫是一致的(兩個帳戶要麼都變,或者都不變)。
隔離性(isolcation):一個事務處理對另外一個事務處理沒有影響。
持續性(durability):事務處理的效果可以被永久保存下來 。
 
connection.setAutoCommit(false);//打開事務。
connection.commit();//提交事務。
connection.rollback();//回滾事務。
 
十一、隔離級別
隔離級別是控制併發訪問數據的安全話題。
connection.setTransactionIsolation(Connection.TRANSACTION_READ_COMMITTED);
V:可能出現,X:不會出現
 
隔離級別
髒讀
不可重複讀
幻讀
讀未提交( Read uncommitted)
V
V
V
讀已提交( Read committed)
x
V
V
可重複讀( Repeatable read)
x
x
V
可串行化( Serializable )
x
x
x
 
十二、執行存儲過程
CallableStatement(從PreperedStatement擴展來)
cs = connection.prepareCall(「{call psname(?,?,?)}」);
cs.registerOutParameter(index, Types.INTEGER);
cs.setXXX(i, xxxx);
cs.executeUpdate();
int id=cs.getInt(index);
相關文章
相關標籤/搜索