2024 lunchapp 作成 (java + sql)

JSP&Servlet

JavaとDB(MySQL or MariaDB)を連携させて、ブラウザからデータの作成、一覧、更新、削除ができるアプリを作成する。
(*この記事は前回の内容が完全に終了していることが前提である)

モデルの作成

まずは。DBのテーブル定義を見てモデルを作成することから始まる。
今回lunchesテーブルはidとshop名とmenu名の3つのカラムを持つ。したがってこの3つの情報をもつ一般クラスをjavaBeansの仕様を満たして作成することから始まる。通常テーブル名は複数形で作成し(lunches)一般クラス名はそれの単数系で行うことが多い(Lunch)。では早速作成しよう。

新規クラスからmodelパッケージに入ったLunchクラスを以下のように作成する

model.Lunch.java

package model;

import java.io.Serializable;

public class Lunch implements Serializable{
	private int id;
	private String shop;
	private String menu;
	
	public Lunch() {}
	public Lunch(String shop,String menu) {
		this.shop=shop;
		this.menu=menu;
	}
	public Lunch(int id,String shop,String menu) {
		this(shop,menu);
		this.id=id;
	}
	public int getId() {
		return id;
	}
	public void setId(int id) {
		this.id = id;
	}
	public String getShop() {
		return shop;
	}
	public void setShop(String shop) {
		this.shop = shop;
	}
	public String getMenu() {
		return menu;
	}
	public void setMenu(String menu) {
		this.menu = menu;
	}
}

データ一覧機能の作成

DBと接続するときにはそのテーブルの操作を一括で担うクラスを作成するのが一般的だ。そういったクラスはDAO(Data Access Object)と呼ばれている。今回はdaoパッケージにLunchDAO.javaを以下のように作成する。

dao.LunchDAO.java

//lunchesテーブルの内容をLunchインスタンスの入ったListで取得する
	public List<Lunch> findAll(){
		List<Lunch> list = new ArrayList<>();
		String sql="""
				SELECT
				id,shop,menu
				FROM lunches
				""";
		try(
			//dbの接続を保持するConnectionインスンタスの取得
			Connection db = new LunchAppDataSource().getConnection()){

			//SQL文を保持するPreparedStatementインスタンスの作成
			PreparedStatement ps = db.prepareStatement(sql);
			//SQL文を実行することで結果セット(ResultSet)を得る
			ResultSet rs = ps.executeQuery();
			
			//結果件数の数だけ回るループ
			while(rs.next()) {
				//レコードからidカラムの内容をintとして取得
				int id = rs.getInt("id");
				//レコードからshopカラムの内容をStringとして取得
				String shop = rs.getString("shop");
				//レコードからmenuカラムの内容をStringとして取得
				String menu = rs.getString("menu");
				//3つの情報からLunchインスタンスを作成
				Lunch lunch = new Lunch(id,shop,menu);
				//Listに追加
				list.add(lunch);
			}
			
		} catch (SQLException | NamingException e) {
			e.printStackTrace();
		}
		return list;
	}

ポイント

Javaのバージョンアップに合わせて、DB接続の例外処理をtry-with-resources構文を使っている。こうすることでfinally処理が不必要となりコードがシンプルになる。また、SQL文もテキストブロックを使うことで複雑なSQL文もとても書きやすくなった。

(参考)
最近のmariaDBやMySQLはConnectionインスタンスをcloseするときにPreparedStatementインスタンスや、ResultSetインスタンスも同時にcloseしてくれるので上記コードで問題はない。ただし、環境によってはそうとは限らないので以下のようにPreparedStatementやResultSetインスタンスをtryで囲み、明示的にオートcloseしておくのはまさにベストプラクティスといえる。ただ、この講座では簡単さに重きを置きConnectionインスタンスのみをcloseする方針で今後も行う。実務で扱う際にはどちらが適切なのかを考慮すること

