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ができるように繰り返し練習してもらいた。
コメント