MyBatisの「Invalid bound statement (not found)」エラーは、MyBatisが実行しようとしているSQLステートメントが見つからない場合に発生します。このエラーの原因とその解決策について、以下に記す。
1. Mapper InterfaceとXMLのファイル名、ファイル階層の不一致
MapperインタフェースとXMLは、以下のように階層構造とファイル名が一致している必要がある。
src/main/java/jp/com/example/domain/dao/TestMapper.java
src/main/resources/jp/com/example/domain/dao/TestMapper.xml
階層構造を同じにしたくない場合
・@MapperScanでインタフェースが存在するパッケージを指定する
@SpringBootApplication
@MapperScan("com.example.mapper") // Mapperインタフェースのパッケージ
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
・application.yml または application.properties に mapper.xml のパスを指定する
application.yml
mybatis:
mapper-locations: classpath:/mappers/**/*.xml # XMLファイルのパスを指定
2. SQLステートメントIDの不一致
Mapperインタフェースで定義されているメソッド名と、XMLファイルに定義されているSQLステートメントのIDが一致していない場合、MyBatisはそのステートメントを見つけられません。
TestMapper.java
@Mapper
public interface TestMapper {
UserInfoResult selectUserById(String id);
}
TestMapper.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="jp.com.example.domain.dao.TestMapper">
<select id="selectUserById" resultType="com.example.entity.UserEntity">
SELECT id, name, age
FROM users
WHERE id = #{id}
</select>
</mapper>
参考資料