//lunchesテーブルの内容をLunchインスタンスの入ったListで取得する
	public List<Lunch> findAll(){
		List<Lunch> list = new ArrayList<>();
		String sql="""
				SELECT *
				FROM lunches
				""";
		try(
			//dbの接続を保持するConnectionインスンタスの取得
			Connection db = new LunchAppDataSource().getConnection();
			//SQL文を保持するPreparedStatementインスタンスの作成
			PreparedStatement ps = db.prepareStatement(sql);
			//SQL文を実行することで結果セット(ResultSet)を得る
			ResultSet rs = ps.executeQuery()){
			
			//結果件数の数だけ回るループ
			while(rs.next()) {
				//レコードからidカラムの内容をintとして取得
				int id = rs.getInt("id");
				//レコードからshopカラムの内容をStringとして取得
				String shop = rs.getString("shop");
				//レコードからmenuカラムの内容をStringとして取得
				String menu = rs.getString("menu");
				//3つの情報からLunchインスタンスを作成
				Lunch lunch = new Lunch(id,shop,menu);
				//Listに追加
				list.add(lunch);
			}
			
		} catch (SQLException | NamingException e) {
			e.printStackTrace();
		}
		return list;
	}

controller.Main.java(サーブレット)

一覧画面を表示するメインとなるコントローラーを作成する。
新規サーブレットからcontroller.Main.javaを以下のように作成する。

package controller;

import java.io.IOException;
import java.util.List;

import dao.LunchDAO;
import jakarta.servlet.ServletException;
import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import model.Lunch;

@WebServlet("/Main")
public class Main extends HttpServlet {
	private static final long serialVersionUID = 1L;
       
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		//daoを作成
		LunchDAO dao = new LunchDAO();
		//Listの取得
		List<Lunch> list = dao.findAll();
		//listをリクエストスコープを保存
		request.setAttribute("list", list);
		//main.jspにフォワード
		request.getRequestDispatcher("WEB-INF/view/Main.jsp").forward(request, response);
	}
}

続いてWEB-INFフォルダ内にviewフォルダを作成し、その中にMain.jspを以下のように作成する

WEB-INF/view/Main.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8" import="model.Lunch,java.util.*"%>
<%
List<Lunch> list = (List<Lunch>)request.getAttribute("list");
%>
<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title>LunchApp</title>
</head>
<body>
    <h1>Lunch List</h1>
    <p><a href="Insert">新規データを追加</a></p>
    <% if (list != null && !list.isEmpty()) { %>
        <table border="1">
            <tr>
                <th>Shop</th>
                <th>Menu</th>
                <th>操作</th>
            </tr>
            <% for (Lunch lunch : list) { %>
                <tr>
                    <td><%= lunch.getShop() %></td>
                    <td><%= lunch.getMenu() %></td>
                    <td>
                        <a href="Update?id=<%= lunch.getId() %>">更新</a>
                        <a href="Delete?id=<%= lunch.getId() %>">削除</a>
                    </td>
                </tr>
            <% } %>
        </table>
    <% } else { %>
        <p>データがありません</p>
    <% } %>
</body>
</html>

サーブレットMainから実行してみよう。以下のように表示されれば成功だ。
(*各種リンクはまだ機能しない)

Insert

データの新規追加を行えるようにする。まずはLunchDAOに以下を追記する。

dao.LunchDAO.java(dao追記)

package dao;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

import javax.naming.NamingException;

import model.Lunch;

public class LunchDAO {
	//lunchesテーブルの内容をLunchインスタンスの入ったListで取得する
	public List<Lunch> findAll(){
		List<Lunch> list = new ArrayList<>();
		String sql="""
				SELECT
				id,shop,menu
				FROM lunches
				""";
		try(
			//dbの接続を保持するConnectionインスンタスの取得
			Connection db = new LunchAppDataSource().getConnection()){

			//SQL文を保持するPreparedStatementインスタンスの作成
			PreparedStatement ps = db.prepareStatement(sql);
			//SQL文を実行することで結果セット(ResultSet)を得る
			ResultSet rs = ps.executeQuery();
			
			//結果件数の数だけ回るループ
			while(rs.next()) {
				//レコードからidカラムの内容をintとして取得
				int id = rs.getInt("id");
				//レコードからshopカラムの内容をStringとして取得
				String shop = rs.getString("shop");
				//レコードからmenuカラムの内容をStringとして取得
				String menu = rs.getString("menu");
				//3つの情報からLunchインスタンスを作成
				Lunch lunch = new Lunch(id,shop,menu);
				//Listに追加
				list.add(lunch);
			}
			
		} catch (SQLException | NamingException e) {
			e.printStackTrace();
		}
		return list;
	}
	
