1. 程式人生 > >JDBC編程總結

JDBC編程總結

比較 打開 sta java數據庫 atomic repeat prepare forname 實現

JDBC編程總結

JDBC的基本原理
JDBC是Java操作數據庫的技術規範。他實際上定義了一組標準的操作數據庫的接口。為了能讓Java操作數據庫,必須要有實現了JDBC這些接口的類,不同的數據庫廠商為了讓Java語言能操作自己的數據庫,都提供了對JDBC接口的實現--這些實現了JDBC接口的類打成一個jar包,就是我們平時看到的數據庫驅動。由於不同的數據庫操作數據的機制不一樣,因此JDBC的具體實現也就千差萬別,但是你作為java程序員,你只和Java JDBC的接口打交到,才不用理會他們怎麽實現的!呵呵,現在知道JDBC驅動是怎麽回事了。當然,這些類可以自己去寫--如果你很牛! 1、JDBC JDBC(Java Data Base Connectivity,java數據庫連接),由一些接口和類構成的API。J2SE的一部分,由java.sql,javax.sql包組成。 2、JDBC驅動 JDBC驅動是JDBC API接口的具體實現,不同數據庫的實現細節不同。 驅動類型(四種類型),一般優先使用純Java的驅動,已獲得更好的效率。 3、JDBC操作數據庫的一般步驟 註冊驅動 (只做一次) 建立連接(Connection) 創建執行SQL的語句(Statement) 執行語句 處理執行結果(ResultSet) 釋放資源 4、註冊JDBC驅動 有三種方式: Class.forName(“com.mysql.jdbc.Driver”); 推薦這種方式,不會對具體的驅動類產生依賴。 DriverManager.registerDriver(com.mysql.jdbc.Driver); 會造成DriverManager中產生兩個一樣的驅動,並會對具體的驅動類產生依賴。 System.setProperty(“jdbc.drivers”, “driver1:driver2”); 雖然不會對具體的驅動類產生依賴;但註冊不太方便,所以很少使用。 DriverManager是一個驅動管理器,內部有一個驅動註冊表(Map結構),可以向其註冊多個JDBC驅動。 5、建立Connection Connection conn = DriverManager.getConnection(url, user, password); url格式:JDBC:子協議:子名稱//主機名:端口/數據庫名?屬性名=屬性值&… User,password可以用“屬性名=屬性值”方式告訴數據庫; 其他參數如:useUnicode=true&characterEncoding=GBK。 6、建立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。 7、處理ResultSet ResultSet表示一個查詢結果集。 ResultSet rs = statement.executeQuery(sql); While(rs.next()){ rs.getString(“col_name”); rs.getInt(“col_name”); //… } 8、釋放資源 釋放資源的順序是ResultSet, Statement,Connection; Connection在使用完成後,必須關閉,ResultSet, Statement無所謂,只要Connection關閉了,它們也會被自動關閉(但資源不是立即被釋放)。 Connection的使用原則是盡量晚創建,盡量早的釋放。 在關閉資源異常的情況下,應該將資源賦null值,以確保資源最大可能的被釋放掉。 9、數據類型 幾種特殊且比較常用的類型 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(); 10、事務 原子性(atomicity):組成事務處理的語句形成了一個邏輯單元,不能只執行其中的一部分。 一致性(consistency):在事務處理執行前後,數據庫是一致的(兩個賬戶要麽都變,或者都不變)。 隔離性(isolcation):一個事務處理對另一個事務處理沒有影響。 持續性(durability):事務處理的效果能夠被永久保存下來 。 connection.setAutoCommit(false);//打開事務。 connection.commit();//提交事務。 connection.rollback();//回滾事務。 11、隔離級別 隔離級別是控制並發訪問數據的安全話題。 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
12、執行存儲過程 CallableStatement(從PreperedStatement擴展來) cs = connection.prepareCall(“{call psname(?,?,?)}”); cs.registerOutParameter(index, Types.INTEGER); cs.setXXX(i, xxxx); cs.executeUpdate(); int id=cs.getInt(index);

JDBC編程總結