MyBatis+SpringBootでCRUDアプリを作る ※余計なものはナシ※ 2/2

前回の記事の続きです。
次はクラスを作っていきます。
前回までの分はこちら
https://qiita.com/sumichan/items/bdc2a0e909416ae55162

# 3-1.Model.java
今回使うのはidとtask(やること)だけです。
`@NotBlank`はvalidationでblank入力を禁止します。
`@Data`はlombokがセッティングさせていれば使用できますが、されていなければgetter,setterを自分で書いてください。

```Java
@Data //lombokが入っていればこれでgetter,setter生成完了
public class Todo {

	private Long id;

	@NotBlank
	private String task;
}
```

# 3-2.TodoMapper.java
個人的にmapperから書いていくとわかりやすいです。
必要なSQLを書いていきます。今回だとこの5つを使います。
mapperクラスにはinterfaceのクラスにして、`@Mapper`を付けます。

```java

@Mapper
public interface TodoMapper {

	//全件取得
	@Select("select * from todo")
	List<Todo> selectAll();

	//idが一致した１件を取得
	@Select("select * from todo where id = #{id}")
	Todo selectOne(Long id);

	//登録
	@Options(useGeneratedKeys = true) //自動で連番のidを取得する
	@Insert("insert into todo (task) values (#{task})")
	void insert(Todo todo);

	//更新
	@Update("update todo set task = #{task} where id = #{id}")
	int update(Todo todo);

	//削除
	@Delete("delete from todo where id = #{id}")
	void delete(Long id);
}
```
# 3-3.TodoService.java
サービスクラスには`@Service`を付けます。
mapperへ何を取ってくるのか指示しています。

```java

@Service
public class TodoService {

	@Autowired
	private TodoMapper todoMapper;

	//全件取得
	@Transactional
	public List<Todo> selectAll() {
		return todoMapper.selectAll();
	}

	//一件取得
	@Transactional
	public Todo selectOne(Long id) {
		return todoMapper.selectOne(id);
	}

	//登録
	@Transactional
	public void insert(Todo todo) {
		todoMapper.insert(todo);
	}

	//更新
	@Transactional
	public int update(Todo todo) {
		return todoMapper.update(todo);
	}

	//削除
	@Transactional
	public void delete(Long id) {
		todoMapper.delete(id);
	}


}
```
# 3-4.TodoController.java
controlleは実行した結果のSQLを画面に渡しています。
あとは画面遷移の指示をしています。

```java
@Controller
@RequestMapping("/todos")
public class TodoController {

	@Autowired
	private TodoService todoService;

	//全件取得したtodoを、todoに入れておき、top.htmlで表示する。
	@GetMapping("")
	public String top(Model model) { //全件取得
		model.addAttribute("todo", todoService.selectAll());
        //todoにselectAll()の結果を入れて、top.htmlで表示する
		return "todos/top";//画面はtopへ移り、todoを表示する
	}

	@GetMapping("new") //top→newボタン
	public String newTodo(Model model, @ModelAttribute Todo todo) {
        //newボタンがtopで押されるとここを通る
		return "todos/new";
	}

	@PostMapping("new") //formから作成された画面
	public String create(@Validated @ModelAttribute Todo todo,BindingResult result) {

		if (result.hasErrors()) {
			return "todos/new";
		}

		todoService.insert(todo);//バリデーションに引っかからなければinsert実行
		return "redirect:/todos";//一覧表に戻る
	}

	@GetMapping("{id}") //1件分のデータの中身を確認する
	public String show(@PathVariable Long id, Model model) {
		model.addAttribute("todo", todoService.selectOne(id));//urlのidを使ってsql実行
		return "todos/show";
	}

	@GetMapping("{id}/change") //編集画面に行くまでの画面
	public String change(@PathVariable Long id, Model model) {
		model.addAttribute("todo", todoService.selectOne(id));
		return "todos/change";//取得したidを使って、change画面へ
	}

	@PutMapping("put/{id}") //更新画面
	public String update(Todo todo) {
		todoService.update(todo);
		return "redirect:/todos";
	}

	@DeleteMapping("{id}/delete") //消去画面
	public String dast(@PathVariable Long id) {
		todoService.delete(id);
		return "redirect:/todos";
	}
}
```
>if (result.hasErrors()

バリデーションチェックに引っかかった場合（今回はtaskがブランクだった場合）は、new.htmlに戻るように指示されています。
バリデーションチェックを使用する場合は`@Validated`を付けて、BindingResultを使います。

`@PathVariable`でURLの値を使うことができます。

# 4.`http://localhost:8080/todos`を実行する
設定を8080にしていなければ変えてください。
無事にCRUDができたら完成です！
お疲れ様でした！

# ソースコード
https://github.com/IwaiSumire/trial/tree/main/Qiita210121

# 参考
https://qiita.com/ozaki25/items/fe5fc876bd55a9d7daa9
大変お世話になりました。
ありがとうございます。

# 最後に
このアプリができればMyBatisを使ったCRUDの流れが掴めると思います。
応用して色々試してみてください！


**最後まで読んでいただきありがとうございました。**