データの削除

13.6 データの削除

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

データを削除するプログラム

 入力フォームから必要な情報を入力し、その情報をデータベースから削除します。

実行結果

アプリケーション構成

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

➢ AccountDao6.java
1package ch13;
2 
3import java.sql.*;
4 
5public class AccountDao6 {
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 delete(String id){
26        //変数宣言
27        Connection con = null;
28        Statement  smt = null;
29  
30        //return用変数
31        int count = 0;
32  
33        //SQL文
34        String sql = "DELETE FROM account WHERE id = '" + id + "'";
35  
36        try{
37            con = getConnection();
38            smt = con.createStatement();
39  
40            //SQLをDBへ発行
41            count = smt.executeUpdate(sql);
42  
43        }catch(Exception e){
44            throw new IllegalStateException(e);
45        }finally{
46            //リソースの開放
47            if(smt != null){
48                try{smt.close();}catch(SQLException ignore){}
49            }
50            if(con != null){
51                try{con.close();}catch(SQLException ignore){}
52            }
53        }
54        return count;
55    }
56 }

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

➢ deleteForm.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">削除ID入力画面</h2>
10            <hr style="height:3; background-color:#0000ff" />
11            <br>
12            削除するIDを入力してください。
13            <form action="<%=request.getContextPath() %>/DeleteServlet">
14                <input type="text" name="id">
15                <input type="submit" value="削除">
16            </form>
17            <br>
18        </div>
19    </body>
20 </html>

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

➢ DeleteServlet.java
1package ch13;
2 
3import java.io.*;
4import javax.servlet.*;
5import javax.servlet.http.*;
6 
7public class DeleteServlet 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            //パラメータの取得
19            String id = request.getParameter("id");
20  
21            //DAOオブジェクト宣言
22            AccountDao6 objDao6 = new AccountDao6();
23  
24            //削除メソッドを呼び出し
25            int count = objDao6.delete(id);
26  
27            //削除件数をリクエストスコープに登録
28            request.setAttribute("count", count);
29  
30        }catch (IllegalStateException e) {
31            error ="DB接続エラーの為、削除できませんでした。";
32  
33        }catch(Exception e){
34            error ="予期せぬエラーが発生しました。<br>"+e;
35  
36        }finally{
37            request.setAttribute("error", error);
38            request.getRequestDispatcher("/view/ch13/deleteReceipt.jsp").forward(request, response);
39        }
40    }
41 }
➢ web.xml
1     
2<servlet>
3    <servlet-name>DeleteServletMapping</servlet-name>
4    <servlet-class>ch13.DeleteServlet</servlet-class>
5</servlet>
6<servlet-mapping>
7    <servlet-name>DeleteServletMapping</servlet-name>
8    <url-pattern>/DeleteServlet</url-pattern>
9</servlet-mapping>

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

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

解説
 今回のデータを削除するプログラムも、13.4節のデータを登録するプログラムや13.5節のデータを更新するプログラムと同様の動きを行っており、異なるのは、情報を入力する画面と表示する画面のレイアウトと、DAOクラスに定義されたメソッドの2点です。

 DAOクラスでは、引数に受け取った情報をもとにデータを削除するdelete()メソッドが定義されています。このdelete()メソッドをDeleteServlet.javaで利用することによって、データベースに登録されたデータの削除を行っています。なお、登録や更新と異なり、削除に必要な情報は主キーのIDのみとなります。
   25:int count = objDao6.delete(id);

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

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

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

図 13.6.1 データ削除後の一覧表示

 このように、JDBCを利用することでWebアプリケーションからでも簡単にデータベースの操作を行うことができます。


NEXT>> 13.7 本章のまとめ

f