import java.sql.*;
/**
* 此例說明的問題:創建Statement對象時控制結果集類型;
* @author chb
*/
class Hello
{
public static void main(String args[])
{
try
{
/**
* 第一步:加載JDBC驅動;
*/
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
/**
* 第二步:建立連接;
*/
String url="jdbc:odbc:bookdsn";
Connection con=DriverManager.getConnection(url,"sa","");
/**
* 第三步:創建Statement,執行查詢並得到結果集;
* 在此步,可以控制結果集類型、結果集併發類型、可保持結果集;
* createStatement(結果集類型,結果集併發類型,可保持結果集);
*
* 結果集類型:
* ResultSet.TYPE_FORWARD_ONLY ---只能調用next()向下移動,爲默認值,結果集爲靜態;
* ResultSet.TYPE_SCROLL_INSENSITIVE -- 可自由移動,結果集爲靜態;
* ResultSet.TYPE_SCROLL_SENSITIVE -- 可自由移動,結果集爲動態遊標;
*
* 結果集併發類型:
* ResultSet.CONCUR_READ_ONLY -- 默認,結果集只讀;
* ResultSet.CONCUR_UPDATABLE -- 結果集可更新;
*
* 可保持結果集:
* 通常情況下,提交事務時,操作會關閉當前事務創建的ResultSet對象或者光標;
* ResultSet.HOLD_CURSORS_OVER_COMMIT -- 事務結束後結果集依然保持打開狀態;
* ResultSet.CLOSE_CURSORS_AT_COMMIT -- 事務提交後結果集會被關閉;
* 注:該特性從JDBC3.0開始支持,且有些數據庫不支持此操作;
*
* 如果execute返回多個記錄集,getMoreResultSets方法可使用3個參數:
* Statement.CLOSE_CURRENT_RESULT -- 調用新結果集時關閉當前結果集;
* Statement.KEEP_CURRENT_RESULT -- 調用新結果集時不關閉當前結果集;
* Statement.CLOSE_ALL_RESULTS -- 調用新結果集時關閉原有所有結果集;
* 注:該特性從JDBC3.0開始支持;
*/
Statement stmt=con.createStatement(
ResultSet.TYPE_FORWARD_ONLY,
ResultSet.CONCUR_READ_ONLY);
//ResultSet.HOLD_CURSORS_OVER_COMMIT);
ResultSet rs=stmt.executeQuery("SELECT ID,book_name,book_price,book_quantity from book_stock");
/**
* 第四步:處理結果集;
*/
System.out.println("編號 圖書名稱 圖書單價 圖書數量 ");
while(rs.next())
{
int id=rs.getInt("ID");
String book_name=rs.getString("book_name");
double book_price=rs.getDouble("book_price");
int book_quantity=rs.getInt("book_quantity");
System.out.println(id+" "+book_name+" "+book_price+" "+book_quantity);
}
/**
* 創建可自由移動結果集;
* afterLast() -- 移動到最後一條之後;
* last() -- 移動到最後一行可使用
* previous() -- 向上移動一行
* next() -- 向下移動一行
* beforeFirst()-- 移動到第一行之前
*/
stmt.close();
stmt=con.createStatement(
ResultSet.TYPE_SCROLL_INSENSITIVE,
ResultSet.CONCUR_READ_ONLY);
rs=stmt.executeQuery("SELECT ID,book_name,book_price,book_quantity from book_stock");
rs.afterLast();//
System.out.println("isAfterLast:" + rs.isAfterLast() );
rs.beforeFirst();
System.out.println("isBeforeFirst:" + rs.isBeforeFirst() );
rs.last();
System.out.println("isLast:" + rs.isLast() );
rs.previous();
System.out.println("isLast:" + rs.isLast() );
/**
* 第五步:關閉連接、結果集;
*/
rs.close();
stmt.close();
con.close();
}
catch(Exception e)
{
System.out.println("發生異常:"+e);
}
}
}