java.sql,javax.sql,javax.naming包
默认TYPE_FORWARD_ONLY:
结果集只能向前滚动,只能调用next(),不能重定位游标
TYPE_SCROLL_INSENSITIVE,
TYPE_SCROLL_SENSITIVE:可以重定位游标
TYPE_SCROLL_INSENSITIVE:底层修改不会反映到结果集
TYPE_SCROLL_SENSITIVE:会实时显示真实数据
默认CONCUR_READ_ONLY:不能更新到底层,只是读取
CONCUR_UPDATABLE:可以更新,可以写入
stmt = con.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,//可滚动,实时显示
ResultSet.CONCUR_UPDATABLE);//可写入
ResultSet uprs = stmt.executeQuery(
"SELECT * FROM " + dbName + ".COFFEES"); while (uprs.next()) {
float f = uprs.getFloat("PRICE");
uprs.updateFloat( "PRICE", f * percentage);//设置某列
uprs.updateRow();//提交
}
stmt = con.createStatement(
ResultSet.TYPE_SCROLL_SENSITIVE
ResultSet.CONCUR_UPDATABLE); ResultSet uprs = stmt.executeQuery(
"SELECT * FROM " + dbName +
".COFFEES"); uprs.moveToInsertRow();//准备插入
uprs.updateString("COF_NAME", coffeeName);
uprs.updateInt("SUP_ID", supplierID);
uprs.updateFloat("PRICE", price);
uprs.updateInt("SALES", sales);
uprs.updateInt("TOTAL", total); uprs.insertRow();//提交
uprs.beforeFirst();//游标不能再指向这里
RowSet对象都是JavaBean组件
如果数据库不支持游标滚动,也不支持实时更新,可以用RowSet替代
RowSet有保持连接的和离线的两种
public void createProcedureGetSupplierOfCoffee()
throws SQLException { String createProcedure = null; // ... createProcedure =
"create procedure GET_SUPPLIER_OF_COFFEE(" +
"IN coffeeName varchar(32), " +//in
"OUT supplierName varchar(40)) " +//out
"begin " +
"select SUPPLIERS.SUP_NAME into " +
"supplierName " +
"from SUPPLIERS, COFFEES " +
"where SUPPLIERS.SUP_ID = " +
"COFFEES.SUP_ID " +
"and coffeeName = COFFEES.COF_NAME; " +
"select supplierName; " +
"end";
// ...
}
createProcedure =
"create procedure RAISE_PRICE(" +
"IN coffeeName varchar(32), " +
"IN maximumPercentage float, " +
"INOUT newPrice numeric(10,2)) " +//inout
"begin " +
"main: BEGIN " +
"declare maximumNewPrice " +
"numeric(10,2); " +
"declare oldPrice numeric(10,2); " +
"select COFFEES.PRICE into oldPrice " +
...
cs = this.con.prepareCall("{call GET_SUPPLIER_OF_COFFEE(?, ?)}");
cs.setString(1, coffeeNameArg);
cs.registerOutParameter(2, Types.VARCHAR);
cs.executeQuery(); String supplierName = cs.getString(2);
cs = this.con.prepareCall("{call RAISE_PRICE(?,?,?)}");
cs.setString(1, coffeeNameArg);
cs.setFloat(2, maximumPercentageArg);
cs.registerOutParameter(3, Types.NUMERIC);
cs.setFloat(3, newPriceArg); cs.execute(); Because the parameter newPrice (the third parameter in the procedure