【Java】【SQL】ユーザ削除:入力したIDから、対象のユーザを物理削除する

■作成するプログラムの概要

・画面にて「ユーザID」を入力する。

・入力したユーザIDからテーブルのユーザを物理削除(Delete)する。

・削除が完了した場合、検索画面に遷移する。

■フローチャート

▼全体概要

今回は、赤およびオレンジのオブジェクトについて実装する。

検索処理については、「■参考」を参照。

▼ユーザ削除サーブレットクラス

・GET処理


・POST処理

▼ユーザ削除処理

■プログラム仕様

▼ユーザ削除サーブレットクラス(DeleteUserServlet.java)

(1)GET処理

インプット処理内容アウトプット
【URL】
*1
削除画面へ遷移する。

*1:URL(/WEB-INF/jsp/userdelete.jsp)


(2)POST処理

インプット処理内容アウトプット
【フォーム情報】
ユーザID
【フォーム情報】を取得する。
【try】
Beanクラスをインスタンスする。
Beanクラスに入力したユーザIDをセットする。
ユーザ削除処理を実行する。
【URL】
*1
検索画面へ遷移する。
【catch】
【URL】
*2
何らかの理由で失敗した場合、
エラーページにエラー文を渡して表示する。
【メッセージ】
エラーメッセージ

*1:URL(/WEB-INF/jsp/usersearch.jsp)
*2:URL(/WEB-INF/jsp/error.jsp)

▼削除処理(DeleteUserDAO.java)

(1)インスタンス処理

引数:なし
戻り値:new 削除処理クラス

インプット処理内容アウトプット
コードの簡略化を行うため、
インスタンスオブジェクトの生成時、
新規オブジェクトを返却する。
【オブジェクト】
new 削除処理クラス

(2)削除処理

引数:Beanクラス

インプット処理内容アウトプット
【Beanクラス】
ユーザID
初期値をセットする。
・DB接続=null
・ユーザID=BeanクラスのユーザID
【try】
jdbcドライバを読み込む。(OracleDB)(*1)
【DB情報】
ユーザ名
パスワード
PDB情報
DBへ接続する。(*2)
実行するSQL文をセットする。
SQLを実行する。
【catch】sql実行失敗
エラーメッセージをコンソールに出力する。【メッセージ】
エラーメッセージ
【catch】JDBCドライバ関連エラー
エラーメッセージをコンソールに出力する。【メッセージ】
エラーメッセージ
【finally】
【条件分岐】
▼DB接続中の場合
DBとの接続を切る。

(*1)jdbcドライバを読み込む。

以下のようにドライバ(ojdbc10.jar)を配置する。

なお、ドライバ(ojdbc10.jar)は、Oracle19cのものを使用する。(Oracle社からダウンロードしたもの)


(*2)DBへ接続する

DBへの接続は、以下の2通りのうち、Thin接続にて行う。

・Thin接続

jdbc:oracle:thin:<ユーザ名>/<パスワード>@//<ホスト名:ポート番号>/<PDB名>

・OCI接続(クライアント側にオラクルクライアントをインストールする必要あり)

jdbc:oracle:oci:<ユーザ名>/<パスワード>@<サービス名またはPDB名>

■テーブル定義

ユーザ情報テーブルの定義情報を以下に示す。

カラム名(物理)カラム名(論理)Null判定キー
IDユーザIDNOT NULL主キーCHAR(5)
NAMEユーザ名NOT NULLVARCHAR2(50)

■ユーザ情報テーブルのデータ情報

ユーザ情報テーブルのデータについて、あらかじめ、以下の情報を登録しておく。

IDNAME
11111Hoge
12345Mike
12346Taro
12347Jon
12348Nuncy
12349Hanako

■画面仕様

削除対象ユーザIDを入力できるフォームを作成し、「削除」ボタン押下時、削除処理を実行する。

※ユーザID:5桁以下で入力必須

■サンプルコード

▼サーブレットクラス(DeleteUserServlet.java)

package servlet;

import java.io.IOException;

import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import bean.UserInfoBean;
import dao.DeleteUserDAO;

/**
 * Servlet implementation class DeleteUserServlet
 */
