MyBatis 入門ガイド:基本からCRUD操作までを解説

1. MyBatis の概要

MyBatis は、データベース操作を簡素化する Java の永続層フレームワークです。JDBC の冗長なコードを排除し、SQL と Java オブジェクトのマッピングを自動化します。元々は Apache の iBatis プロジェクトとして開発され、2010 年に Google Code へ移行後、MyBatis に改名され、現在は GitHub で管理されています。

2. 環境構築と最初の一歩

Spring Boot プロジェクトを作成し、MyBatis 関連の依存関係(mybatis-spring-boot-starter およびデータベースドライバ)を pom.xml に追加します。

2.1 エンティティクラスの作成

プロジェクトのエントリポイントと同じパッケージ配下に entity パッケージを作成し、データベースのテーブル構造に対応するエンティティクラスを定義します。

@Data
@NoArgsConstructor
@AllArgsConstructor
public class User {
    private Integer id;
    private String username;
    private String password;
    private String name;
    private Integer age;
}

2.2 Mapper インターフェースの定義

mapper パッケージを作成し、@Mapper アノテーションを付与したインターフェースを定義します。ここに SQL 操作を記述します。

@Mapper
public interface UserMapper {
    @Select("SELECT * FROM user")
    List<User> findAll();
}

2.3 データベース接続設定

application.properties ファイルに接続情報を記述します。

spring.datasource.url=jdbc:mysql://localhost:3306/your_database_name
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.username=root
spring.datasource.password=your_password

2.4 動作確認(ユニットテスト)

プロジェクトが自動生成するテストクラスを利用し、Mapper の動作を確認します。

@SpringBootTest
class ApplicationTests {
    @Autowired
    private UserMapper userMapper;

    @Test
    void testFindAll() {
        List<User> users = userMapper.findAll();
        users.forEach(System.out::println);
    }
}

3. 便利な補助設定

3.1 SQL 補完機能の有効化

IDE(IntelliJ IDEA)で SQL 文を記述する際、データベース接続を設定することで補完が効くようになります。新バージョンでは自動設定される場合があります。

3.2 ログ出力の設定

実行される SQL をコンソールで確認するには、以下の設定を application.properties に追加します。

mybatis.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl

4. アノテーションによる CRUD 操作

MyBatis ではアノテーションを使って簡単な SQL を記述できます。パラメータは #{} 構文でバインドします。

4.1 削除(@Delete)

@Delete("DELETE FROM user WHERE id = #{id}")
int deleteById(Integer id);
@Test
void testDelete() {
    userMapper.deleteById(36);
}

4.2 追加(@Insert)

@Insert("INSERT INTO user(username, password, name, age) VALUES(#{username}, #{password}, #{name}, #{age})")
int insert(User user);
@Test
void testInsert() {
    User user = new User();
    user.setUsername("admin");
    user.setPassword("123456");
    user.setName("管理者");
    user.setAge(30);
    userMapper.insert(user);
}

4.3 更新(@Update)

@Update("UPDATE user SET username=#{username}, password=#{password}, name=#{name}, age=#{age} WHERE id=#{id}")
int update(User user);
@Test
void testUpdate() {
    User user = new User();
    user.setId(6);
    user.setUsername("admin666");
    user.setPassword("123456");
    user.setName("管理者");
    user.setAge(30);
    userMapper.update(user);
}

4.4 検索(@Select)

複数のパラメータを渡す場合は @Param アノテーションで明示的に名前を指定します(Spring Boot の最新バージョンでは省略可能な場合もあります)。

@Select("SELECT * FROM user WHERE username = #{username} AND password = #{password}")
User findByUsernameAndPassword(@Param("username") String username, @Param("password") String password);
@Test
void testFindByUsernameAndPassword() {
    User user = userMapper.findByUsernameAndPassword("admin666", "123456");
    System.out.println(user);
}

5. XML マッピングによる高度な設定

複雑な SQL や動的 SQL を扱う場合は、XML マッピングファイルを使用します。

5.1 規約

  • XML ファイルの名前は Mapper インターフェースの完全修飾名と一致させる(例:com/example/mapper/UserMapper.xml
  • XML の namespace 属性はインターフェースの完全修飾名とする
  • 各 SQL 要素の id はインターフェースのメソッド名と一致させる

5.2 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.mapper.UserMapper">
    <select id="findAll" resultType="com.example.entity.User">
        SELECT id, username, name, age FROM user
    </select>
</mapper>

インターフェース側ではアノテーションを外して、メソッドのみ定義します。

List<User> findAll();

6. MyBatis 採用のメリット

従来の JDBC と比較して、以下の課題を解決します。

  • 設定の一元化:接続情報などの設定がアプリケーションコードから分離され、application.properties に集約される
  • 自動マッピング:クエリ結果が自動的に Java オブジェクトに変換されるため、手動で結果セットを解析する必要がない
  • コネクションプール:データベース接続の生成と破棄を効率的に管理し、リソースの無駄を削減する

タグ: MyBatis Spring Boot JDBC crud SQLマッピング

8月2日 15:58 投稿