开发的朋友,在操作数据库的时候,相信绝大部分人都用过它。但它不仅仅就是一个结果集的纯载体,仅仅只有存储的功能。下面就简略说一下它的功能。
结果集大体上可以分为四类,它们各有特点,基本上都和Statement语句的创建方式有关。
1、基本型(最基本,用得最广泛)
创建方式:无参数创建型
Statement st = conn.CreateStatement
ResultSet rs = Statement.excuteQuery(sqlStr);
特点:这种最简单,没有特别的功能(不支持滚动、更新等等),只能用next()逐个单方向去读取数据。
2、滚动型
创建方式:参数创建型
Statement st = conn.createStatement(int resultSetType, int resultSetConcurrency)
ResultSet rs = st.executeQuery(sqlStr)
参数:
resultSetType是设置ResultSet对象的类型可滚动
resultSetConcurency是设置ResultSet对象能够修改的
具体的参数值见ResultSet.
特点:(和具体参数的设置有关。)这种类型支持滚动获取记录,可以向前向后操作,类似于分页功能的操作方式。如支持:next()、previous()、first()、absolute(int n)等等。
3、更新型
创建方式:(和2一样,不过参数选取不同)
Statement st = createstatement(Result.TYPE_SCROLL_INSENSITIVE,Result.CONCUR_UPDATABLE)
特点:可以完成对数据库的更新操作。更新的方法是,把ResultSet的游标移动到你要更新的行,然后调用updateXXX(),再用updateRow()完成对数据库的写入。
限制/要求:(1)对单表操作。(2)不包含join或者group by子句。
4、保持型
创建方式:
Statement st=createStatement(int resultsetscrollable,int resultsetupdateable,int resultsetSetHoldability)
ResultSet rs = st.excuteQuery(sqlStr);
参数:只介绍第三个resultsetSetHoldability,表示在结果集提交后结果集是否打开,其值为
ResultSet.HOLD_CURSORS_OVER_COMMIT:表示修改提交时,不关闭数据库。
ResultSet.CLOSE_CURSORS_AT_COMMIT:表示修改提交时ResultSet关闭
特点:一般情况下,在使用Statement执行完一个查询,又去执行另一个查询的时候,第一个查询的结果集就会被关闭。该方式可以自由设定是否关闭结果集。
限制/要求:(1)只是在JDBC3.0的驱动下才能成立。
可更新的结果集:
更新一行:
UpdateXXX()è cancelRowUpdates()èupdateRow()èrowUpdated()。
UpadateXXX()方法只能修改当前行的数据,并不能修改数据库中的数据,所以在调用updateXXX()后,还要调用updateRow()方法,用当前行中的新数据更新数据库。
CancelRowUpdates()方法用来放弃对当前行的修改,注意,要让这个方法有效,必须在调用updteRow()方法之前调用它。
rowUpdated()方法来判断当前行是否被更新。
插入行:
moveToInsertRow()方法移动游标到插入行,插入行是一个与可更新的结果集相联系的特殊的缓存行。
moveToInsertRow()èupdateXXX()ègetXXX()èinsertRow()èrowInserted()
insertRow()将新行传递给数据库,从而在新数据库中真正插入一行数据
rowInserted()方法来判断当前行是否是插入行。
删除一行:
deletRow()从结果集中和数据库中删除一行,当游标指向插入行的时候,不能调用这个方法。一个被删除的行可能在结果集中留下一个空的位置,可以调用 rowDeleted()方法来判断一行是否被删除。
可更新结果集的使用必须满足下面3个条件:
1, 只能是针对数据库中单张表单的查询
2, 查询语句中不能包含任何的join操作。
3, 查询操作的表中必须有主键,而且在查询的结果集中必须包含作为主键的字段。
结果集中执行插入操作,还应该满足下面两个条件
1, 查询操作必须选择数据库表中所有不能为空的列
2, 查询操作必须选择所有没有默认值的列。
判断ResultSet是否为空
ResultSet rs=stmt.executeQuery(sql);
rs == null;
rs.size()这个方法没有的
rs为ResultSet的引用,即使结果集里有0条记录,rs也不为空,所以用rs == null来判断结果集里是否有0条记录是错误的,而要用 rs.getRow(); 为0则表示没有记录--使用的时候也有问题
使用rs.next()是否为true来判断,会使游标前移一位,可能丢掉一条记录,不合适
boolean hasRows = false;
下面的方法较合适
while (rs.next()){
hasRows = true;
//Do your stuff
}
if (!hasRows ){
//Empty result set
}
//You dont have to test for null result set