• 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()方法来进行删除当前游标所指定的行。

  • 相关阅读:
    「POJ 2699」The Maximum Number of Strong Kings
    「HNOI 2013」切糕
    「PKUSC 2018」真实排名
    「国家集训队 2009」最大收益
    「TJOI2015」线性代数
    「BZOJ 3280」小R的烦恼
    「SDOI 2017」新生舞会
    「六省联考 2017」寿司餐厅
    「TJOI 2013」循环格
    「TJOI 2013」攻击装置
  • 原文地址:https://www.cnblogs.com/heisehenbai/p/7886556.html
Copyright © 2020-2023  润新知