
現在Java(サーブレット・jsp) x PostgreSQLを使ってTodoアプリを作成しています。現時点での機能は次のとおりです。
前回まででTodoの一覧から編集したいTodoを選択するとその情報が入力された状態のページまで遷移することができました。
今回の記事ではTodoを編集して、データベースの情報を更新するところを実装していきます。具体的には以下のような処理を追加します。
- 編集が終了し、「Todoを更新する」を押すとデータベースに編集内容が反映される
- 一覧表示するとTodoの内容が更新されている
UpdateDAOの編集
まずはUpdateDAOにメソッドを追加します。追加するメソッドはid, todoの内容, 期限を受け取りデータベースの値を更新するメソッドを作成します。全体は以下の通りです。
/**
* Todoデータを更新する
* @param id
* @param todo
* @param timeLimit
* @return 更新行数
* @throws SQLException
* @throws ClassNotFoundException
*/
public int updateTodo(int id, String todo, Date timeLimit) throws SQLException, ClassNotFoundException {
// 変更した行数を返却するための変数
int processingNumber = 0;
// SQLを作成
StringBuilder sql = new StringBuilder();
sql.append(" UPDATE ");
sql.append(" todo ");
sql.append(" SET ");
sql.append(" todo = ? ");
sql.append(", timeLimit = ? ");
sql.append(" WHERE ");
sql.append(" id = ? ");
try(Connection con = DBConnection.getConnection();
PreparedStatement pstmt = con.prepareStatement(sql.toString())) {
// パラメータに値を設定する
pstmt.setString(1, todo);
pstmt.setDate(2, timeLimit);
pstmt.setInt(3, id);
// SQLを実行し、実行行数を受け取る
processingNumber = pstmt.executeUpdate();
}
return processingNumber;
}
まずSQLの構築をしています。今回は普通のString型ではなく、StringBuilderを使用しました。
理由はちょっと長いSQLだったので、Stringだと見にくいかなと思ったからです。
StringBuilderを使用している以外は特筆すべき点はありません。
SQLの内容としてはtodoテーブルのidが一致したデータを更新するという具合です。
// SQLを作成
StringBuilder sql = new StringBuilder();
sql.append(" UPDATE ");
sql.append(" todo ");
sql.append(" SET ");
sql.append(" todo = ? ");
sql.append(", timeLimit = ? ");
sql.append(" WHERE ");
sql.append(" id = ? ");
次にSQL実行部分です。こちらも今までとほとんど変わりません。
setString, setDate, setIntでそれぞれSQLに具体的な値を設定しています。
try(Connection con = DBConnection.getConnection();
PreparedStatement pstmt = con.prepareStatement(sql.toString())) {
// パラメータに値を設定する
pstmt.setString(1, todo);
pstmt.setDate(2, timeLimit);
pstmt.setInt(3, id);
// SQLを実行し、実行行数を受け取る
processingNumber = pstmt.executeUpdate();
}
UpdateServletの編集
次にUpdateServletの編集をしていきます。
update.jspからPOSTメソッドを使ってフォームが送信されてくるのでdoPostメソッドを作成し、データベースの更新を行います。
doPostは以下のようになります。
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// リクエストパラメータから値を取得する
request.setCharacterEncoding("UTF-8");
int id = Integer.parseInt(request.getParameter(Parameters.TODO_ID));
String todo = request.getParameter(Parameters.TODO);
Date timeLimit = Date.valueOf(request.getParameter(Parameters.TIME_LIMIT));
// DAOを生成し、Todoを更新する
UpdateDAO dao = new UpdateDAO();
try {
// 受け取ったパラメータを元にデータベースを更新する
dao.updateTodo(id, todo, timeLimit);
} catch(SQLException | ClassNotFoundException e) {
e.printStackTrace();
}
response.sendRedirect("list-servlet");
}
まずは送られてきたリクエストパラメータを受け取ります。
// リクエストパラメータから値を取得する
request.setCharacterEncoding("UTF-8");
int id = Integer.parseInt(request.getParameter(Parameters.TODO_ID));
String todo = request.getParameter(Parameters.TODO);
Date timeLimit = Date.valueOf(request.getParameter(Parameters.TIME_LIMIT));
次に先ほど編集したUpdateDAOを使ってデータベースのデータを受け取ったリクエストパラメータで更新します。
// DAOを生成し、Todoを更新する
UpdateDAO dao = new UpdateDAO();
try {
// 受け取ったパラメータを元にデータベースを更新する
dao.updateTodo(id, todo, timeLimit);
} catch(SQLException | ClassNotFoundException e) {
e.printStackTrace();
}
動作確認
では動作確認をしてみましょう。サーバーを立ち上げ一覧画面を表示します。「todoを更新する」リンクを押してみます。今回は「create todo app」「2021-06-30」のTodoのリンクを押してみます。

リンクを押すとTodoの編集画面が表示されます。この編集画面では既存のデータがすでに入力されています。

試しに「create todo app」を「update todo app」に変更し、期限を「2021/06/30」から「2021/10/14」とします。

「Todoを更新する」ボタンを押すと一覧画面に遷移し、Todoが更新されていることが確認できます。

プログラミング学習はUdemyがおすすめ
私はプログラミングの学習はUdemyで行うのが一番おすすめです。
Udemyでは動画講座でプログラミングなどのスキルを身につけることができます。
現役エンジニアがUdemyをオススメする理由は
・動画で好きなときに学べる
・一流の講師に学ぶことができる
・講師の方に質問ができる
・返金保証もある
・セールを頻繁に開催している
といったたくさんの理由があります。
現在Udemyではセールを開催しています!
通常時1万円から2万円前後の価格で講座が販売されていますが、セール時には1500円前後(ランチ代くらい)で一つの講座を購入することができます。
UdemyにはサーブレットでWebアプリ開発が学べる講座もあるので、JavaでWebアプリ開発する方法を学んでみたい!という方は今がチャンスです!
独学が不安な人へ
独学で学んでいく意志がある方にはUdemyなどで学習するのがおすすめですが、プログラミングを独学するにはそれなりにハードルがあります。
- プログラミングで一度挫折した経験がある
- 一人で学習する自信がないので、サポートが欲しい
という方にはプログラミングスクールを検討してみるのがおすすめです。