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 オブジェクトに変換されるため、手動で結果セットを解析する必要がない
- コネクションプール:データベース接続の生成と破棄を効率的に管理し、リソースの無駄を削減する