JDBC API 可滚动可编辑的结果集

Posted 黑色很白

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JDBC API 可滚动可编辑的结果集相关的知识,希望对你有一定的参考价值。

JDBC的API中的链接数据和创建statement并且执行读取ResultSet大家已经很熟悉了,这边介绍设置statement的属性使结果集可以移动并且进行编辑同步回数据库。

Statement 有两个属性分别用来设置结果集ResultSet是否可以滚动以及是否可以编辑同步回数据库。

图片来自《java核心技术卷II-高级特性》,推荐阅读。

 

具体使用上代码:

try (Connection connection = DriverManager.getConnection(url, username, password)) {
            System.out.println("数据库链接成功!");

            try (Statement statement = connection.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_UPDATABLE)) {
                String command = "insert into a_dept(name) values(\'1\'),(\'2\')";
                int count = statement.executeUpdate(command);
                System.out.println("受影响行数:" + count);

                String selectSql = "select * from a_dept";

                try (ResultSet resultSet = statement.executeQuery(selectSql)) {
                    while (resultSet.next()) {
                        System.out.print("修改前id " + resultSet.getInt("id") + "的值是: ");
                        System.out.println(resultSet.getString("name"));
                        resultSet.updateString("name", "我是修改过的");
                        resultSet.updateRow();
                        System.out.print("修改后id " + resultSet.getInt("id") + "的值是: ");
                        System.out.println(resultSet.getString("name"));
                    }

                    resultSet.moveToInsertRow();
                    resultSet.updateString("name", "我是插入的");
                    resultSet.insertRow();
                    resultSet.beforeFirst();
                    System.out.println("打印出所有的值:");
                    while (resultSet.next()) {
                        System.out.print(resultSet.getInt("id") + ": ");
                        System.out.println(resultSet.getString("name"));
                    }
                }
            }
        }

  再贴上输出结果:

显而易见,从数据库取出的值在ResultSet中就被修改了,并且也被插入了一条新的数据。

1、在最后打印出所有的值之前有一行代码

resultSet.beforeFirst();

这行代码的作用是把ResultSet的游标移动到结果集第一行之前,这样子调用next()方法可以让游标下移进行读取下一行的数据。显而易见,在设置ResultSet.TYPE_SCROLL_SENSITIVE之前我们访问结果集只能够从头到尾访问,而现在我们可以随意的异动游标访问任一行.

2、再看修改数据的那一段代码,

                        resultSet.updateString("name", "我是修改过的");
                        resultSet.updateRow();

我们修改数据是使用updateXXX()方法进行修改,相应的还有updateInt()、updateBytes()、updateTime()等相对应的方法。

而在修改完成之后需要调用updateRow()方法,该方法会提交我们对这一行结果集的修改,需要注意的是如果我们没有提交对这一行的修改而继续访问下一行,那我们的修改就会作废。

3、看插入数据的那一段代码:

                    resultSet.moveToInsertRow();
                    resultSet.updateString("name", "我是插入的");
                    resultSet.insertRow();

执行插入操作的话需要先调用 moveToInsertRow() 方法把游标移动到特定的位置(我们无法控制插入的位置),之后再执行插入操作插入需要插入的column(我设计的表只有两个column:id和name,id是自动增长的,所以我只需要插入name)

在插入需要插入的column之后,需要调用insertRow()方法将新建的行发送给数据库,这才算是完成了插入操作。

4、我们其实还可以使用deleteRow()方法来进行删除当前游标所指定的行。

以上是关于JDBC API 可滚动可编辑的结果集的主要内容,如果未能解决你的问题,请参考以下文章

JDBC高级特性结果集,批量更新

从 Oracle DB 获取可滚动的结果集

如何从 getMetaData.getColumns() 返回可滚动的结果集?

Java Review(三十JDBC)

Java Review(三十JDBC)

使用可滚动结果集在休眠中批量读取数据