import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; public class JDBCDemo { public static void main(String[] args) throws SQLException, ClassNotFoundException { Class.forName("com.mysql.jdbc.Driver"); Connection connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/test","root","123"); Statement stmt = connection.createStatement(); ResultSet rs = stmt.executeQuery("SELECT A_NAME FROM A"); while (rs.next()) { String name = rs.getString("A_NAME"); System.out.println("name is:"+ name); } rs.close(); stmt.close(); connection.close(); } }
Jdbc程序中的Statement對象用於向數據庫發送SQL語句, Statement對象常用方法: executeQuery(String sql) :用於向數據發送查詢語句。 executeUpdate(String sql):用於向數據庫發送insert、update或delete語句 execute(String sql):用於向數據庫發送任意sql語句 addBatch(String sql) :把多條sql語句放到一個批處理中。 executeBatch():向數據庫發送一批sql語句執行。 Jdbc程序中的ResultSet用於代表Sql語句的執行結果。Resultset封裝執行結果時,采用的類似於表格的方式。ResultSet 對象維護了一個指向表格數據行的游標cursor,初始的時候,游標在第一行之前,調用ResultSet.next() 方法,可以使游標指向具體的數據行,進而調用方法獲取該行的數據。 ResultSet既然用於封裝執行結果的,所以該對象提供的大部分方法都是用於獲取數據的get方法: 獲取任意類型的數據 getObject(int index) getObject(string columnName) 獲取指定類型的數據,例如: getString(int index) getString(String columnName) 提問:數據庫中列的類型是varchar,獲取該列的數據調用什麼方法?Int類型呢?bigInt類型呢?Boolean類型? 默認得到的ResultSet它只能向下遍歷(next()),對於ResultSet它可以設置成是滾動的,可以向上遍歷, 或者直接定位到一個指定的物理行號. 問題:怎樣得到一個滾動結果集?
Statement st=con.createStatement(); ResultSet rs=st.executeQuery(sql);
這是一個默認結果集:只能向下執行,並且只能迭代一次。
Statement stmt = con.createStatement( ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_UPDATABLE); ResultSet rs = stmt.executeQuery(sql);
這個就可以創建滾動結果集. 簡單說,就是在創建Statement對象時,不使用createStatement(); 而使用帶參數的createStatement(int,int)
Statement createStatement(int resultSetType, int resultSetConcurrency) throws SQLExceptionresultSetType - 結果集類型,它是 ResultSet.TYPE_FORWARD_ONLY、ResultSet.TYPE_SCROLL_INSENSITIVE 或 ResultSet.TYPE_SCROLL_SENSITIVE 之一 resultSetConcurrency - 並發類型;它是 ResultSet.CONCUR_READ_ONLY 或 ResultSet.CONCUR_UPDATABLE 之一 第一個參數值 ResultSet.TYPE_FORWARD_ONLY 該常量指示光標只能向前移動的 ResultSet 對象的類型。 ResultSet.TYPE_SCROLL_INSENSITIVE 該常量指示可滾動但通常不受 ResultSet 底層數據更改影響的 ResultSet 對象的類型。 ResultSet.TYPE_SCROLL_SENSITIVE 該常量指示可滾動並且通常受 ResultSet 底層數據更改影響的 ResultSet 對象的類型。 第二個參數值 ResultSet.CONCUR_READ_ONLY 該常量指示不可以更新的 ResultSet 對象的並發模式。 ResultSet.CONCUR_UPDATABLE 該常量指示可以更新的 ResultSet 對象的並發模式。 以上五個值,可以有三種搭配方式 ResultSet.TYPE_FORWARD_ONLY ResultSet.CONCUR_READ_ONLY 默認 ResultSet.TYPE_SCROLL_INSENSITIVE ResultSet.CONCUR_READ_ONLY ResultSet.TYPE_SCROLL_SENSITIVE ResultSet.CONCUR_UPDATABLE 常用API next():移動到下一行 previous():移動到前一行 absolute(int row):移動到指定行 beforeFirst():移動resultSet的最前面 afterLast() :移動到resultSet的最後面 updateRow() :更新行數據 ResultSet還提供了對結果集進行滾動和更新的方法 Statement stmt = conn.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_UPDATABLE); next():移動到下一行 previous():移動到前一行 absolute(int row):移動到指定行 beforeFirst():移動resultSet的最前面 afterLast() :移動到resultSet的最後面 updateRow() :更新行數據 Jdbc程序運行完後,切記要釋放程序在運行過程中,創建的那些與數據庫進行交互的對象,這些對象通常是ResultSet, Statement和Connection對象。 特別是Connection對象,它是非常稀有的資源,用完後必須馬上釋放,如果Connection不能及時、正確的關閉,極易導致系統宕機。Connection的使用原則是盡量晚創建,盡量早的釋放。 為確保資源釋放代碼能運行,資源釋放代碼也一定要放在finally語句中。 PreparedStatement是Statement的子接口,它的實例對象可以通過調用Connection.preparedStatement(sql)方法獲得,相對於Statement對象而言: PreperedStatement可以避免SQL注入的問題。 Statement會使數據庫頻繁編譯SQL,可能造成數據庫緩沖區溢出。PreparedStatement 可對SQL進行預編譯,從而提高數據庫的執行效率。 並且PreperedStatement對於sql中的參數,允許使用占位符的形式進行替換,簡化sql語句的編寫。