一.數據庫連接
(前面為jdbc的其他參數,文章下部分為ResultSet詳解)
ResultSet rs = st.executeQuery(sqlStr)
1. java的sql框架支持多種數據庫連接,不同的數據庫需要使用不同的數據庫連接驅動,驅動來自於數據庫廠商;
2. 主要需要四個參數,一個驅動信息參數,三個數據庫入口參數
- driverClass:驅動信息
- url:數據庫連接參數
- user:用戶名
- password:密碼
3.java語言定義了很多接口,數據庫廠商統一實現這些接口,所以通用;
二.接口
1.Connection接口
- Connection接口代表着與數據庫的鏈接
返回類型 | 方法 | 功能描述 |
Statement | createStatment() | 創建一個Statment對象 |
Statement | createStatment(int resultSetType,int resultSetConcurrency) | 創建一個statment對象,該對象將生成具有給定類型並發性,和可保存的ResultSet對象 |
PrepareStatement | prepareStatement() | 創建預處理對象prepardStatement |
CallableStatement | prepareCall(String sql) | 創建一個CallableStatment對象來調用數據庫存儲過程 |
boolean | isReadOnly() | 查看當前Collection對象是否為只讀 |
boolean | setReadOnly() | 設置當前對象的默認讀寫模式 |
2.Statment接口
statment接口
返回類型 | 方法 | 功能描述 |
boolean | execute(String sql) | 執行靜態sql語句,該語句可能返回多個結果集,(改方法看似雞肋,其實也很雞肋,如果該語句可以返回一個ResultSet結果集,則為true,反之false,當然,當sql語句龐大的時候,可以用這個方法來檢測是否能夠執行從而節省資源) |
ResultSet | executeQuery(String sql) | 執行給定的sql語句,該語句返回單個ResultSet對象 |
void | clearBatch() | 清空這個Statement對象的sql命令列表 |
int[] | executeButch() | 將一批sql命令交給數據庫類執行,如果全部成功,則返回更新計數組成的數組,數組元素的排序和sql添加的順序相同 |
3.PreparedStatment接口,繼承自Statment接口,因為PreparedStatment是安全的,Statment接口是不安全的
PrepareStatment接口的常用方法
方法參數 | 方法 | 功能描述 |
void | setXXX(int index,[指定給的類型] k) | 將制定位置的參數設置成XXX值 |
ResultSet | executeQuery() | 執行Sql查詢,並返回對應的ResultSet結果集 |
void | setNull(int index ,int sqlType) | 設置指定的位置為SQL NUll值 |
int | executeUpdate() | 執行前面包含的參數的動態 [INSERT|UPDATE|DELETE] |
void | clearParameters() | 清楚當前所有參數值 |
- 例子
PrepareStatment ps = conn.prepareStatment("select * from emp where ename = ? "); ps.setInt(1,'張三'); //將sql中的第一個參數設置為張三
4.CallableStatement接口
CallableStatemnt接口繼承並且擴展了PrepareStatemnt接口,用來執行對數據庫的存儲過程操作;
方法 | 功能描述 |
set+數據類型 | 將指定參數設置為java中指定的數據類型值 |
get+數據類型 | 以java中指定類型值的形式獲取指定的JDBC中相應參數的類型值 |
三.ResultSet結果集詳解
所有靜態字段 | ||
int | CLOSE_CURSORS_AT_COMMIT | 該常量指示提交當前事務時,具有此可保存性的打開的 ResultSet 對象將被關閉。 |
int | CONCUR_READ_ONLY | 該常量指示不可以更新的 ResultSet 對象的並發模式。 |
int | CONCUR_UPDATABLE | 該常量指示可以更新的 ResultSet 對象的並發模式。 |
int | FETCH_FORWARD | 該常量指示將按正向(即從第一個到最后一個)處理結果集中的行。 |
int | FETCH_REVERSE | 該常量指示將按逆向(即從最后一個到第一個)處理結果集中的行處理。 |
int | FETCH_UNKNOWN | 該常量指示結果集中的行的處理順序未知。 |
int | FETCH_UNKNOWN | 該常量指示提交當前事務時,具有此可保存性的打開的 ResultSet 對象將保持開放。 |
int | TYPE_FORWARD_ONLY | 該常量指示光標只能向前移動的 ResultSet 對象的類型。 |
int | TYPE_SCROLL_INSENSITIVE | 該常量指示可滾動,再固定條件下可以修改表內容; |
int | TYPE_SCROLL_SENSITIVE | 該常量指示可滾動並且,不可修改表內容; |
常用方法 | ||
返回類型 | 方法 | 功能描述 |
boolean | next() | 將光標從當前位置向下移動一行,也就是讀取下一行 |
boolean | previous() | 將光標從當前位置向上移動一行,也就是讀取上一行 |
void | close() | 關閉ResultSet對象 |
int | getInt(int) | 以int的形式獲取結果集,以當前行指定序號的值,以列的編號或者列的名字 |
int | getInt(String) | 以下跟以上一樣以此類推 |
float | getFloat(int) | |
float | getFloat(String) | |
String | getString(int) | |
String | getString(String) | |
int | getRow() | 得到光標當前所指定的行號 |
boolean | absolute(int row) | 光標移動到row指定的行 |
boolean | relative(int rows) | 光標移動到相對於當前行的指定行,上下使用+和-表示 |
ResultSet內存結構

