データの登録

13.4 データの登録

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

データを登録するプログラム

 入力フォームから登録する一連の情報を入力し、その情報をJDBCを利用してデータベースへ登録します。

実行結果

アプリケーション構成

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

➢ AccountDao4.java
package ch13;

import java.sql.*;

public class AccountDao4 {

	//接続用の情報をフィールドに定数として定義
	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 insert(AccountInfo accountinfo){
 		//変数宣言
 		Connection con = null;
 		Statement  smt = null;
 
 		//return用変数
 		int count = 0;
 
 		//SQL文
 		String sql = "INSERT INTO account VALUES('"
 					+ accountinfo.getId() + "','"
 					+ accountinfo.getName() + "','"
 					+ accountinfo.getEmail() + "','"
 					+ accountinfo.getAuthority() + "')";
 
 		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
② ファイル名 :insertForm.jsp
③ アクセスURL :http://localhost:8080/web_basic/view/ch13/insertForm.jsp

➢ insertForm.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() %>/InsertServlet">
 				<table style="margin:0 auto">
 					<tr>
 						<td style="width:60">ID</td>
 						<td ><input type=text size="30" name="id"></input></td>
 					</tr>
 					<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
③ 名前 :InsertServlet
④ スーパークラス :javax.servlet.http.HttpServlet
⑤ アクセスURL :insertForm.jspからの画面遷移でアクセスされる

➢ InsertServlet.java
package ch13;

import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;

public class InsertServlet 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オブジェクト宣言
 			AccountDao4 objDao4 = new AccountDao4();
 
 			//1件登録メソッドを呼び出し
 			int count = objDao4.insert(accountinfo);
 
 			//登録された件数を持ってinsertReceipt.jspにフォワード
 			request.setAttribute("count", count);
 
 		}catch (IllegalStateException e) {
 			error ="DB接続エラーの為、登録できませんでした。";
 
 		}catch(Exception e){
 			error ="予期せぬエラーが発生しました。<br>"+e;
 
 		}finally{
 			request.setAttribute("error", error);
 			request.getRequestDispatcher("/view/ch13/insertReceipt.jsp").forward(request, response);
 		}
 	}
 }
➢ web.xml
<servlet>
	<servlet-name>InsertServletMapping</servlet-name>
	<servlet-class>ch13.InsertServlet</servlet-class>
</servlet>
<servlet-mapping>
	<servlet-name>InsertServletMapping</servlet-name>
	<url-pattern>/InsertServlet</url-pattern>
</servlet-mapping>

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

➢ insertReceipt.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">検索ID入力画面</h2>
 			<hr style="height:3; background-color:#0000ff" />
 			<br>
 			<%= error %>
 			<% if(count != null){ %>
 				<%= count%>件のデータを登録しました。
 			<% } %>
 			<br>
 		</div>
 	</body>
 </html>

解説
 今回のプログラムでは、登録情報を入力するinsertForm.jspから入力されたデータをInsertServlet.java内の22行目から25行目で受け取り、アカウント情報を管理するオブジェクトへセットします。
   22:accountinfo.setId(request.getParameter("id"));
   23:accountinfo.setName(request.getParameter("name"));
   24:accountinfo.setEmail(request.getParameter("email"));
   25:accountinfo.setAuthority(request.getParameter("authority"));

 その後、31行目でDAOクラス内に定義されたinsert()メソッドにアカウント情報を管理するオブジェクトを渡し、データベースへ登録を行います。
   31:int count = objDao4.insert(accountinfo);

 insert()メソッドは登録件数が戻り値として定義されており、戻り値として受け取った登録件数を34行目でリクエストスコープへ登録しています。

 insertReceipt.jspではリクエストスコープへ登録された件数を取得し、画面へ表示しています。
   19:<%= count%>件のデータを登録しました。

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

図 13.4.1 データ登録後の一覧表示

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

データ登録時の注意点

 MySQLに作成したaccountテーブルは、IDの情報が主キーとして設定されています。そのため、データを登録する場合はIDが重複しないように注意する必要があります。
 誤って重複したIDで登録を行うと、以下のようにエラーが発生します。


NEXT>> 13.5 データの更新