データの更新

13.5 データの更新

 本節では、WebアプリケーションからJDBCを利用し、MariaDBデータベースに登録されたデータを更新する方法について学習します。

データを更新するプログラム

 入力フォームから更新対象のIDと更新後の情報を入力し、入力された情報をもとにMariaDBデータベースに登録されたデータを更新します。

実行結果

アプリケーション構成

① ソース・フォルダ :web_basic/src/main/java
② パッケージ :ch13
③ 名前 :AccountDao5

➢ AccountDao5.java
※37行目の文字列”UPDATE account SET “の末尾には半角スペースが入っています
1package ch13;
2 
3import java.sql.Connection;
4import java.sql.DriverManager;
5import java.sql.SQLException;
6import java.sql.Statement;
7 
8public class AccountDao5 {
9 
10    //接続用の情報をフィールドに定数として定義
11    private static String RDB_DRIVE = "org.mariadb.jdbc.Driver";
12    private static String URL = "jdbc:mariadb://localhost/accountdb";
13    private static String USER = "root";
14    private static String PASS = "root123";
15  
16    //データベース接続を行うメソッド
17    public static Connection getConnection(){
18        try{
19            Class.forName(RDB_DRIVE);
20            Connection con = DriverManager.getConnection(URL, USER, PASS);
21            return con;
22        }catch(Exception e){
23            throw new IllegalStateException(e);
24        }
25    }
26  
27    //データベースのデータを更新するメソッド
28    public int update(AccountInfo accountinfo){
29        //変数宣言
30        Connection con = null;
31        Statement  smt = null;
32  
33        //return用変数
34        int count = 0;
35  
36        //SQL文
37        String sql = "UPDATE account SET "
38            + "name = '" + accountinfo.getName() + "', "
39            + "email = '" + accountinfo.getEmail() + "', "
40            + "authority = '" + accountinfo.getAuthority() + "' "
41            + "WHERE id = '" + accountinfo.getId() + "'";
42  
43        try{
44            con = getConnection();
45            smt = con.createStatement();
46  
47            //SQLをDBへ発行
48            count = smt.executeUpdate(sql);
49  
50        }catch(Exception e){
51            throw new IllegalStateException(e);
52        }finally{
53            //リソースの開放
54            if(smt != null){
55                try{smt.close();}catch(SQLException ignore){}
56            }
57            if(con != null){
58                try{con.close();}catch(SQLException ignore){}
59            }
60        }
61        return count;
62    }
63 }

① 親フォルダの入力または選択 :web_basic/src/main/webapp/view/ch13
② ファイル名 :updateForm.jsp
③ アクセスURL :http://localhost:8080/web_basic/view/ch13/updateForm.jsp

➢ updateForm.jsp
1<%@page contentType="text/html; charset=UTF-8"%>
2 
3<html>
4    <head>
5        <title>データを更新する</title>
6    </head>
7    <body>
8        <div style="text-align:center">
9            <h2 style="text-align:center">更新データ入力画面</h2>
10            <hr style="height:3; background-color:#0000ff" />
11            <br>
12            <form action="<%=request.getContextPath() %>/UpdateServlet">
13                更新するIDを入力してください。
14                <table style="margin:0 auto">
15                    <tr>
16                        <td style="width:60">ID</td>
17                        <td ><input type=text size="30" name="id"></input></td>
18                    </tr>
19                </table>
20                <hr style="height:3; background-color:#0000ff" />
21                <br>
22                更新後の情報を入力してください。
23                <table style="margin:0 auto">
24                    <tr>
25                        <td style="width:60">名前</td>
26                        <td ><input type=text size="30" name="name"></input></td>
27                    </tr>
28                    <tr>
29                        <td style="width:70">アドレス</td>
30                        <td ><input type=text size="30" name="email"></input></td>
31                    </tr>
32                    <tr>
33                        <td style="width:60">権限</td>
34                        <td >
35                            <select name="authority">
36                                <option value="管理者">管理者</option>
37                                <option value="一般">一般</option>
38                            </select>
39                        </td>
40                    </tr>
41                    <tr>
42                        <td colspan=2 style="text-align:center">
43                            <input type="submit" value="更新">
44                        </td>
45                    </tr>
46                </table>
47            </form>
48            <br>
49        </div>
50    </body>
51 </html>

