郑州软件开发公司网站城乡建设查询网站
web/
2025/10/4 0:58:54/
文章来源:
郑州软件开发公司网站,城乡建设查询网站,网站内页做友情链接,wordpress 权限修改【0】README
1#xff09; 本文部分文字描述转自 core java volume 2 #xff0c; 测试源代码均为原创#xff0c; 旨在理解 java数据库编程——可滚动和可更新的结果集 的基础知识 #xff1b; 2#xff09;for database connection config, please visit #xff1a;…【0】README
1 本文部分文字描述转自 core java volume 2 测试源代码均为原创 旨在理解 java数据库编程——可滚动和可更新的结果集 的基础知识 2for database connection config, please visit https://github.com/pacosonTang/core-java-volume/blob/master/coreJavaAdvanced/chapter4/database.properties 3用户通常希望在结果集上前后滚动。在可滚动结果集中 可以在其中向前或向后移动 甚至可以跳过任意位置 【1】可滚动结果集
1默认情况结果集是不可滚动的
1.1为了从查询中获得可滚动的结果集 必须使用下面的方法得到一个不同的Statement 对象 Statement stat conn.createStatement(type, concurrency); 干货——获得滚动的结果集1.2如果要获得预备语句 请调用下面的方法 PreparedStatement stat conn.preparedStatement(command, type, concurrency);
Attention下表列出了 type 和 concurrency 的所有可能值
A1是否希望结果集是滚动的A2如果结果集是滚动的 且数据库在查询生成结果集后发生了变化 那么是否希望结果集反应出这些变化A3是否希望通过编辑结果集就可以更新数据库 干货——以上3个Attention都是干货
2看个荔枝
2.1如果只想滚动遍历结果集 而不想编辑它 的数据那么可以使用以下语句 Statement stat conn.createStatement(ResultSet.Type_SCROLL_INSENSITIVE, ResultSet.CONCUR_READ_ONLY) 2.2现在通过调用以下方法获得 的所有结果集都将是可滚动的 ResultSet rs stat.executeQuery(query); 2.3 可滚动的 结果集有一个游标 用以指示当期位置
Attention
A1并不是所有的数据库驱动程序都支持可滚动和可更新的结果集A2使用 DatabaseMetadata 接口中的 supportsResultSetType 和 supportsResultSetConcurrency 方法 我们可以获知在使用特定的驱动程序时 某个数据库究竟支持哪些结果集类型以及哪些并发模式 干货——查看某个数据库究竟支持哪些结果集类型以及哪些并发模式A3也可以使用 ResultSet 接口中的 getType 和 getConcurrency 方法 查看结果集实际支持的模式
3滚动操作 干货——滚动集的滚动操作
3.1向后滚动 rs.previous() 如果游标位于一个实际的行上那么该方法将返回true 如果游标位于第一行之前那么就返回false3.2将游标向后或向前移动多行 rs.relative(n) n为正数 向前移动或负数 向后移动 n为0 不移动3.3将游标设置到指定的行号上 rs.absolute(n);3.4 调用以下方法将返回当前行的行号 int curRow rs.getRow();3.5结果的第一行是1 而不是0如果返回0 那么当前游标不在任何行上 它要么位于第一行前或最后一行之后 干货——可滚动结果集的第一行的index是1 而不是03.6其他操作 first last beforeFirst afterLast 方法 与 isFirst , isLast, isBeforeFirst, isAfterLast 方法
Attention rs.isAfterLast() 表示当前行游标是在最后一行之后吗。 而 rs.isLast() 表示这是最后一行吗。他们是有差别的。
4看个荔枝只打印奇数行的name
4.1for souce code, please visit : https://github.com/pacosonTang/core-java-volume/blob/master/coreJavaAdvanced/chapter4/ScrollResultSet.java4.2key source code at a glance:
public static void main(String[] args){try{try(Connection conn getConnection()){String sql select name from student;// TYPE_SCROLL_INSENSITIVE 结果集可以滚动但对数据库变化不敏感// CONCUR_READ_ONLY 且结果集不能用于更新数据库defaultStatement stat conn.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_READ_ONLY);ResultSet rs stat.executeQuery(sql);int rowno;while(true){rowno rs.getRow(); if(rowno 1){rs.absolute(1); // 将游标设置到指定的行号上}System.out.println(rowno rs.getRow());// attention for rs.getString not changing row cursorSystem.out.println(row[ rs.getRow() ] rs.getString(1));if(!rs.isLast()){// 将游标向后或向前移动多行 rs.relative(n) n为正数 向前移动或负数 向后移动 n为0 不移动rs.relative(2);}if(rs.isLast()){break;}}stat.close();conn.close();}}catch(Exception e){e.printStackTrace();}
4.3relative printing results as follows: 【2】可更新的结果集
1如果希望编辑结果集中的数据并且将结果集上的数据变更自动反应到数据库中 那么就必须使用可更新的结果集可更新的结果集并非必须是可滚动的 但如果将 数据提供给用户去编辑 那么通常也会希望结果集时可滚动的 干货——可更新的结果集并非必须是可滚动的 但如果将 数据提供给用户去编辑 那么通常也会希望结果集时可滚动的 干货——为什么引入可滚动的结果集 是为了将结果集上的数据变更自动反应到数据库中 2如果要获得可更新的结果集应该使用以下方法创建一条语句 Statement stat conn.createStatement( ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_UPDATEABLE); 这样 调用 executeQuery 方法返回的结果集就将是可更新的 结果集了 Attention
A1并非所有的查询都会返回可更新的结果集A2如果查询涉及多个表的连接操作 那么它所产生的结果集将是不可更新的A3可以调用 ResultSet 接口中的 getConcurrency 方法来确定结果集是否是可更新的
3看个荔枝 迭代遍历所有图书并更新它们的价格
String query select * from book;
ResultSet rs stat.executeQuery(query);
while(rs.next)
{if(...){double price rs.getDouble(price);rs.updateDouble(price, price 1000);rs.updateRow(); // 干货——以上两行是更新数据库的操作}
}
Attention
A1在使用第一个参数为列序号的updateXXX 方法时 请注意这里的列序号指的是该列在结果集中的序号 而不是数据库的中的列序号A2udpateXXX 方法改变的只是结果集中的行值 而非数据库 中的值当更新完字段后必须调用 updateRow 方法 这个方法将当前行中的更新信息发送给数据库 干货——当更新完字段后必须调用updateRow 方法A3cancelRowUpdates方法取消对当前行的更新
如果想在数据库中添加一行新纪录按如下步骤进行 干货——在可更新结果集中添加一行新记录到数据库
step1 使用 moveToInsertRow 方法 将游标移动到特定的位置 我们称之为插入行step2调用 udpateXXX 方法 在插入行的位置上创建一个新的行step3 调用insertRow 方法将新建的行发送给 数据库step4完成插入后调用 moveToCurrentRow 方法 将游标移动会调用 moveToCurrentRow 方法之前的位置
5看个实例程序
rs.moveToInsertRow();
rs.updateString(title, title);
rs.updateString(title1, title1);
rs.updateString(title2, title2);
...
rs.updateDouble(price, price);
rs.insertRow();
rs.moveToCurrentRow();
Attention
A1你无法控制在结果集或数据库中添加新数据的位置A2 对于在插入行中没有指定值的列将被设置为 null 而如果这个列有 not null 约束的话 那么将会抛出异常而这一行无法插入A3你可以使用以下方法删除游标所指的行 A3.1 rs.deleteRow();A3.2deleteRow 方法 会立即将该行从结果集和数据库中删除A3.3ResultSet 接口中的方法 updateRow insertRow deleteRow 方法的执行效果等同于 sql 命令中的update insert 和 delete 方法 6看个荔枝将奇数行的name追加_odd 偶数行的name追加_even)6.1for souce code, please visit : https://github.com/pacosonTang/core-java-volume/blob/master/coreJavaAdvanced/chapter4/UpdatableResultSet.java6.2key source code at a glance:
public static void main(String[] args){try{try(Connection conn getConnection()){String sql select id, name from student;// TYPE_SCROLL_SENSITIVE 结果集可以滚动且对数据库变化不敏感// CONCUR_UPDATABLE 且结果集能够应用于更新数据库Statement stat conn.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_UPDATABLE);// get 可更新的 结果集ResultSet rs stat.executeQuery(sql);int rowno;while(true){rowno rs.getRow(); if(rowno 1){rs.absolute(1); // 将游标设置到指定的行号上}if(rs.getRow() % 2 ! 0){rs.updateString(name, rs.getString(name) _odd);}else{rs.updateString(name, rs.getString(name) _even);}rs.updateRow();// attention for rs.getString not changing row cursorSystem.out.println(row[ rs.getRow() ] rs.getString(2));// 将游标向后或向前移动多行 rs.relative(n) n为正数 向前移动或负数 向后移动 n为0 不移动rs.relative(1);if(rs.isAfterLast()){break;}}stat.close();conn.close();}}catch(Exception e){e.printStackTrace();}
6.3relative printing results as follows:
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/86518.shtml
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!