業務でMyBatis Generatorを使う機会があり、基本的な使い方を整理したので共有します。
MyBatis Generator によって自動生成されるファイルを使えば、XMLファイルを手書きする必要がなくなり、以下のような基本的な SQL 操作に対応できます。
今回は SELECT / INSERT / UPDATE に絞って紹介します。
🔍 SELECT
JOIN を必要としない単一テーブルからの SELECT であれば、自動生成ファイルのみで十分対応可能です。
たとえば、プルダウン生成など「キーとバリューだけ取得したい」場面で役立ちます。
自動生成されるファイルは以下の2種類で、テーブルごとに作成されます:
- Book.java
- BookExample.java
この Example クラスを使って、柔軟に WHERE 句を構築できます。
全件取得するサンプル:
public List<Book> findAll() {
// 条件なしで全件取得
return BookMapper.selectByExample(new BookExample());
}
削除されていないレコードのみ取得するサンプル:
論理削除フラグ deleted が false のレコードのみ取得する例。
public List<Book> findAll() {
BookExample example = new BookExample();
example.createCriteria().andDeletedEqualTo(false);
return BookMapper.selectByExample(example);
}
<補足>
-
selectByExampleは、Exampleに指定された条件に一致するレコードをすべて取得します。条件が空の場合(初期化した
new BookExample()
を渡した場合)は全件取得になります。 -
BookExampleは検索条件を組み立てるためのクラスで、内部に
Criteria
を持ち、AND条件などをメソッドチェーンで記述できます。
INSERT
まずはControllerから。
formを受け取って、DB登録用のEntityに詰め替えて、サービス層へ渡す。
@PostMapping("/insert")
public String insert(@ModelAttribute BookForm form) {
Book book = toEntity(form); // 入力フォームをDB登録用のEntityに変換
bookService.insert(book);
return "redirect:/CompleteInsertBook";
}
// 詰め替えメソッド
public static Book toEntity(BookForm form) {
Book book = new Book();
book.setId(form.getId());
book.setTitle(form.getTitle());
book.setAuthor(form.getAuthor());
book.setGenreId(form.getGenreId());
book.setIsbn(form.getIsbn());
return book;
}
Service
insertSelective
メソッドを使うことで、Entityクラスに値が格納された非nullフィールドのみ対象としてINSERTされます。
public void insert(Book book) {
bookMapper.insertSelective(book); // nullフィールドは除外してINSERT
}
UPDATE
ControllerはInsertとほぼ同じ。
formを受け取って、DB登録用のEntityに詰め替えて、サービス層へ渡す。
@PostMapping("/update")
public String update(@ModelAttribute BookForm form) {
Book book = toEntity(form); // 入力フォームをDB登録用のEntityに変換
bookService.update(book);
return "redirect:/CompleteUpdateBook";
}
// 詰め替えメソッド
public static Book toEntity(BookForm form) {
Book book = new Book();
book.setId(form.getId());
book.setTitle(form.getTitle());
book.setAuthor(form.getAuthor());
book.setGenreId(form.getGenreId());
book.setIsbn(form.getIsbn());
return book;
}
Service
updateByPrimaryKeySelective
メソッドを使うことで、bookオブジェクトに格納されたプライマリキーに対応するレコードの、非nullフィールドを対象としてUPDATEされます。
public void update(Book book) {
// MyBatis Generator により生成された Mapper の updateByPrimaryKeySelective を使用。
// 主キーに対応するレコードのうち、非nullフィールドのみを対象に更新。
bookMapper.updateByPrimaryKeySelective(book);
}
<補足>
※プライマリキー以外の条件を使った更新も可能です。こちらは後ほど追記予定です。