1.ResultSet對象是Statement和ParpareStatemen創建的,所以ResultSet的具體行為指令由創建他的類定義
在jdbc中,最重要的就是ResultSet,因為他最常用,數據的中轉站,很有必要弄詳細;
2. ResultSet集合的主要功能使用來存儲查詢語句返回的結果集,注意:
他存儲的不是結果集內容,所以不會造成數據量過大而引發的內存溢出,
他存儲的只是查詢數據的部分資料,而具體的數據信息會在調用next()時拿出來;
以上言論是網上大佬說的,說錯了,說錯了,具體內容已經被保存到ResultSet里的RowDate里面了,字節的形式,打開會看到一堆二進制;
尋找jvm可容量視化工具,請評論;

3.因為ResultSet是由其他對象來創建的,所以有有幾種類型不同的Result
- 最基本的ResultSet
- 這個ResultSet的作用就是完成了查詢結果的存儲功能,並且只能讀取一次,不能夠來回滾動進行讀取操作,如圖;
- 可滾動的ResultSet
- 這個類型支持前后滾動取得記錄的next()向下讀取以一行,和previous()向上讀取以一行,同時還支持absolute(int row)讀取指定的一行,以
- 這種結果集的創建方式如下
Statement st = conn.createStatement(int resultSetType, int resultSetConcurrency); ResultSet rs = st.executeQuery(sqlStr);
- 要實現這種類型的ResultSet對象的,在Statement創建該對象是為其指定類型;
- resultSetType用來設置ResultSet類型是否支持滾動,或者是不可滾動,取值如下:
- ResultSet.TYPE_FORWARD_ONLY 只能向前滾動;
- ResultSet.TYPE_SCROLL_INSENSITIVE 實現任意的前后滾動,即可以使用各種移動指針的方法,並且支持修改;
- Result.TYPE_SCROLL_SENSITIVE 實現任意的前后滾動,對修改敏感;
- resultSetConcurency 是設置 ResultSet 對象能夠修改的,取值如下:
- ResultSet.CONCUR_READ_ONLY 設置為只讀類型的參數。
- ResultSet.CONCUR_UPDATABLE 設置為可修改類型的參數。
所以如果只是想要可以滾動的類型的 Result,就要在Statement創建ResultSet是為其指定類型
Statement st = conn.createStatement(Result.TYPE_SCROLL_INSENITIVE, ResultSet.CONCUR_READ_ONLY); ResultSet rs = st.excuteQuery(sqlStr); //用這個 Statement 執行的查詢語句得到的就是可滾動的 ResultSet 。
4.ResultSet的可更新狀態
- RresltSet不僅可以用來存儲查詢結果返回的數據,也可以通過修改其內中值,然后起到更新數據庫內容的作用
- ResultSet相當於數據中的視圖,他沒有實體,並且,所提交的Sql語句必須滿足一下幾點內容
- 只引用了單個表
- 不包含jion和分組信息
- 列中要包含主鍵信息
創建可跟新結果集的辦法:
Statement st = createstatement(Result.TYPE_SCROLL_INSENSITIVE,Result.CONCUR_UPDATABLE) //具體的ResultSet字段信息請參考上面的字段表
5. 可以保持的ResultSet
- Statement關閉結果集的方法,當前有一個結果集,又去執行了一條sql語句,會導致第一個結果集關閉,或者在commit方法的時候也會關閉結果集,可保持的意思就是不會被關閉的結果集
Statement st=createStatement(int resultsetscrollable,int resultsetupdateable,int resultsetSetHoldability) ResultSet rs = st.excuteQuery(sqlStr);
- 兩個參數在第3. 4. 中已經闡述的參數 ,這里說明一下resultsetSetHoldability參數
- resultsetSetHoldability參數表名,該結果集是否能夠在連接關閉時打開
-
ResultSet.HOLD_CURSORS_OVER_COMMIT:表示修改提交時,不關閉數據庫.
-
ResultSet.CLOSE_CURSORS_AT_COMMIT:表示修改提交時ResultSet關閉.