java resultset 映射到实例_[Java]ResultSet的用法与实例
JDBC API 2.0/3.0中ResultSet記錄集的簡便實用的新特性
1 新定義了若干個常數
這些常數用于指定ResultSet 的類型游標移動的方向等性質,如下所示:
public static final int FETCH_FORWARD; 該常數的作用是指定處理記錄集中行的順序,是由前到后即從第一行開始處理一直到最后一行;
public static final int FETCH_REVERSE; 該常數的作用是指定處理記錄集中行的順序,是由后到前即從最后一行開始處理一直到第一行;
public static final int FETCH_UNKNOWN; 該常數的作用是不指定處理記錄集中行的順序,由JDBC 驅動程序和數據庫系統決定;
public static final int TYPE_FORWARD_ONLY; 該常數的作用是指定數據庫游標的移動方向是向前,不允許向后移動即只能使用ResultSet 接口的next()方法而不能使用previous()方法否則會產生錯誤;
public static final int TYPE_SCROLL_INSENSITIVE; 該常數的作用是指定數據庫游標可以在記錄集中前后移動,并且當前數據庫用戶獲取的記錄集對其他用戶的操作不敏感;就是說,當前用戶正在瀏覽記錄集中的數據,與此同時,其他用戶更新了數據庫中的數據,但是當前用戶所獲取的記錄集中的數據不會受到任何影響。
public static final int TYPE_SCROLL_SENSITIVE; 該常數的作用是指定數據庫游標可以在記錄集中前后移動,并且當前數據庫用戶獲取的記錄集對其他用戶的操作敏感,就是說,當前用戶正在瀏覽記錄集,但是其它用戶的操作使數據庫中的數據發生了變化,當前用戶所獲取的記錄集中的數據也會同步發生變化,這樣有可能會導致非常嚴重的錯誤產生建議慎重使用該常數。
public static final int CONCUR_READ_ONLY; 該常數的作用是指定當前記錄集的協作方式(concurrencymode),為只讀;一旦使用了這個常數,那么用戶就不可以更新記錄集中的數據。
public static final int CONCUR_UPDATABLE; 該常數的作用是指定當前記錄集的協作方式(concurrencymode),為可以更新;一旦使用了這個常數,那么用戶就可以使用updateXXX()等方法更新記。
2 ResultSet 接口提供了一整套的定位方法
這些可以在記錄集中定位到任意一行:
public boolean absolute(int row); 該方法的作用是將記錄集中的某一行設定為當前行,亦即將數據庫游標移動到指定的行,參數row 指定了目標行的行號,這是絕對的行號,由記錄集的第一行開始計算不是相對的行號。
public boolean relative(int rows); 該方法的作用也是將記錄集中的某一行設定為當前行,但是它的參數rows 表示目標行相對于當前行的行號。
public boolean first(); 該方法的作用是將當前行定位到數據庫記錄集的第一行。
public boolean last(); 該方法的作用剛好和first()方法相反。
public boolean isFirst();
public boolean isFirst(); 該方法的作用是檢查當前行是否記錄集的第一行,如果是返回true, 否則返回false。
public boolean isLast(); 該方法的作用是檢查當前行是否記錄集的最后一行,如果是返回true ,否則返回false。
public void afterLast(); 該方法的作用是將數據庫游標移到記錄集的最后,位于記錄集最后一行的后面,如果該記錄集不包含任何的行該方法不產生作用。
public void beforeFirst(); 該方法的作用是將數據庫游標移到記錄集的最前面,位于記錄集第一行的前面,如果記錄集不包含任何的行該方法不產生作用。
public boolean isAfterLast(); 該方法檢查數據庫游標是否處于記錄集的最后面,如果是返回true ,否則返回false。
public boolean isBeforeFirst(); 該方法檢查數據庫游標是否處于記錄集的最前面,如果是返回true ,否則返回false。
public boolean next(); 該方法的作用是將數據庫游標向前移動一位,使得下一行成為當前行,當剛剛打開記錄集對象時,數據庫游標的位置在記錄集的最前面,第一次使用next()方法將會使數據庫游標定位到記錄集的第一行,第二次使用next()方法將會使數據庫游標定位到記錄集的第二行,以此類推。
public boolean previous(); 該方法的作用是將數據庫游標向后移動一位,使得上一行成為當前行。
3 ResultSet 接口添加了對行操作的支持(最令人心動之處)
修改了的記錄集接口(ResultSet 接口)的方法,使它支持可以滾動的記錄集,即數據庫游標可以在返回的記錄集對象中自由地向前或向后滾動,或者定位到某個特殊的行。利用ResultSet 接口中定義的新方法,JSP/Servlet 程序員可以用Java 語言來更新記錄集,比如插入記錄,更新某行的數據,而不是靠執行SQL 語句,這樣就大大方便了程序員的開發工作,享受Java 編程的樂趣了。
ResultSet 接口中新添加的部分方法如下所示:
public boolean rowDeleted(); 如果當前記錄集的某行被刪除了,那么記錄集中將會留出一個空位;調用rowDeleted()方法,如果探測到空位的存在,那么就返回true; 如果沒有探測到空位的存在,就返回false 值。
public boolean rowInserted(); 如果當前記錄集中插入了一個新行,該方法將返回true ,否則返回false。
public boolean rowUpdated(); 如果當前記錄集的當前行的數據被更新,該方法返回true ,否則返回false。
public void insertRow(); 該方法將執行插入一個新行到當前記錄集的操作。
public void updateRow(); 該方法將更新當前記錄集當前行的數據。
public void deleteRow(); 該方法將刪除當前記錄集的當前行。
public void updateString(int columnIndex String x); 該方法更新當前記錄集當前行某列的值,該列的數據類型是String(指Java 數據類型是String ,與之對應的JDBC 數據類型是VARCHAR 或NVARCHAR 等數據類型) 。該方法的參數columnIndex 指定所要更新的列的列索引,第一列的列索引是1 ,以此類推,第二個參數x 代表新的值,這個方法并不執行數據庫操作,需要執行insertRow()方法或者updateRow()方法以后,記錄集和數據庫中的數據才能夠真正更新。
public void updateString(String columnName String x); 該方法和上面介紹的同名方法差不多,不過該方法的第一個參數是columnName ,代表需要更新的列的列名,而不是columnIndex。
往數據庫當前記錄集插入新行的操作流程如下:
1 調用moveToInsertRow()方法;
2 調用updateXXX()方法指定插入行各列的值;
3 調用insertRow()方法往數據庫中插入新的行。
更新數據庫中某個記錄的值(某行的值)的方法是:
1 定位到需要修改的行(使用absolute() relative()等方法定位);
2 使用相應updateXXX()方法設定某行某列的新值;XXX 所代表的Java 數據類型,必須可以映射為某列的JDBC 數據類型,如果希望rollback 該項操作,請在調用updateRow()方法以前,使用cancelRowUpdates()方法,這個方法可以將某行某列的值復原;
3 使用updateRow()方法完成UPDATE 的操作。
刪除記錄集中某行(亦即刪除某個記錄)的方法:
1 定位到需要修改的行(使用absolute() relative()等方法定位);
2 使用deleteRow()
刪除記錄集中某行(亦即刪除某個記錄)的方法:
1 定位到需要修改的行(使用absolute() relative()等方法定位);
2 使用deleteRow()方法。
JDBC API 3.0 中還在ResultSet 接口中添加了updateArray() updateBlob() updateClob() updateRef()等方法
1、java數據庫操作基本流程
2、幾個常用的重要技巧:
可滾動、更新的記錄集
批量更新
事務處理
java數據庫操作基本流程:取得數據庫連接 - 執行sql語句 - 處理執行結果 - 釋放數據庫連接
1、取得數據庫連接
1)用DriverManager取數據庫連接
例子:
String className,url,uid,pwd;
className = "oracle.jdbc.driver.OracleDriver";
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr;
uid = "system";
pwd = "manager";
Class.forName(className);
Connection cn = DriverManager.getConnection(url,uid,pwd);
2)用jndi(java的命名和目錄服務)方式
例子
String jndi = "jdbc/db";
Context ctx = (Context) new InitialContext().lookup("java:comp/env");
DataSource ds = (DataSource) ctx.lookup(jndi);
Connection cn = ds.getConnection();
多用于jsp中
2、執行sql語句
1)用Statement來執行sql語句
String sql;
Statement sm = cn.createStatement();
sm.executeQuery(sql); // 執行數據查詢語句(select)
sm.executeUpdate(sql); // 執行數據更新語句(delete、update、insert、drop等)statement.close();
2)用PreparedStatement來執行sql語句
String sql;
sql = "insert into user (id,name) values (?,?)";
PreparedStatement ps = cn.prepareStatement(sql);
ps.setInt(1,xxx);
ps.setString(2,xxx);
...
ResultSet rs = ps.executeQuery(); // 查詢
int c = ps.executeUpdate(); // 更新
3、處理執行結果
查詢語句,返回記錄集ResultSet。
更新語句,返回數字,表示該更新影響的記錄數。
ResultSet的方法:
1、next(),將游標往后移動一行,如果成功返回true;否則返回false。
2、getInt("id")或getSting("name"),返回當前游標下某個字段的值。
3、釋放連接。
cn.close();
一般,先關閉ResultSet,然后關閉Statement(或者PreparedStatement);最后關閉Connection
可滾動、更新的記錄集
1、創建可滾動、更新的Statement
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY);
該Statement取得的ResultSet就是可滾動的
2、創建PreparedStatement時指定參數
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY);
ResultSet.absolute(9000);
批量更新
1、Statement
Statement sm = cn.createStatement();
sm.addBatch(sql1);
sm.addBatch(sql2);
...
sm.executeBatch()
一個Statement對象,可以執行多個sql語句以后,批量更新。這多個語句可以是delete、update、insert等或兼有
2、PreparedStatement
PreparedStatement ps = cn.preparedStatement(sql);
{
ps.setXXX(1,xxx);
...
ps.addBatch();
}
ps.executeBatch();
一個PreparedStatement,可以把一個sql語句,變換參數多次執行,一次更新。
事務的處理
1、關閉Connection的自動提交
cn.setAutoCommit(false);
2、執行一系列sql語句
要點:執行每一個新的sql語句前,上一次執行sql語句的Statement(或者PreparedStatemet)必須先close
Statement sm ;
sm = cn.createStatement(insert into user...);
sm.executeUpdate();
sm.close();
sm = cn.createStatement("insert into corp...);
sm.executeUpdate();
sm.close();
3、提交
cn.commit();
4、如果發生異常,那么回滾
cn.rollback();
總結
以上是生活随笔為你收集整理的java resultset 映射到实例_[Java]ResultSet的用法与实例的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 楚乔是洛河与皇上的女儿吗 楚乔真的是公主
- 下一篇: java se程序设计_JavaSE--