EclipseによるSpringBoot⑦MyBatis delete

EclipesによるSpringBootの連載の続きです。
①コントローラ
②Thymeleaf
③MyBatis select
④Validation
⑤MyBatis insert
⑥MyBatis update
⑦MyBatis delete(今回)

今回のテーマは、MyBatisのdeleteです。
deleteは、SQL文で削除の命令です。
既存のデータを削除するときに使います。

新規/修正のJavaソースの資源のディレクトリ構成を示します。

新規/修正のリソースの資源のディレクトリ構成を示します。

修正/新規の資源一覧を示します。

#ファイル名概要種別修正/新規
1AddressDeleteController.java住所削除コントローラクラスJava新規
2AddressMapper.java住所マッパーインターフェイスJava修正
3AddressService.java住所サービスクラスJava修正
4AddressMapper.xml住所マッパーSQLSQL修正
5PostAction.jsポストアクションJavaScriptJavaScript修正
6List.html住所一覧画面タイムリーフThymeleaf修正
7DeleteComplete.html削除完了画面タイムリーフThymeleaf新規
作成手順 ①ソースの作成
 ①-1住所削除コントローラクラス
   削除リンク押下時のメソッド
 ①-2住所マッパーインターフェイス
   住所削除メソッド
 ①-3住所サービスクラス
   住所削除メソッド
②SQLの作成
 住所削除SQL
③JavaSctipt作成
 削除用postAction関数
④タイムリーフの作成
 ④-1住所一覧画面
 ④-2住所削除完了画面

①ソースの作成
 ①-1住所削除コントローラクラス
   削除リンク押下時のメソッド

行数説明
11@RestControllerは、リクエスト受付用のコントローラのアノテーションになります。
14@AUtowiredは、自動でインスタンスを行うアノテーションになります。
17@RequestMapping("/delete")は、Get/Postも受付可能なアノテーションになります。
パスは"/delete"を指定しています。
18メソッド名:delete:削除メソッド
引数 :ModelAndView model:遷移先画面連携用の変数
引数 :@RequestParam("deleteId")long deleteId:削除ID
戻り値:ModelAndView :遷移先画面連携用の変数
20住所サービスクラスの住所削除メソッドを、削除IDを引数として、呼び出します。
23削除完了画面を遷移先画面に設定する。

 ①-2住所マッパーインターフェイス
   住所削除メソッド

行数説明
21メソッド:deleteAddress(住所削除)
引数:long id :long型 削除ID
戻り値:void :なし

 ①-3住所サービスクラス
   住所削除メソッド

行数説明
42メソッド:deleteAddress(住所削除)
引数:long id :long型 削除ID
戻り値:void :なし
43住所マッパークラスの住所削除メソッドを、引数を削除ID として呼び出します。

②SQLの作成
 住所削除SQL

行数説明
50id(メソッド):deleteAddress(住所削除)
引数:long id :long型 削除ID
戻り値:void :なし
51~55SQLのdelete文
(from句)テーブル:address(住所)
(where句)条件:id=引数#{id}

③JavaSctipt作成
 削除用postAction関数
行数説明
15関数:postActionDel(削除リンク押下時)
引数: id : 削除ID
引数: action : 送信先パス
17formタグ(f)に、addressListFormを設定しています。
18確認用のポップアップメッセージの表示
19resultがtrueの場合、「OK」が押されたときに処理を行います。
20formタグ(f)のメソッドにpostを設定しています。
21formタグ(f)のアクションに、引数のアクション(送信先パス)を設定しています。
22formタグ(f)の削除IDに引数のIDを設定しています。
23formタグ(f)を送信します。

③タイムリーフの作成
 ③-1住所一覧画面

行数説明
20削除列の追加
行数説明
42~47<td>~</td>はセルのタグになります。
<a herf>~</a>はリンクのタグになります。
th:attrは、タイムリーフのタグになります。
JavaScriptのpostActionDel関数を以下の引数で呼び出します。
①引数:${li.no}(リストNo)
②引数:@{/delete} (リクエストの送信宛先パス)
53<input type="hidden" name="deleteId">は、隠し項目になります。
リクエスト時に削除IDをサーバに連携用の変数

 ③-2住所削除完了画面

行数説明
8<form>~</form>はフォームタグになります。
th:action="@{/list}"はリクエストの送信先パスになります。
method="post"はpostメソッドによりリクエストを行います。
11<button type="submit">一覧へ</button>
送信ボタンのボタン名を「一覧へ」に設定しています。

これで、準備は完了しました。
H2データベースを起動して、Bootダッシュボードから起動しましょう。
URLにlocalhost:8080/listと打ちましょう。

6行目のテスト F太郎さんをクリックしてみましょう。

確認用のポップアップメッセージが表示します。「OK」をクリックします。

削除完了画面が表示します。「一覧へ」ボタンを押下します。

6行目のテスト F太郎さんが削除されていれば成功になります。お疲れ様です!

☆まとめ☆ 今回は、MyBatisで、SQL文のdeleteについて学びました。
deleteは、既存のデータを削除する命令になります。
よく使う命令のselect(取得)、insert(登録)、update(更新)、delete(削除)
一通り学べたので、基本的なデータベースの処理ができるようになったと思います。

■ソースコードのコピーペースト用に記載します。

#1 AddressDeleteController.java

package com.example.demo.controller;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.servlet.ModelAndView;

import com.example.demo.service.AddressService;

@RestController
public class AddressDeleteController {

  @Autowired
  private AddressService addressService;

