※本ページはプロモーションが含まれています DB / SQL 開発

MyBatisのInvalid bound statement(not found)の直し方

 

ラビット
ラビット
Invalid bound statement (not found)ってなんだ!?
エラーを見る限り「MyBatis」のエラーだとは思うんだけど…
豆ひよこ
豆ひよこ

 

この記事で分かること

  • 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」このエクセプションは、リポジトリ周りで、よく見るエラーなんですよね。

 

ラビット
ラビット
Invalid bound statement (not found)…リポジトリ周りでなんかうまく渡せてないのかな??

 

結論:XML側の id がRepository側とずれていた

 

CategoryMapper.xml

<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>
  

 

CategoryRepository.java

@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を見つけられていない」

と考えると、原因を追いやすくなると思います。

 

同じエラーで困っている方は、是非参考にしてみてください!

-DB / SQL, 開発
-, , , ,