EclipseによるSpringBoot⑤MyBatis insert

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

今回のテーマは、MyBatisのinsertです。
insertは、SQL文で挿入の命令です。
新規にデータを登録するときに使います。

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

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

修正/新規資源一覧は以下に示します。

#ファイル名概要種別修正/新規
1AddressController.java住所コントローラクラスjava修正
2AddressMapper.java住所マッパーインターフェイスjava修正
3AddressService.java住所サービスクラスjava修正
4AddressMapper.xml住所マッパーSQLSQL修正
5Complete.html住所登録完了画面タイムリーフThymeleaf新規
作成手順 ①ソースの作成
 ①-1 住所コントローラクラス
   登録ボタン押下時のメソッド作成
 ①-2 住所マッパーインターフェイス
   ID最大値取得メソッド作成
 ①-3 住所マッパーインターフェイス
   住所挿入メソッド作成
 ①-4 住所サービスクラス
   ID最大値取得メソッド作成
 ①-5 住所サービスクラス
   住所登録メソッド作成
②SQLマッパーの作成
 ②-1 SQL select ID最大値取得
 ②-2 SQL insert 住所挿入
③Thymeleaf(タイムリーフ)の作成
 ③-1 住所登録完了画面作成

①ソースの作成
 ①-1 住所コントローラクラス
    登録ボタン押下時のメソッド作成

行数説明
100~107@ReauestParamは、リクエストのパラメータです。
名前(name)、住所(address)、メール(mail)、電話番号(tel)、職業(job)、性別(gender)、
ボタン種別(id)
108~124ボタン種別(id)が("back")つまり、「戻る」ボタン押下時処理になります。
inputFormオブジェクトをインスタンス、情報を設定し直して、入力画面に遷移先を設定します。
行数説明
127IDの最大値を取得します。このIDは、主キーで重複して設定することができません。なのであらかじめ、最大値を取得してそれより大きい値で次に登録するようにします。
129住所DTOのインスタンスをしています。
132~138住所DTOに、ID最大値+1、名前、住所、メール、電話番号、職業、性別を設定しています。
141住所DTOを引数として、住所テーブルに登録します。
143画面の遷移先を「登録完了画面」タイムリーフに設定します。

 ①-2 住所マッパーインターフェイス
    ID最大値取得メソッド作成
 ①-3 住所マッパーインターフェイス
    住所挿入メソッド作成

行数説明
13ID最大値を取得メソッド
15住所アドレス登録メソッド

 ①-4 住所サービスクラス
    ID最大値取得メソッド作成
 ①-5 住所サービスクラス
    住所登録メソッド作成

行数説明
22~24ID最大値取得メソッド
住所マッパーインターフェイスのID最大値取得メソッドを呼び出しています。
27~29住所登録メソッド
住所マッパーインターフェイスの住所登録メソッドを呼び出しています。

②SQLマッパーの作成
 ②-1 SQL select ID最大値取得
 ②-2 SQL insert 住所挿入

行数説明
14~19住所テーブルからidの最大値をセレクト(取得)します。
21~25住所テーブルに住所DTO(ID、住所、電話番号、名前、メール、職業、性別)
の内容でインサート(登録)します。

③Thymeleaf(タイムリーフ)の作成
 ③-1 住所登録完了画面作成

行数説明
8th:action="@{/list}"は送信先の宛先を設定しています。
method="post"はHTTPプロトコルのpostでリクエストします。
11「一覧画面」へ遷移するためのボタンの設定です。

これで、準備完了です。
では、H2データベースを起動して、Bootダッシュボードから起動しましょう。
URLにlocalhost:8080/listを打ちましょう。
住所一覧が表示され、新規作成ボタンを押下します。

入力画面が表示されます。追加したい情報を入力します。

入力後に、次へボタンを押下します。

確認画面で、登録ボタンを押下します。

登録完了画面で、一覧へボタンを押下します。

新規に追加した住所情報が一覧に表示されたら成功です。お疲れ様でした。