① ソース・フォルダ :web_basic/src/main/java
② パッケージ :ch13
③ 名前 :UpdateServlet
④ スーパークラス :jakarta.servlet.http.HttpServlet
⑤ アクセスURL :updateForm.jspからの画面遷移でアクセスされる

➢ UpdateServlet.java
1package ch13;
2 
3import java.io.IOException;
4 
5import jakarta.servlet.ServletException;
6import jakarta.servlet.annotation.WebServlet;
7import jakarta.servlet.http.HttpServlet;
8import jakarta.servlet.http.HttpServletRequest;
9import jakarta.servlet.http.HttpServletResponse;
10 
11@WebServlet("/UpdateServlet")
12public class UpdateServlet extends HttpServlet{
13    public void doGet(HttpServletRequest request ,HttpServletResponse response)
14            throws ServletException ,IOException{
15  
16        String error = "";
17  
18        try{
19            //DTOオブジェクト宣言
20            AccountInfo accountinfo = new AccountInfo();
21  
22            //パラメータの取得
23            accountinfo.setId(request.getParameter("id"));
24            accountinfo.setName(request.getParameter("name"));
25            accountinfo.setEmail(request.getParameter("email"));
26            accountinfo.setAuthority(request.getParameter("authority"));
27  
28            //DAOオブジェクト宣言
29            AccountDao5 objDao5 = new AccountDao5();
30  
31            //更新メソッドを呼び出し
32            int count = objDao5.update(accountinfo);
33  
34            //更新件数をリクエストスコープに登録
35            request.setAttribute("count", count);
36  
37        }catch (IllegalStateException e) {
38            error ="DB接続エラーの為、更新できませんでした。";
39  
40        }catch(Exception e){
41            error ="予期せぬエラーが発生しました。<br>"+e;
42  
43        }finally{
44            request.setAttribute("error", error);
45            request.getRequestDispatcher("/view/ch13/updateReceipt.jsp").forward(request, response);
46        }
47    }
48 }

① 親フォルダの入力または選択 :web_basic/src/main/webapp/view/ch13
② ファイル名 :updateReceipt.jsp
③ アクセスURL :UpdateServlet.javaからの画面遷移でアクセスされる

➢ updateReceipt.jsp
1<%@page contentType="text/html; charset=UTF-8"%>
2 
3<%
4Integer count = (Integer)request.getAttribute("count");
5String error = (String)request.getAttribute("error");
6%>
7 
8<html>
9    <head>
10        <title>データを更新する</title>
11    </head>
12    <body>
13        <div style="text-align:center">
14            <h2 style="text-align:center">更新結果画面</h2>
15            <hr style="height:3; background-color:#0000ff" />
16            <br>
17            <%= error %>
18            <% if(count != null){ %>
19                <%= count%>件のデータを更新しました。
20            <% } %>
21            <br>
22        </div>
23    </body>
24 </html>

解説
 今回のプログラムは、前節で作成したデータを登録するプログラムとほぼ同じ動きを行っています。異なるのは、情報を入力する画面と表示する画面のレイアウトと、DAOクラスに定義されたメソッドの2点です。

 DAOクラスでは、引数に受け取った情報をもとにデータを更新するupdate()メソッドが定義されています。このupdate()メソッドをUpdateServlet.javaの32行目で利用することによって、データベースに登録されたデータの更新を行っています。
   32:int count = objDao5.update(accountinfo);

 update ()メソッドもinsert()メソッド同様に更新件数が戻り値として定義されており、戻り値として受け取った更新件数を34行目でリクエストスコープへ登録しています。
   35:request.setAttribute("count", count);

 登録された更新件数はupdateReceipt.jspで取得され、画面へ表示されます。
   19:<%= count%>件のデータを更新しました。

 データを登録するプログラムと同様に、このプログラムでも更新された件数のみが表示されます。データが正しく更新されたかどうかを確認する場合は、13.3.1項で作成した一覧を表示するプログラムを実行してください。

図 13.6.1 データ更新後の一覧表示

 次の節では簡単なデータを削除するWebアプリケーションを作成し、データの更新方法を学習します。


NEXT>> 13.6 データの削除

f