JDBC 中的 CONCUR_READ_ONLY ResultSet 是什麼?解釋一下?
通常情況下,你可以將此值作為 ResultSet Concurrency 型別的 createStatement() 方法的值傳遞。
Statement createStatement(int resultSetType, int resultSetConcurrency)
此型別結果集不可更新。即,一旦獲取了 ResultSet 物件,就無法更新其內容。
示例
假設我們在資料庫中有一張名為 Employee 的表,其中包含如下內容
+----+---------+--------+----------------+ | Id | Name | Salary | Location | +----+---------+--------+----------------+ | 1 | Amit | 3000 | Hyderabad | | 2 | Kalyan | 4000 | Vishakhapatnam | | 3 | Renuka | 6000 | Delhi | | 4 | Archana | 96000 | Mumbai | | 5 | Sumith | 11000 | Hyderabad | | 6 | Rama | 11000 | Goa | | 7 | Mahesh | 5300 | Vishakhapatnam | | 8 | Ramesh | 12000 | Hyderabad | | 9 | Suresh | 7600 | Pune | | 10 | Santosh | 96000 | Mumbai | +----+---------+--------+----------------+
在以下示例中,我們嘗試將員工的薪水值增加 5000,並列印結果。
import java.sql.*;
public class Updatable {
public static void main(String[] args) throws Exception {
//Registering the Driver
DriverManager.registerDriver(new com.mysql.jdbc.Driver());
//Getting the connection
String mysqlUrl = "jdbc:mysql:///TestDB";
Connection con = DriverManager.getConnection(mysqlUrl, "root", "password");
System.out.println("Connection established......");
//Creating a Statement object
Statement stmt = con.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_READ_ONLY);
//Retrieving the data
ResultSet rs = stmt.executeQuery("select * from Employees");
//Printing the contents of the table
System.out.println("Contents of the table: ");
rs.beforeFirst();
while(rs.next()) {
System.out.print("ID: " + rs.getInt("id"));
System.out.print(", Salary: " + rs.getInt("Salary"));
System.out.print(", Name: " + rs.getString("Name"));
System.out.println(", Location: " + rs.getString("Location"));
}
System.out.println();
//Moving the pointer to the starting point in the ResultSet
rs.beforeFirst();
//Updating the salary of each employee by 5000
while(rs.next()) {
//Retrieve by column name
int newSal = rs.getInt("Salary") + 5000;
rs.updateInt( "Salary", newSal );
rs.updateRow();
}
System.out.println("Conetnets of the resultset after increaing salaries");
rs.beforeFirst();
while(rs.next()) {
System.out.print("ID: " + rs.getInt("id"));
System.out.print(", Salary: " + rs.getInt("Salary"));
System.out.print(", Name: " + rs.getString("Name"));
System.out.println(", Location: " + rs.getString("Location"));
}
System.out.println();
}
}錯誤
由於我們建立的 ResultSet 是隻讀的,因此無法更新 ResultSet 的內容,並且會收到以下錯誤。
Connection established...... Contents of the table: ID: 1, Salary: 8000, Name: Amit, Location: Hyderabad ID: 2, Salary: 9000, Name: Kalyan, Location: Vishakhapatnam ID: 3, Salary: 11000, Name: Renuka, Location: Delhi ID: 4, Salary: 101000, Name: Archana, Location: Mumbai ID: 5, Salary: 16000, Name: Sumith, Location: Hyderabad ID: 6, Salary: 16000, Name: Rama, Location: Goa ID: 7, Salary: 10300, Name: Mahesh, Location: Vishakhapatnam ID: 8, Salary: 17000, Name: Ramesh, Location: Hyderabad ID: 9, Salary: 12600, Name: Suresh, Location: Pune ID: 10, Salary: 101000, Name: Santosh, Location: Mumbai Exception in thread "main" com.mysql.jdbc.NotUpdatable: Result Set not updatable.This result set must come from a statement that was created with a result set type of ResultSet.CONCUR_UPDATABLE, the query must select only one table, can not use functions and must select all primary keys from that table. See the JDBC 2.1 API Specification, section 5.6 for more details.This result set must come from a statement that was created with a result set type of ResultSet.CONCUR_UPDATABLE, the query must select only one table, can not use functions and must select all primary keys from that table. See the JDBC 2.1 API Specification, section 5.6 for more details. at com.mysql.jdbc.ResultSetImpl.updateInt(ResultSetImpl.java:8457) at com.mysql.jdbc.ResultSetImpl.updateInt(ResultSetImpl.java:8475) at NewSet.Updatable.main(Updatable.java:42)
廣告
資料結構
網路
RDBMS
作業系統
Java
iOS
HTML
CSS
Android
Python
C 程式設計
C++
C#
MongoDB
MySQL
Javascript
PHP