  @RequestMapping("/delete")
  public ModelAndView delete(ModelAndView model, @RequestParam("deleteId")long deleteId) {
    
    addressService.deleteAddress(deleteId);
    
    //削除完了画面に遷移
    model.setViewName("DeleteComplete");
    return model;
  }

}

#2 AddressMapper.java


package com.example.demo.mapper;

import java.util.List;

import org.apache.ibatis.annotations.Mapper;

import com.example.demo.dto.AddressDto;

@Mapper
public interface AddressMapper {
  public List selectAddress();

  public long selectIdMax();

  public void insertAddress(AddressDto addressDto);
  
  public AddressDto selectAddressById(long id);
  
  public void updateAddressById(AddressDto addressDto);

  public void deleteAddress(long id);

}

#3 AddressService.java

package com.example.demo.service;

import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import com.example.demo.dto.AddressDto;
import com.example.demo.mapper.AddressMapper;

@Service
public class AddressService {
  @Autowired
private AddressMapper addressMapper;
  
  //住所一覧取得
  public List getAddress(){
    return addressMapper.selectAddress();
  }
  
  //ID最大値取得
  public long getIdMax() {
    return addressMapper.selectIdMax();
  }
  
  //住所登録
  public void registerAddress(AddressDto addressDto) {
    addressMapper.insertAddress(addressDto);
  }

  //IDをキーとして住所取得
  public AddressDto getAddressById(long id) {
    return addressMapper.selectAddressById(id);
  }

  //住所更新
  public void updateAddressById(AddressDto addressDto) {
    addressMapper.updateAddressById(addressDto);
  }
  
  //住所削除
  public void deleteAddress(long id) {
    addressMapper.deleteAddress(id);
  }
}

#4 AddressMapper.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper
    PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
    "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.example.demo.mapper.AddressMapper">
  <select id="selectAddress" resultType="com.example.demo.dto.AddressDto">
    select
      *
    from
      ADDRESS
    order by id
  </select>

  <select id="selectIdMax" resultType="long">
    select
      max(id)
    from
      Address
  </select>
  
  <insert id="insertAddress" parameterType="com.example.demo.dto.AddressDto">
    insert into Address
      (id, address, tel, name, mail, job, gender)
    values(#{id}, #{address}, #{tel}, #{name}, #{mail}, #{job}, #{gender})
  </insert>

  <select id="selectAddressById" parameterType="long" resultType="com.example.demo.dto.AddressDto">
    select
      *
    from
      Address
    where
      id = #{id}
  </select>

  <update id="updateAddressById" parameterType="com.example.demo.dto.AddressDto">
    update
      Address
    set
      name = #{name},
      address = #{address},
      tel = #{tel},
      mail = #{mail},
      job = #{job},
      gender = #{gender}
    where
      id = #{id}
  </update>

  <delete id="deleteAddress" parameterType="long">
    delete
    from
      address
    where
       id = #{id}  
  </delete>
</mapper>

#5 PostAction.js

/**
* 編集リンク押下時
*/
function postAction(id, action){
  
  var f=document.addressListForm;
  f.method="post";
  f.action=action;
  f.modifyId.value=id;
  f.submit();
}
/**
* 削除リンク押下時
*/
function postActionDel(id, action){
  
  var f=document.addressListForm;
  var resutlt = window.confirm('削除してもよろしいですか?');
  if(resutlt){
    f.method="post";
    f.action=action;
    f.deleteId.value=id;
    f.submit();
  }
  else{
    alert('削除をキャンセルしました。');
  }
}

#6 List.html

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>アドレス一覧画面</title>
<script th:src="@{/js/PostAction.js}"></script>
</head>
<body>
  <form id="addressListForm" name="addressListForm" action="#" th:action="@{/input}" method="post">
    <table>
      <tr>
        <th>No</th>
        <th>名前</th>
        <th>住所</th>
        <th>電話番号</th>
        <th>メールアドレス</th>
        <th>職業</th>
        <th>性別</th>
        <th>編集</th>
        <th>削除</th>
      </tr>
      <th:block th:each="li:${list}">
        <tr>
          <td th:text="${li.no}"></td>
          <td th:text="${li.name}"></td>
          <td th:text="${li.address}"></td>
          <td th:text="${li.tel}"></td>
          <td th:text="${li.mail}"></td>        
          <td th:text="${li.job}"></td>
          <td>
            <span th:if="${li.gender != null}">
              <span th:if="${li.gender == '0'}">男</span>
              <span th:if="${li.gender == '1'}">女</span>
            </span>
          </td>  
          <td>
            <a href="#"
              th:attr="onclick='postAction(\'' +${li.no} + '\',\'' + @{/modify} + '\');'">
              <span th:text="${li.name}"></span>
            </a>
          </td>
          <td>
            <a href="#"
              th:attr="onclick='postActionDel(\'' +${li.no} + '\',\'' + @{/delete} + '\');'">
              <span th:text="${li.name}"></span>
            </a>
          </td>
        </tr>
      </th:block>
    </table>
    <button type="submit" name="id" th:value="new">新規作成</button>
     <input type="hidden" name="modifyId" >
     <input type="hidden" name="deleteId" >
  </form >
</body>
</html>

#7 DeleteComplete.html

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>削除完了画面</title>
</head>
<body>
<form action="#" th:action="@{/list}" method="post">
  <div>
    <p>削除が完了しました。</p>
      <button type="submit" name="id" th:value="next">一覧へ</button>
    </div>
  </form>
</body>
</html>

Follow me!