@WebServlet("/DeleteUserServlet")
public class DeleteUserServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;
       

	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// 画面へ遷移(Getの場合は削除画面へ)
    	RequestDispatcher rd = request.getRequestDispatcher("/WEB-INF/jsp/userdelete.jsp");
    	rd.forward(request, response);
    }

	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// Jspのフォーム画面から削除対象ユーザIDを取得
		request.setCharacterEncoding("UTF-8");
		String input_userID = request.getParameter("userid");
				
		try{
			// Beanクラスのインスタンス
			UserInfoBean input_user = new UserInfoBean();
			
			// Beanクラスに入力したユーザIDをセットする
			input_user.setUser_id(input_userID);
			
			// 削除処理実行
			DeleteUserDAO.getInstance().DeleteUser(input_user);
			
			// 更新処理が問題なく完了した場合は検索画面のJSPに遷移する
			request.getRequestDispatcher("/WEB-INF/jsp/usersearch.jsp").forward(request, response);
			
		}catch(Exception e){
			//何らかの理由で失敗したらエラーページにエラー文を渡して表示。
			request.setAttribute("error", e.getMessage());
			request.getRequestDispatcher("/WEB-INF/jsp/error.jsp").forward(request, response);
		}
	}

}

▼Beanクラス(UserInfoBean.java)

Beanクラスは「■参考」のユーザ検索処理のものを使用する。

package bean;

import java.io.Serializable;

public class UserInfoBean implements Serializable{
	// フィールド
	private String user_id;
	private String user_name;
	
	// ユーザIDのゲッター/セッターを作成
	public String getUser_id() {
		return user_id;
	}
	public void setUser_id(String id) {
		this.user_id = id;
	}

	// ユーザ名のゲッター/セッターを作成
	public String getUser_name() {
		return user_name;
	}
	public void setUser_name(String name) {
		this.user_name = name;
	}

	// コンストラクタ:設定なし
	public UserInfoBean() {
	}
	
}

▼ユーザ削除処理(DeleteUserDAO.java)

package dao;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.SQLException;

import bean.UserInfoBean;

public class DeleteUserDAO {

	// インスタンスオブジェクトを返却してコード簡略化
	public static DeleteUserDAO getInstance() {
		return new DeleteUserDAO();
	}
	
	public void DeleteUser(UserInfoBean input_user) {
		// 初期値をセット
		Connection db_con = null;
		String id = input_user.getUser_id();
		
		try {
			// jdbcドライバの読み込み(OracleDB)
			Class.forName("oracle.jdbc.driver.OracleDriver");
		
			//  DB接続
			db_con = DriverManager.getConnection(
				"jdbc:oracle:thin:ユーザ名/パスワード@//ホスト名:ポート番号/PDB名");
		
			// 実行するSQL文をセット
			String sql = "DELETE FROM usertbl WHERE ID = ?";
		
			// DBで実行するSQL文を「prepareStatement」インスタンスに格納する
			PreparedStatement ps = db_con.prepareStatement(sql);

			// 登録するIDと名前をセットする
			ps.setString(1, id);
			
			// SQL実行
			ps.executeUpdate();
			
		} catch(SQLException sql_e) {
			// エラーハンドリング
			System.out.println("sql実行失敗");
			sql_e.printStackTrace();
			
		} catch(ClassNotFoundException e) {
			// エラーハンドリング
			System.out.println("JDBCドライバ関連エラー");
			e.printStackTrace();
			
		} finally {
			// DB接続を解除
			if (db_con != null) {
					try {
						db_con.close();
					} catch (SQLException e) {
						System.out.println("sqlクローズ失敗");
						e.printStackTrace();
					}
			}
		}
	}

}

▼削除画面(userdelete.jsp)

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>ユーザ削除画面</title>
</head>
<body>
<form action="./DeleteUserServlet" method="post">
	<p>
	削除対象のユーザID:<input type="text" name="userid" maxlength="5" required>
	</p>
	<input type="submit" value="削除">
</form>
</body>
</html>

■実行結果

・事前確認(検索画面)

今回はユーザID「11111」のユーザを削除する。


・削除画面

ユーザIDに「11111」を入力し、「削除」ボタンを押下する。


・事後確認(検索画面)

ユーザID「11111」が削除されていることを確認。

■参考

コメント