


この記事で分かること
- Invalid bound statement (not found)の解決策
- Invalid bound statement (not found)の主な原因
こないだ、「MyBatis」のエラーで「Invalid bound statement (not found)」というエラーでハマって解決できたので、原因と解決案について紹介します!
今回発生したエラー
「MyBatis」を使って開発をしていた時に以下のエラーが発生しました。

There was an unexpected error (type=Internal Server Error, status=500).
Invalid bound statement (not found): com.example.fms.repository.CategoryRepository.selectAll
org.apache.ibatis.binding.BindingException: Invalid bound statement (not found): com.example.fms.repository.CategoryRepository.selectAll
「org.apache.ibatis.binding.BindingException」このエクセプションは、リポジトリ周りで、よく見るエラーなんですよね。

結論:XML側の id がRepository側とずれていた
<mapper namespace="com.example.fms.repository.CategoryRepository">
<select id="select"
resultType="com.example.fms.domain.Category">
SELECT *
FROM m_category
ORDER BY category_id ASC
</select>
</mapper>
@Mapper
public interface CategoryRepository {
/**
* 全件取得
*/
public List selectAll();
}
今回の私の場合は、Repositoryのメソッド名と、Mapper XML側の id の一致がずれていたので、合わせることで解決しました。


エラーが発生した原因
MyBatisでは、XMLにSQLを書く方法や、Mapperインターフェース側にアノテーションでSQLを書く方法があります。
※ここでいうMapperインターフェース側はリポジトリの事を指しています。
機会があればRepositoryクラスに直接クエリを記述する方法も紹介したいと思います!
今回はXMLにクエリを記述していたのですが、その際の「XML側のid」と「リポジトリのメソッド名」を合わせないといけないのがずれていたのが原因でした。
他にもエラーになるパターン
今回を含めた発生パターンとして下記のパターンがあります。
- リポジトリのメソッド名とXMLの id が不一致
- XMLの namespace とリポジトリのパスが不一致
- Mapper XMLの配置場所がMyBatisの読み込み対象になっていない
他にもあると思いますが、大体この変だと思います。
メモ
「MyBatisの読み込み対象になっていない」に関しては「application.properties」の中のパスを見ればすぐわかると思います。
ほとんど、下記画像のようになっている事が多いと思うので、可能性は低いかもしれませんが…。

まとめ
今回の私の場合は、Repositoryのメソッド名と、Mapper XML側の id が一致していなかったことが原因でした。
このエラーが出たときは、まず次の3つを確認してみてください。
ポイント
・Repositoryのメソッド名とXMLの id が一致しているか
・XMLの namespace とRepositoryのパスが一致しているか
・Mapper XMLがMyBatisの読み込み対象になっているか
Invalid bound statement (not found) は、エラー文だけ見ると少し分かりづらいですが、
「MyBatisが呼び出したいSQLを見つけられていない」
と考えると、原因を追いやすくなると思います。
同じエラーで困っている方は、是非参考にしてみてください!