データの更新

13.5 データの更新

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

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

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

実行結果

アプリケーション構成

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

➢ AccountDao5.java
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;
 	}
 }

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

➢ 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>

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

➢ UpdateServlet.java
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>

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

➢ updateReceipt.jsp
<%@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行目で利用することによって、データベースに登録されたデータの更新を行っています。
   31:int count = objDao5.update(accountinfo);

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

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

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

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

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


NEXT>> 13.6 データの削除