本篇文章接着上篇文章,还剩下一个知识点是,可滚动的结果接集和可更新的结果集。一般默认情况之下,多结果集是不可以显式滚动,移动选择的。如果想要做到,需要指定一些参数,那么本篇就接着介绍如何操作可滚动的结果集。
默认情况下,结果集是不可以滚动的,如果想要可滚动就需要通过重载的构造方法创建一个不同的Statement对象,如下:
Statement statement = dbConn.createStatement(type,concurrency);
//如果是预编译的Statement对象
PreparedStatement statement = dbConn.prepareStatement(command,type,concurrency);
其中,type的取值范围如下:
TYPE_FORWARD_ONLY 结果集不能滚动(默认)
TYPE_SCROLL_INSENSITIVE 结果集可以滚动,对原数据库不敏感
TYPE_SCROLL_SENSITIVE 结果集可以滚动,对原数据库敏感
而Concurrency的取值范围如下:
CONCUR_READ_ONLY 结果集不能用于更新数据库
CONCUR_UPDATEABLE 结果集可以用来更新数据库
Statement statement = dbConn.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY);
ResultSet rs = statement.executeQuery("SELECT * from users");
while(rs.next()){
System.out.println(rs.getRow());
}
上述代码将会打印从一开始打印知道结果集最后一行,我们看到,next方法可以滚动至上一行,previous方法可以滚动到下一行。这种逻辑可能正好和我们的逻辑相反,你可以认为整个结果集是倒置的。absolute(n)方法可以滚动到指定的行号位置,relative()方法可以滚动到相对于当前行号的指定位置。
while(rs.next()){
System.out.println(rs.getRow());
rs.relative(1);
}
这一段代码展示了各行输出的效果。
说完了结果集的滚动操作,下面介绍结果集的更新操作。那什么是结果集的可更新操作呢?就是指,从数据库中查询出来的结果集,我们通过操作此结果集会映射到数据库中。下面看看具体代码的实现。
Statement statement = dbConn.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_UPDATABLE);
ResultSet rs = statement.executeQuery("SELECT * from users");
rs.next();
rs.updateString("pass","1");
rs.updateRow();
statement.close();
dbConn.close();
上述代码中主要涉及到了三条语句,createStatement中参数传递的更改。第二,rs.updateString("pass","1");,我们更改结果集中的信息都是使用的方法UpdateXXX,和我们的getXXX类似。最后一句是非常重要的,之前的所有更改操作都是对于结果集的操作,而最后一句rs.updateRow();则是将结果集的更改内容映射到数据库中。如果在使用中忘记添加了这局代码的调用,之前的所有更改将会被丢弃。至于updateXXX中,XXX的类型,只要sql中有的类型,都会对应一个调用时的类型。nvarchar对应我们的string,int对应int等。
除了修改结果集,我们还可以添加行到结果集中,删除结果集中当前的行。具体操作如下:
rs.moveToInsertRow();
rs.updateInt("id",20);
rs.updateString("name","walker");
rs.insertRow();
rs.moveToCurrentRow();
第一句代码moveToInsertRow,将游标移动到了特定的位置,从当前行离开,到结果集的末尾位置,调用update方法为每个字段赋值,没赋值的统统为null,然后调用insertRow插入到结果集中并且映射数据库。最后一条语句moveToCurrentRow,返回之前离开的位置。
删除结果集中的某一行就比较简洁:
rs.deleteRow();
就一条语句表示从结果集中将当前游标执行的行删除并且同步映射数据库。
至此,jdbc的简单用法就介绍完了,如果其中有错误,望大家指出!