1. 程式人生 > >JDBC API 可滾動可編輯的結果集

JDBC API 可滾動可編輯的結果集

state reat 技術 password create 新的 數據庫鏈接 控制 技術分享

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 可滾動可編輯的結果集