前回の記事の続きです。
次はクラスを作っていきます。
前回までの分はこちら
https://qiita.com/sumichan/items/bdc2a0e909416ae55162
3-1.Model.java
今回使うのはidとtask(やること)だけです。
@NotBlank
はvalidationでblank入力を禁止します。
@Data
はlombokがセッティングさせていれば使用できますが、されていなければgetter,setterを自分で書いてください。
@Data //lombokが入っていればこれでgetter,setter生成完了
public class Todo {
private Long id;
@NotBlank
private String task;
}
3-2.TodoMapper.java
個人的にmapperから書いていくとわかりやすいです。
必要なSQLを書いていきます。今回だとこの5つを使います。
mapperクラスにはinterfaceのクラスにして、@Mapper
を付けます。
@Mapper
public interface TodoMapper {
//全件取得
@Select("select * from todo")
List<Todo> selectAll();
//idが一致した1件を取得
@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へ何を取ってくるのか指示しています。
@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を画面に渡しています。
あとは画面遷移の指示をしています。
@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://qiita.com/ozaki25/items/fe5fc876bd55a9d7daa9
大変お世話になりました。
ありがとうございます。
最後に
このアプリができればMyBatisを使ったCRUDの流れが掴めると思います。
応用して色々試してみてください!
最後まで読んでいただきありがとうございました。