	//1件追加する
	public void insertOne(Lunch lunch) {
		String sql="""
				INSERT INTO 
				lunches(shop,menu)
				VALUES(?,?)
				""";
		try(Connection db = new LunchAppDataSource().getConnection()){
			PreparedStatement ps = db.prepareStatement(sql);
			
			//1つ目の?にショップ名をセット
			ps.setString(1, lunch.getShop());
			//2つ目の?にメニュー名をセット
			ps.setString(2, lunch.getMenu());
			//SQLを実行
			ps.executeUpdate();
			
		} catch (SQLException | NamingException e) {
			e.printStackTrace();
		}
	}
}

controller.Insert.java(サーブレット)

新規サーブレットからcontroller.Insert.javaを作成し以下のように作成する。
(doPostは空にしておく)

package controller;

import java.io.IOException;

import jakarta.servlet.ServletException;
import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;

@WebServlet("/Insert")
public class Insert extends HttpServlet {
	private static final long serialVersionUID = 1L;
       
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		//Insert.jspにフォワード
		request.getRequestDispatcher("WEB-INF/view/Insert.jsp").forward(request, response);
	}

	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		//todo
	}
}

WEB-INF/view/Insert.jsp

新規jspからWEB-INF/viewフォルダの中にInsert.jspを以下のように作成する。

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8" %>
<!DOCTYPE html>
<html>
<head>
	<meta charset="UTF-8">
	<title>Lunch App</title>
</head>
<body>
	<p>データを入力してください</p>
	<form action="Insert" method="post">
		Shop:<input type="text" name="shop" autofocus required><br>
		Menu:<input type="text" name="menu" required><br>
		<button type="submit">登録</button>
	</form>
</body>
</html>

controller.Insert.java(doPost追記)

doPost部分に追記する

package controller;

import java.io.IOException;

import dao.LunchDAO;
import jakarta.servlet.ServletException;
import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import model.Lunch;

@WebServlet("/Insert")
public class Insert extends HttpServlet {
	private static final long serialVersionUID = 1L;
       
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		//Insert.jspにフォワード
		request.getRequestDispatcher("WEB-INF/view/Insert.jsp").forward(request, response);
	}

	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		//リクエストパラメータの文字化け対策
		request.setCharacterEncoding("UTF-8");
		//リクエストパラメータの取得
		String shop = request.getParameter("shop");
		String menu = request.getParameter("menu");
		//Lunchインスタンスの作成
		Lunch lunch = new Lunch(shop,menu);
		//daoの作成
		LunchDAO dao = new LunchDAO();
		//インサート処理の実行
		dao.insertOne(lunch);
		//Mainにリダイレクト
		response.sendRedirect("Main");
	}
}

ここまでできたらMainから実行し、新規データ追加のリンクを押してみよう。
フォームが表示され、入力されたデータ内容でDBにインサートされることがわかる。

更新

データの更新処理を作成していく。更新する際にはまずは既存のデータをフォームに復元しなければならない。
まずは、idを元にLunchインスタンスを返却するメソッドdaoに追記する。

package dao;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

import javax.naming.NamingException;

import model.Lunch;

public class LunchDAO {
	//lunchesテーブルの内容をLunchインスタンスの入ったListで取得する
	public List<Lunch> findAll(){
		List<Lunch> list = new ArrayList<>();
		String sql="""
				SELECT
				id,shop,menu
				FROM lunches
				""";
		try(
			//dbの接続を保持するConnectionインスンタスの取得
			Connection db = new LunchAppDataSource().getConnection()){

			//SQL文を保持するPreparedStatementインスタンスの作成
			PreparedStatement ps = db.prepareStatement(sql);
			//SQL文を実行することで結果セット(ResultSet)を得る
			ResultSet rs = ps.executeQuery();
			
			//結果件数の数だけ回るループ
			while(rs.next()) {
				//レコードからidカラムの内容をintとして取得
				int id = rs.getInt("id");
				//レコードからshopカラムの内容をStringとして取得
				String shop = rs.getString("shop");
				//レコードからmenuカラムの内容をStringとして取得
				String menu = rs.getString("menu");
				//3つの情報からLunchインスタンスを作成
				Lunch lunch = new Lunch(id,shop,menu);
				//Listに追加
				list.add(lunch);
			}
			
		} catch (SQLException | NamingException e) {
			e.printStackTrace();
		}
		return list;
	}
	
