EclipseによるSpringBoot⑤MyBatis insert
EclipesによるSpringBootの連載の続きです。
①コントローラ
②Thymeleaf
③MyBatis select
④Validation
⑤MyBatis insert(今回)
今回のテーマは、MyBatisのinsertです。
insertは、SQL文で挿入の命令です。
新規にデータを登録するときに使います。
修正/新規のJavaソース資源のディレクトリを示します。
修正/新規のリソース資源のディレクトリ構成を示します。
修正/新規資源一覧は以下に示します。
# | ファイル名 | 概要 | 種別 | 修正/新規 |
1 | AddressController.java | 住所コントローラクラス | java | 修正 |
2 | AddressMapper.java | 住所マッパーインターフェイス | java | 修正 |
3 | AddressService.java | 住所サービスクラス | java | 修正 |
4 | AddressMapper.xml | 住所マッパーSQL | SQL | 修正 |
5 | Complete.html | 住所登録完了画面タイムリーフ | Thymeleaf | 新規 |
①ソースの作成
①-1 住所コントローラクラス
登録ボタン押下時のメソッド作成
行数 | 説明 |
100~107 | @ReauestParamは、リクエストのパラメータです。 名前(name)、住所(address)、メール(mail)、電話番号(tel)、職業(job)、性別(gender)、 ボタン種別(id) |
108~124 | ボタン種別(id)が("back")つまり、「戻る」ボタン押下時処理になります。 inputFormオブジェクトをインスタンス、情報を設定し直して、入力画面に遷移先を設定します。 |
行数 | 説明 |
127 | IDの最大値を取得します。このIDは、主キーで重複して設定することができません。なのであらかじめ、最大値を取得してそれより大きい値で次に登録するようにします。 |
129 | 住所DTOのインスタンスをしています。 |
132~138 | 住所DTOに、ID最大値+1、名前、住所、メール、電話番号、職業、性別を設定しています。 |
141 | 住所DTOを引数として、住所テーブルに登録します。 |
143 | 画面の遷移先を「登録完了画面」タイムリーフに設定します。 |
①-2 住所マッパーインターフェイス
ID最大値取得メソッド作成
①-3 住所マッパーインターフェイス
住所挿入メソッド作成
行数 | 説明 |
13 | ID最大値を取得メソッド |
15 | 住所アドレス登録メソッド |
①-4 住所サービスクラス
ID最大値取得メソッド作成
①-5 住所サービスクラス
住所登録メソッド作成
行数 | 説明 |
22~24 | ID最大値取得メソッド 住所マッパーインターフェイスのID最大値取得メソッドを呼び出しています。 |
27~29 | 住所登録メソッド 住所マッパーインターフェイスの住所登録メソッドを呼び出しています。 |
②SQLマッパーの作成
②-1 SQL select ID最大値取得
②-2 SQL insert 住所挿入
行数 | 説明 |
14~19 | 住所テーブルからidの最大値をセレクト(取得)します。 |
21~25 | 住所テーブルに住所DTO(ID、住所、電話番号、名前、メール、職業、性別) の内容でインサート(登録)します。 |
③Thymeleaf(タイムリーフ)の作成
③-1 住所登録完了画面作成
行数 | 説明 |
8 | th:action="@{/list}"は送信先の宛先を設定しています。 method="post"はHTTPプロトコルのpostでリクエストします。 |
11 | 「一覧画面」へ遷移するためのボタンの設定です。 |
では、H2データベースを起動して、Bootダッシュボードから起動しましょう。
URLにlocalhost:8080/listを打ちましょう。
住所一覧が表示され、新規作成ボタンを押下します。
入力画面が表示されます。追加したい情報を入力します。
入力後に、次へボタンを押下します。
確認画面で、登録ボタンを押下します。
登録完了画面で、一覧へボタンを押下します。
新規に追加した住所情報が一覧に表示されたら成功です。お疲れ様でした。
■ソースコードのコピーペースト用に記載します。
#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;
}
}
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
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.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.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.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);
}
import java.util.List;
import org.apache.ibatis.annotations.Mapper;
import com.example.demo.dto.AddressDto;
@Mapper
public interface AddressMapper {
public List
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);
}
}
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
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>
<!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>