::在可滚动结果集中移动游标
下面的代码可以创建一个可滚动结果集:
Statement stmt = con.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,
ResultSet.CONCUR_UPDATABLE);
(注意那两个方法参数)
第一个参数用来表明ResultSet的类型(可否滚动),第二个参数用来说明只读还是可更新。
可以用 int type=rs.getType()方法检查是否为可滚动结果集。
下面一段代码可以用来倒着打印结果集:
ResultSet rs=stmt.executeQuery("select cof_name from coffees ");
rs.afterLast();
while(rs.previous()){
String s=rs.getString(1);
System.out.println(s);
}
用absolute()和relative()可以把游标移动到指定的行,其中absolute()中的游标的计算方法是绝对值,也就是说它每次都是第一行开始计算,relative()方法是相对于目前游标所在位置计算,
可以用getRow()来返回游标目前所在位置:
rs.absolute(5);
int rowNum=rs.getRow();
还有方法 isFirst(),isLast(),isBeforeFirst(),isAfterLast()
用来看游标是否在特定的位置。
::对可更新的结果进行更新:
当创建好的一个结果集是可更新的时,就可以用编程的方式对其进行更新,
rs.last();
rs.updateFloat("price", 100f);
这段代码可以实现的功能是把当前行的price所指行的值改为100,它只可以更新结果集中的数据,如果要更新数据库表中的数据,就必须再加上一条rs.updateRow()语句,并且必须在移动游标以前用这条语句,在调用rs.updateRow()语句前可以调用rs.cancelRowUpdate()取消先前的更改,但如果用rs.updateRow()更新了数据库,那么用rs.cancelRowUpdate()就没用了,
当然也可以进行插入和删除行,下面是一段实现代码:
rs.moveToInsertRow();
rs.updateString(“cof_name”,”cona”);
.
.
rs.insertRow();
可以用rs.deleteRow()方法删除行,同时删除结果集和表中的数据
(注:上面所说的技术,在我的环境下不能实现,可能是这个版本mysql不支持这个技术,)
::建立批量更新:
批量技术只能用于DDL语句和更新语句,它是用一个命令列表来实现,
con.setAutoCommit(false);//关闭自动提交模式
Statement stmt=con.createStatement();
stmt.executeUpdate("create table whl( id integer,name varchar(20),age integer)");
stmt.addBatch("insert into whl values(1,'whl',20)");//将SQL增加到命令列表中
stmt.addBatch("insert into whl values(2,'nj',20)");
stmt.addBatch("insert into whl values(3,'java',30)");
stmt.addBatch("insert into whl values(4,'jsp',10)");
int[] updatecounts=stmt.executeBatch();//将这个列表中的SQL语句发送到数据库,它会返回一个int[]数组,对每一条语句的执行情况进行记录。
con.commit();//批量更新永久生效,
con.setAutoCommit(true);