【今更ながらSpring BootでWEB開発 #6】 データベースの操作

Web

今回の目標

前回はSpring Data JDBCを用いてデータベースに接続する方法を説明しました。またSpring Bootにおけるデータベース処理について簡単に説明し、お問い合わせフォームの内容を登録する処理を実装しました。

【今更ながらSpring BootでWEB開発 #5】データベースの接続
Spring Bootでデータベースを扱う方法として、Java Data JDBCやJava Data JPAがあります。ここではJava Data JDBCを用いた基本的なデータベースアクセスの方法について説明します。

今回は登録(insert)以外のデータベース操作について一覧ページ、詳細ページを実装しながら説明していきます。

一覧ページ・詳細ページの作成

一覧ページ(/inquiry/list)と詳細ページ(/inquiry/detail/{id})を作成します。詳細ページはIDをパスパラメータとして設定します。また詳細ページには削除機能(/inquiry/delete)を実装します。

DAO・Serviceの実装

DAO

DAOにID指定による取得(findById)、全取得(getAll)、削除(delete)を実装します。インターフェース部分は省略します。

ID指定による取得(findById)

@Override
public Inquiry findById(int id) {
  Map<String, Object> map = jdbcTemplate.queryForMap("SELECT * FROM inquiry WHERE id = ?", id);
  Inquiry inquiry = new Inquiry();
  inquiry.setId((int) map.get("id"));
  inquiry.setName((String) map.get("name"));
  inquiry.setEmail((String) map.get("email"));
  inquiry.setContents((String) map.get("contents"));
  inquiry.setCreated(((Timestamp) map.get("created")).toLocalDateTime());
  return inquiry;
}

特定の1レコードを取得する場合にはJdbcTemplateのqueryForMapを使用します。Mapのキーに項目名、値はObjectと取得できるためキャストが必要になります。

取得する項目が1項目だけの場合はqueryForObjectを使用します。

全取得(getAll)

@Override
public  List<Inquiry> getAll() {
  List<Inquiry> inquirys = new ArrayList<>();
  for (Map<String, Object> row : jdbcTemplate.queryForList("SELECT * FROM inquiry ORDER BY id")) {
    Inquiry inquiry = new Inquiry();
    inquiry.setId((int) row.get("id"));
    inquiry.setName((String) row.get("name"));
    inquiry.setEmail((String) row.get("email"));
    inquiry.setContents((String) row.get("contents"));
    inquiry.setCreated(((Timestamp) row.get("created")).toLocalDateTime());
    inquirys.add(inquiry);
  }
  return inquirys;
}

複数レコードを取得する場合はqueryForListを使用します。1レコードの時に取得したMapのListを取得します。

削除(delete)

@Override
public void delete(int id) {
  jdbcTemplate.update("DELETE  FROM inquiry WHERE id = ?", id);
}

削除は登録の場合と同じくupdateを使用します。更新をする場合も同じです。

Service

DAOを基にServiceを実装します。

@Override
public List<Inquiry> getAll() {
  return dao.getAll();
}

@Override
public Inquiry findById(int id) {
  return dao.findById(id);
}

@Override
public void delete(int id) {
  dao.delete(id);
}

Controllerの実装

一覧の表示(/inquiry/list)、詳細の表示(/inquiry/detail/{id})、削除(/inquiry/delete)の3つを実装します。

@GetMapping("/list")
public String list(Model model) {
  model.addAttribute("inquirys", service.getAll());
  return "inquiry/list.html";
}

@GetMapping("/detail/{id}")
public String detail(@PathVariable("id") int id, Model model) {
  model.addAttribute("inquiry", service.findById(id));
  return "inquiry/detail.html";
}
  
@PostMapping("/delete")
public String detail(@RequestParam("id") int id) {
  service.delete(id);
  return "redirect:/inquiry/list";
}

パスパラメータ

詳細ページでは一覧ページで選択したIDに該当する情報を表示します。このIDを指定する方法にパスパラメータを使用します。パスパラメータはURLの一部をパラメータとして扱うことができます。今回の場合、「/inquiry/detail/1」であればID=1として扱います。

パスパラメータを設定するには、パスの該当する部分を「{ }」で囲みます。囲んだ部分がパラメータ名になります。パスパラメータを参照するには、「@PathVariable(“id”)」を指定した引数を指定します。

リダイレクト

削除処理実行後、一覧ページに戻るようにします。ただし、今までのように「return “inquiry/list.html”」とページを表示してしまうと、listで実装したように全ての情報を取得する必要があります。さすがにそれは冗長なので、リダイレクトをします。

リダイレクトは、指定したパスに転送することで、今回は「/inquiry/list」に転送するという意味になります。こうすることにより「/inquiry/list」に実装している処理が実行され、一覧ページが表示されます。

あとがき

今回はJava Data JDBCの登録(insert)以外の操作について説明しました。通常のPreparedStatementを使った方法よりは簡単に実装することができます。

Java Data JPAを使うとより簡単に実装できるようなのでそちらも時間があるときにやっていこうかと思います。

 

- Spring Bootのおすすめ書籍はコチラ -

コメント

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