	//1件追加する
	public void insertOne(Lunch lunch) {
		String sql="""
				INSERT INTO 
				lunches(shop,menu)
				VALUES(?,?)
				""";
		try(Connection db = new LunchAppDataSource().getConnection()){
			PreparedStatement ps = db.prepareStatement(sql);
			
			//1つ目の?にショップ名をセット
			ps.setString(1, lunch.getShop());
			//2つ目の?にメニュー名をセット
			ps.setString(2, lunch.getMenu());
			//SQLを実行
			ps.executeUpdate();
			
		} catch (SQLException | NamingException e) {
			e.printStackTrace();
		}
	}
	
	//idを元に1件のLuncuインスタンスを取得するメソッド
	public Lunch findOne(int id) {
		Lunch lunch = null;
		String sql="""
				SELECT 
				shop,menu
				FROM lunches
				WHERE
				id = ?
				""";
		try(Connection db = new LunchAppDataSource().getConnection()){
			//sql文を準備
			PreparedStatement ps = db.prepareStatement(sql);
			//1つ目の?にidをセット
			ps.setInt(1, id);
			//sql文を実行して結果セットを得る
			ResultSet rs = ps.executeQuery();
			//idを指定した場合は結果は1件なのでwhileでなくifでOK
			if(rs.next()) {
				lunch = new Lunch(id,rs.getString("shop"),rs.getString("menu"));
			}
			
		} catch (SQLException | NamingException e) {
			e.printStackTrace();
		}
		return lunch;
		
	}

}

controller.Update.java(サーブレット)

package controller;

import java.io.IOException;

import dao.LunchDAO;
import jakarta.servlet.ServletException;
import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import model.Lunch;

@WebServlet("/Update")
public class Update extends HttpServlet {
	private static final long serialVersionUID = 1L;
       
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		//リクエストパラメーターからidを取得
		String id = request.getParameter("id");
		//もしidが来ていなかったらリダイレクト
		if(id == null) {
			response.sendRedirect("Main");
			return;
		}
		LunchDAO dao = new LunchDAO();
		//idを渡してLunchインスタンスを取得
		Lunch lunch = dao.findOne(Integer.parseInt(id));
		//リクエストスコープにlunchインスタンスを登録
		request.setAttribute("lunch",lunch);
		//forward
		request.getRequestDispatcher("WEB-INF/view/update.jsp").forward(request, response);
	}

	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
	}

}

WEB-INF/view/Update.jsp

新規jspからWEB-INF/viewフォルダの中にUpdate.jspを以下のように作成する。

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8" import="model.*"%>
<%
Lunch lunch=(Lunch)request.getAttribute("lunch");
%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>LunchApp</title>
</head>
<body>
<p>内容を修正して更新ボタンを押してください</p>
<form action="Update" method="post">
Shop:<input type="text" name="shop" value="<%=lunch.getShop() %>"><br>
Menu:<input type="text" name="menu" value="<%=lunch.getMenu() %>"><br>
<input type="hidden" name="id" value="<%=lunch.getId() %>" ><br>
<button type="submit">更新</button>
</form>
</body>
</html>

Mainサーブレットからアクセスして、更新を押してみよう。以下のように情報が復元されていれば成功だ。

dao.LunchDAO.java(追記)

package dao;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

import javax.naming.NamingException;

import model.Lunch;

public class LunchDAO {
	//lunchesテーブルの内容をLunchインスタンスの入ったListで取得する
	public List<Lunch> findAll(){
		List<Lunch> list = new ArrayList<>();
		String sql="""
				SELECT
				id,shop,menu
				FROM lunches
				""";
		try(
			//dbの接続を保持するConnectionインスンタスの取得
			Connection db = new LunchAppDataSource().getConnection()){

			//SQL文を保持するPreparedStatementインスタンスの作成
			PreparedStatement ps = db.prepareStatement(sql);
			//SQL文を実行することで結果セット(ResultSet)を得る
			ResultSet rs = ps.executeQuery();
			
			//結果件数の数だけ回るループ
			while(rs.next()) {
				//レコードからidカラムの内容をintとして取得
				int id = rs.getInt("id");
				//レコードからshopカラムの内容をStringとして取得
				String shop = rs.getString("shop");
				//レコードからmenuカラムの内容をStringとして取得
				String menu = rs.getString("menu");
				//3つの情報からLunchインスタンスを作成
				Lunch lunch = new Lunch(id,shop,menu);
				//Listに追加
				list.add(lunch);
			}
			
		} catch (SQLException | NamingException e) {
			e.printStackTrace();
		}
		return list;
	}
	
