データの登録

13.4 データの登録

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

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

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

実行結果

アプリケーション構成

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

➢ AccountDao4.java
1package ch13;
2 
3import java.sql.*;
4 
5public class AccountDao4 {
6 
7    //接続用の情報をフィールドに定数として定義
8    private static String RDB_DRIVE = "com.mysql.jdbc.Driver";
9    private static String URL = "jdbc:mysql://localhost/accountdb";
10    private static String USER = "root";
11    private static String PASS = "root123";
12  
13    //データベース接続を行うメソッド
14    public static Connection getConnection(){
15        try{
16            Class.forName(RDB_DRIVE);
17            Connection con = DriverManager.getConnection(URL, USER, PASS);
18            return con;
19        }catch(Exception e){
20            throw new IllegalStateException(e);
21        }
22    }
23  
24    //データベースへデータを登録するメソッド
25    public int insert(AccountInfo accountinfo){
26        //変数宣言
27        Connection con = null;
28        Statement  smt = null;
29  
30        //return用変数
31        int count = 0;
32  
33        //SQL文
34        String sql = "INSERT INTO account VALUES('"
35                    + accountinfo.getId() + "','"
36                    + accountinfo.getName() + "','"
37                    + accountinfo.getEmail() + "','"
38                    + accountinfo.getAuthority() + "')";
39  
40        try{
41            con = getConnection();
42            smt = con.createStatement();
43  
44            //SQLをDBへ発行
45            count = smt.executeUpdate(sql);
46  
47        }catch(Exception e){
48            throw new IllegalStateException(e);
49        }finally{
50            //リソースの開放
51            if(smt != null){
52                try{smt.close();}catch(SQLException ignore){}
53            }
54            if(con != null){
55                try{con.close();}catch(SQLException ignore){}
56            }
57        }
58        return count;
59    }
60 }

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

➢ insertForm.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            登録する情報を入力してください。
13            <form action="<%=request.getContextPath() %>/InsertServlet">
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                    <tr>
20                        <td style="width:60">名前</td>
21                        <td ><input type=text size="30" name="name"></input></td>
22                    </tr>
23                    <tr>
24                        <td style="width:70">アドレス</td>
25                        <td ><input type=text size="30" name="email"></input></td>
26                    </tr>
27                    <tr>
28                        <td style="width:60">権限</td>
29                        <td >
30                            <select name="authority">
31                                <option value="管理者">管理者</option>
32                                <option value="一般">一般</option>
33                            </select>
34                        </td>
35                    </tr>
36                    <tr>
37                        <td colspan=2 style="text-align:center">
38                            <input type="submit" value="登録">
39                        </td>
40                    </tr>
41                </table>
42            </form>
43            <br>
44        </div>
45    </body>
46 </html>

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

➢ InsertServlet.java
1package ch13;
2 
3import java.io.*;
4import javax.servlet.*;
5import javax.servlet.http.*;
6 
7public class InsertServlet extends HttpServlet{
8 
9    public void doGet(HttpServletRequest request ,HttpServletResponse response)
10    throws ServletException ,IOException{
11  
12        String error = "";
13  
14        try{
15            //文字エンコーディングの指定
16            request.setCharacterEncoding("UTF-8");
17  
18            //DTOオブジェクト宣言
19            AccountInfo accountinfo = new AccountInfo();
20  
21            //パラメータの取得
22            accountinfo.setId(request.getParameter("id"));
23            accountinfo.setName(request.getParameter("name"));
24            accountinfo.setEmail(request.getParameter("email"));
25            accountinfo.setAuthority(request.getParameter("authority"));
26  
27            //DAOオブジェクト宣言
28            AccountDao4 objDao4 = new AccountDao4();
29  
30            //1件登録メソッドを呼び出し
31            int count = objDao4.insert(accountinfo);
32  
33            //登録された件数を持ってinsertReceipt.jspにフォワード
34            request.setAttribute("count", count);
35  
36        }catch (IllegalStateException e) {
37            error ="DB接続エラーの為、登録できませんでした。";
38  
39        }catch(Exception e){
40            error ="予期せぬエラーが発生しました。<br>"+e;
41  
42        }finally{
43            request.setAttribute("error", error);
44            request.getRequestDispatcher("/view/ch13/insertReceipt.jsp").forward(request, response);
45        }
46    }
47 }
➢ web.xml
1<servlet>
2    <servlet-name>InsertServletMapping</servlet-name>
3    <servlet-class>ch13.InsertServlet</servlet-class>
4</servlet>
5<servlet-mapping>
6    <servlet-name>InsertServletMapping</servlet-name>
7    <url-pattern>/InsertServlet</url-pattern>
8</servlet-mapping>

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

➢ insertReceipt.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">検索ID入力画面</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>

解説
 今回のプログラムでは、登録情報を入力する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 データの更新

f