データの更新
13.5 データの更新
本節では、WebアプリケーションからJDBCを利用し、MySQLデータベースに登録されたデータを更新する方法について学習します。
データを更新するプログラム
入力フォームから更新対象のIDと更新後の情報を入力し、入力された情報をもとにMySQLデータベースに登録されたデータを更新します。
実行結果

アプリケーション構成

➢ AccountDao5.java① ソース・フォルダ :web_basic/WEB-INF/src
② パッケージ :ch13
③ 名前 :AccountDao5
package ch13;
import java.sql.*;
public class AccountDao5 {
//接続用の情報をフィールドに定数として定義
private static String RDB_DRIVE = "com.mysql.jdbc.Driver";
private static String URL = "jdbc:mysql://localhost/accountdb";
private static String USER = "root";
private static String PASS = "root123";
//データベース接続を行うメソッド
public static Connection getConnection(){
try{
Class.forName(RDB_DRIVE);
Connection con = DriverManager.getConnection(URL, USER, PASS);
return con;
}catch(Exception e){
throw new IllegalStateException(e);
}
}
//データベースのデータを更新するメソッド
public int update(AccountInfo accountinfo){
//変数宣言
Connection con = null;
Statement smt = null;
//return用変数
int count = 0;
//SQL文
String sql = "UPDATE account SET "
+ "name = '" + accountinfo.getName() + "', "
+ "email = '" + accountinfo.getEmail() + "', "
+ "authority = '" + accountinfo.getAuthority() + "' "
+ "WHERE id = '" + accountinfo.getId() + "'";
try{
con = getConnection();
smt = con.createStatement();
//SQLをDBへ発行
count = smt.executeUpdate(sql);
}catch(Exception e){
throw new IllegalStateException(e);
}finally{
//リソースの開放
if(smt != null){
try{smt.close();}catch(SQLException ignore){}
}
if(con != null){
try{con.close();}catch(SQLException ignore){}
}
}
return count;
}
}
➢ updateForm.jsp① 親フォルダの入力または選択 :web_basic/view/ch13
② ファイル名 :updateForm.jsp
③ アクセスURL :http://localhost:8080/web_basic/view/ch13/updateForm.jsp
<%@page contentType="text/html; charset=UTF-8"%> <html> <head> <title>データを更新する</title> </head> <body> <div style="text-align:center"> <h2 style="text-align:center">更新データ入力画面</h2> <hr style="height:3; background-color:#0000ff" /> <br> <form action="<%=request.getContextPath() %>/UpdateServlet"> 更新するIDを入力してください。 <table style="margin:0 auto"> <tr> <td style="width:60">ID</td> <td ><input type=text size="30" name="id"></input></td> </tr> </table> <hr style="height:3; background-color:#0000ff" /> <br> 更新後の情報を入力してください。 <table style="margin:0 auto"> <tr> <td style="width:60">名前</td> <td ><input type=text size="30" name="name"></input></td> </tr> <tr> <td style="width:70">アドレス</td> <td ><input type=text size="30" name="email"></input></td> </tr> <tr> <td style="width:60">権限</td> <td > <select name="authority"> <option value="管理者">管理者</option> <option value="一般">一般</option> </select> </td> </tr> <tr> <td colspan=2 style="text-align:center"> <input type="submit" value="更新"> </td> </tr> </table> </form> <br> </div> </body> </html>
➢ UpdateServlet.java① ソース・フォルダ :web_basic/WEB-INF/src
② パッケージ :ch13
③ 名前 :UpdateServlet
④ スーパークラス :javax.servlet.http.HttpServlet
⑤ アクセスURL :updateForm.jspからの画面遷移でアクセスされる
package ch13;
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
public class UpdateServlet extends HttpServlet{
public void doGet(HttpServletRequest request ,HttpServletResponse response)
throws ServletException ,IOException{
String error = "";
try{
//文字エンコーディングの指定
request.setCharacterEncoding("UTF-8");
//DTOオブジェクト宣言
AccountInfo accountinfo = new AccountInfo();
//パラメータの取得
accountinfo.setId(request.getParameter("id"));
accountinfo.setName(request.getParameter("name"));
accountinfo.setEmail(request.getParameter("email"));
accountinfo.setAuthority(request.getParameter("authority"));
//DAOオブジェクト宣言
AccountDao5 objDao5 = new AccountDao5();
//更新メソッドを呼び出し
int count = objDao5.update(accountinfo);
//更新件数をリクエストスコープに登録
request.setAttribute("count", count);
}catch (IllegalStateException e) {
error ="DB接続エラーの為、更新できませんでした。";
}catch(Exception e){
error ="予期せぬエラーが発生しました。<br>"+e;
}finally{
request.setAttribute("error", error);
request.getRequestDispatcher("/view/ch13/updateReceipt.jsp").forward(request, response);
}
}
}
➢ web.xml<servlet> <servlet-name>UpdateServletMapping</servlet-name> <servlet-class>ch13.UpdateServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>UpdateServletMapping</servlet-name> <url-pattern>/UpdateServlet</url-pattern> </servlet-mapping>
➢ updateReceipt.jsp① 親フォルダの入力または選択 :web_basic/view/ch13
② ファイル名 :updateReceipt.jsp
③ アクセスURL :UpdateServlet.javaからの画面遷移でアクセスされる
<%@page contentType="text/html; charset=UTF-8"%>
<%
Integer count = (Integer)request.getAttribute("count");
String error = (String)request.getAttribute("error");
%>
<html>
<head>
<title>データを更新する</title>
</head>
<body>
<div style="text-align:center">
<h2 style="text-align:center">更新結果画面</h2>
<hr style="height:3; background-color:#0000ff" />
<br>
<%= error %>
<% if(count != null){ %>
<%= count%>件のデータを更新しました。
<% } %>
<br>
</div>
</body>
</html>
解説
今回のプログラムは、前節で作成したデータを登録するプログラムとほぼ同じ動きを行っています。異なるのは、情報を入力する画面と表示する画面のレイアウトと、DAOクラスに定義されたメソッドの2点です。
DAOクラスでは、引数に受け取った情報をもとにデータを更新するupdate()メソッドが定義されています。このupdate()メソッドをUpdateServlet.javaの31行目で利用することによって、データベースに登録されたデータの更新を行っています。
update ()メソッドもinsert()メソッド同様に更新件数が戻り値として定義されており、戻り値として受け取った更新件数を34行目でリクエストスコープへ登録しています。
登録された更新件数はupdateReceipt.jspで取得され、画面へ表示されます。
データを登録するプログラムと同様に、このプログラムでも更新された件数のみが表示されます。データが正しく更新されたかどうかを確認する場合は、13.3.1項で作成した一覧を表示するプログラムを実行してください。

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