こんにちは、大学時代にプログラミングを始め、現在はエンジニアをしているuhablog(ウハブログ)です。
現在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が更新されていることが確認できます。
挫折せずにプログラミングを学ぶためには?
挫折せずにプログラミングを学ぶために必要なこと
僕はプログラミングで挫折した経験があります。
それは周りに聞ける人がいなく、一人でエラーと戦っていたからです。
Freeksは月額10,780円という破格の値段で、現役エンジニアに質問する環境を手に入れることができるプログラミングスクールです。
次のような悩みを少しでも抱えていたら、まずは無料カウンセリングを受けてみてください。
申込みは1分でできます。学習する環境にお金を使うというのは良い自己投資になります。
>>Freeksの無料カウンセリングはこちら
【関連記事】Freeks評判、口コミ