	//1件追加する
	public void insertOne(Lunch lunch) {
		String sql="""
				INSERT INTO 
				lunches(shop,menu)
				VALUES(?,?)
				""";
		try(Connection db = new LunchAppDataSource().getConnection()){
			PreparedStatement ps = db.prepareStatement(sql);
			
			//1つ目の?にショップ名をセット
			ps.setString(1, lunch.getShop());
			//2つ目の?にメニュー名をセット
			ps.setString(2, lunch.getMenu());
			//SQLを実行
			ps.executeUpdate();
			
		} catch (SQLException | NamingException e) {
			e.printStackTrace();
		}
	}
	
	//idを元に1件のLuncuインスタンスを取得するメソッド
	public Lunch findOne(int id) {
		Lunch lunch = null;
		String sql="""
				SELECT 
				shop,menu
				FROM lunches
				WHERE
				id = ?
				""";
		try(Connection db = new LunchAppDataSource().getConnection()){
			//sql文を準備
			PreparedStatement ps = db.prepareStatement(sql);
			//1つ目の?にidをセット
			ps.setInt(1, id);
			//sql文を実行して結果セットを得る
			ResultSet rs = ps.executeQuery();
			//idを指定した場合は結果は1件なのでwhileでなくifでOK
			if(rs.next()) {
				lunch = new Lunch(id,rs.getString("shop"),rs.getString("menu"));
			}
			
		} catch (SQLException | NamingException e) {
			e.printStackTrace();
		}
		return lunch;
	}
	
	//更新するメソッド
	public void updateOne(Lunch lunch) {
		String sql ="""
				UPDATE lunches
				SET
				shop = ?,
				menu = ?
				WHERE
				id = ?
				""";
		try(Connection db = new LunchAppDataSource().getConnection()){
			PreparedStatement ps = db.prepareStatement(sql);
			ps.setString(1, lunch.getShop());
			ps.setString(2, lunch.getMenu());
			ps.setInt(3, lunch.getId());
			
			ps.executeUpdate();
			
		} catch (SQLException | NamingException e) {
			e.printStackTrace();
		}
	}
	

}

controller.Update.java(doPost追記)

package controller;

import java.io.IOException;

import dao.LunchDAO;
import jakarta.servlet.ServletException;
import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import model.Lunch;

@WebServlet("/Update")
public class Update extends HttpServlet {
	private static final long serialVersionUID = 1L;
       
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		//リクエストパラメーターからidを取得
		String id = request.getParameter("id");
		//もしidが来ていなかったらリダイレクト
		if(id == null) {
			response.sendRedirect("Main");
			return;
		}
		LunchDAO dao = new LunchDAO();
		//idを渡してLunchインスタンスを取得
		Lunch lunch = dao.findOne(Integer.parseInt(id));
		//リクエストスコープにlunchインスタンスを登録
		request.setAttribute("lunch",lunch);
		//forward
		request.getRequestDispatcher("WEB-INF/view/Update.jsp").forward(request, response);
	}

	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		request.setCharacterEncoding("UTF-8");
		String id = request.getParameter("id");
		String shop = request.getParameter("shop");
		String menu = request.getParameter("menu");
		Lunch lunch=new Lunch(Integer.parseInt(id),shop,menu);
		LunchDAO dao = new LunchDAO();
		dao.updateOne(lunch);
		response.sendRedirect("Main");
	}

}

更新作業をしてみよう。情報が更新されれば成功だ(DBも確認すること)

削除

dao.LunchDAO.java(追記)

削除するメソッドを追記する

NamingExceptionprintStackTracepackage dao;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

import javax.naming.NamingException;

import model.Lunch;