☆まとめ☆ 今回は、MyBatisによるSQL文のinsertの命令について、学びました。
画面から入力させて、データベースに登録する処理は
よく使われます。覚えておきたいスキルだと思います。

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

#1 AddressController.java

package com.example.demo.controller;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.validation.BindingResult;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.ModelAttribute;
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.dto.AddressDto;
import com.example.demo.form.AddressListForm;
import com.example.demo.form.InputForm;
import com.example.demo.service.AddressService;

@RestController
public class AddressController {
  @Autowired
  private AddressService addressService;
  
  @RequestMapping("/list")
  ModelAndView getList(ModelAndView model) {
    
    List list = addressService.getAddress();
    
    List formList = new ArrayList();
    for(AddressDto li:list) {
      AddressListForm form = new AddressListForm();
      form.setNo(li.getId());
      form.setAddress(li.getAddress());
      form.setName(li.getName());
      form.setTel(li.getTel());
      form.setMail(li.getMail());
      form.setJob(li.getJob());
      form.setGender(li.getGender());
      formList.add(form);
    }
    
    //Thymeleafにリスト情報を設定
    model.addObject("list",formList);
    //Thymeleaf名を設定
    model.setViewName("list");
    
    return model;
  }

  //新規作成ボタン押下時の処理
  @RequestMapping("/input")
  public ModelAndView input(ModelAndView model) {
    
    InputForm inputForm = new InputForm();
    
    Map genderMap = new HashMap<>();
    genderMap.put("0", "男");
    genderMap.put("1", "女");
    inputForm.setGenderItem(genderMap);
    model.addObject("inputForm",inputForm);
    //Thymeleaf名を設定
    model.setViewName("input");
    
    return model;
  }

  //確認画面
  @RequestMapping("/confirm")
  public ModelAndView confirm(@Validated @ModelAttribute InputForm inputForm,
      BindingResult result, ModelAndView model,@RequestParam("id")String id) {
    //リダイレクトして一覧画面に戻る
    if(id.equals("back")) {
      //一覧画面に戻る
      model.setViewName("redirect:/List");
      return model;
    }
    //エラーチェック
    if(result.hasErrors()) {
      model.addObject("validationError", "不正な値が入力されました。");
      
      Map genderMap = new HashMap<>();
      genderMap.put("0", "男");
      genderMap.put("1", "女");
      inputForm.setGenderItem(genderMap);
      model.addObject("inputForm",inputForm);
      
      //入力画面に戻る
      model.setViewName("input");
     return model;
    }
    //確認画面に遷移
    model.setViewName("Confirm");
    return   model;
  }

  //登録ボタン押下時
  @RequestMapping("/register")
  public ModelAndView register(ModelAndView model ,
      @RequestParam("name")String name,
      @RequestParam("address")String address,
      @RequestParam("mail")String mail,
      @RequestParam("tel")String tel,
      @RequestParam("job")String job,
      @RequestParam("gender")String gender,
      @RequestParam("id")String id) {
    if(id.equals("back")) {
      InputForm inputForm = new InputForm();
      inputForm.setName(name);
      inputForm.setAddress(address);
      inputForm.setMail(mail);
      inputForm.setTel(tel);
      inputForm.setJob(job);
      inputForm.setGender(gender);
      Map genderMap = new HashMap<>();
      genderMap.put("0", "男");
      genderMap.put("1", "女");
      inputForm.setGenderItem(genderMap);
      model.addObject("inputForm",inputForm);
      //入力画面に戻る
      model.setViewName("Input");
      return model;
    }
      
    //ID最大値取得
    long idMax = addressService.getIdMax();
      
    AddressDto dto = new AddressDto();
      
    //アドレス情報の設定
    dto.setId(idMax+1);
    dto.setName(name);
    dto.setAddress(address);
    dto.setMail(mail);
    dto.setTel(tel);
    dto.setJob(job);
    dto.setGender(gender);
      
    //アドレス情報の登録
    addressService.registerAddress(dto);
    //完了画面に遷移
    model.setViewName("Complete");
    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);
  
}

#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);
  }

}

#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>
</mapper>

Follow me!