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