public class LunchDAO {
	//lunchesテーブルの内容をLunchインスタンスの入ったListで取得する
	public List<Lunch> findAll(){
		List<Lunch> list = new ArrayList<>();
		String sql="""
				SELECT
				id,shop,menu
				FROM lunches
				""";
		try(
			//dbの接続を保持するConnectionインスンタスの取得
			Connection db = new LunchAppDataSource().getConnection()){

			//SQL文を保持するPreparedStatementインスタンスの作成
			PreparedStatement ps = db.prepareStatement(sql);
			//SQL文を実行することで結果セット(ResultSet)を得る
			ResultSet rs = ps.executeQuery();
			
			//結果件数の数だけ回るループ
			while(rs.next()) {
				//レコードからidカラムの内容をintとして取得
				int id = rs.getInt("id");
				//レコードからshopカラムの内容をStringとして取得
				String shop = rs.getString("shop");
				//レコードからmenuカラムの内容をStringとして取得
				String menu = rs.getString("menu");
				//3つの情報からLunchインスタンスを作成
				Lunch lunch = new Lunch(id,shop,menu);
				//Listに追加
				list.add(lunch);
			}
			
		} catch (SQLException | NamingException e) {
			e.printStackTrace();
		}
		return list;
	}
	
	//1件追加する
	public void insertOne(Lunch lunch) {
		String sql="""
				INSERT INTO 
				lunches(shop,menu)
				VALUES(?,?)
				""";
		try(Connection db = new LunchAppDataSource().getConnection()){
			PreparedStatement ps = db.prepareStatement(sql);
			
			//1つ目の?にショップ名をセット
			ps.setString(1, lunch.getShop());
			//2つ目の?にメニュー名をセット
			ps.setString(2, lunch.getMenu());
			//SQLを実行
			ps.executeUpdate();
			
		} catch (SQLException | NamingException e) {
			e.printStackTrace();
		}
	}
	
	//idを元に1件のLuncuインスタンスを取得するメソッド
	public Lunch findOne(int id) {
		Lunch lunch = null;
		String sql="""
				SELECT 
				shop,menu
				FROM lunches
				WHERE
				id = ?
				""";
		try(Connection db = new LunchAppDataSource().getConnection()){
			//sql文を準備
			PreparedStatement ps = db.prepareStatement(sql);
			//1つ目の?にidをセット
			ps.setInt(1, id);
			//sql文を実行して結果セットを得る
			ResultSet rs = ps.executeQuery();
			//idを指定した場合は結果は1件なのでwhileでなくifでOK
			if(rs.next()) {
				lunch = new Lunch(id,rs.getString("shop"),rs.getString("menu"));
			}
			
		} catch (SQLException | NamingException e) {
			e.printStackTrace();
		}
		return lunch;
	}
	
	//更新するメソッド
	public void updateOne(Lunch lunch) {
		String sql ="""
				UPDATE lunches
				SET
				shop = ?,
				menu = ?
				WHERE
				id = ?
				""";
		try(Connection db = new LunchAppDataSource().getConnection()){
			PreparedStatement ps = db.prepareStatement(sql);
			ps.setString(1, lunch.getShop());
			ps.setString(2, lunch.getMenu());
			ps.setInt(3, lunch.getId());
			
			ps.executeUpdate();
			
		} catch (SQLException | NamingException e) {
			e.printStackTrace();
		}
	}
	
	//削除メソッド
	public void deleteOne(int id) {
		String sql ="""
				DELETE
				FROM lunches
				WHERE
				id = ?
				""";
		try(Connection db = new LunchAppDataSource().getConnection()){
			PreparedStatement ps = db.prepareStatement(sql);
			ps.setInt(1, id);
			ps.executeUpdate();
		} catch (SQLException | NamingException e) {
			e.printStackTrace();
		}
	}
}

controller.Delete.java

package controller;

import java.io.IOException;

import dao.LunchDAO;
import jakarta.servlet.ServletException;
import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;

@WebServlet("/Delete")
public class Delete extends HttpServlet {
	private static final long serialVersionUID = 1L;
       
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		String id = request.getParameter("id");
		if(id == null) {
			response.sendRedirect("Main");
			return;
		}
		LunchDAO dao = new LunchDAO();
		dao.deleteOne(Integer.parseInt(id));
		response.sendRedirect("Main");
	}
}

Mainから開始して削除してみよう。データを削除できれば成功だ。

完成

以上で基本的なCRUDの処理が完成だ。最初はコードの量が多くて大変だがほとんどが定型的だ。この記事を参照しながらでよいのでテーブルのCRUDができるように繰り返し練習してもらいた。

コメント

タイトルとURLをコピーしました