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