はじめに
O/Rマッパーの一つであるMyBatisを使いQiitaのような質問投稿アプリを作成しています。
そこで悩んだ例外処理の発生原因について、忘備録兼同じことで悩んでいる方の手助けができればと思い投稿しました。
認識が異なる点があればご指摘いただけると嬉しいです。。。
org.apache.ibatis.binding.BindingException
①リポジトリクラスにアノテーションが抜けていた
org.apache.ibatis.binding.BindingException: Invalid bound statement (not found): com.example.demo.repository.UserMapper.insert
at org.apache.ibatis.binding.MapperMethod$SqlCommand.<init>(MapperMethod.java:235) ~[mybatis-3.5.7.jar:3.5.7]
こちらの例外は、ユーザー情報を入力し、登録ボタンを押して次の画面に遷移する際に発生しました。
発生原因としては、Javaで作成しているRepositoryクラスに@Insertのアノテーションが抜けていたことでした。
ちなみに全件検索やID検索をする際は@Select、更新では@Updateなどやりたい処理ごとにアノテーションをつける必要があります。
/** ユーザー情報を登録する */
@Insert("insert into users(name, email, password, zipcode, address, telephone) \n"
+ " values(#{name},#{email},#{password},#{zipcode},#{address},#{telephone});")
public void insert(User user);
②パラメータの指定ができていなかった
org.apache.ibatis.binding.BindingException: Parameter 'email' not found. Available parameters are [arg1, arg0, param1, param2]
at org.apache.ibatis.binding.MapperMethod$ParamMap.get(MapperMethod.java:212) ~[mybatis-3.5.7.jar:3.5.7]
「メールアドレス」と「パスワード」が一致している場合のみログインする処理を実装したとき、上記例外が発生しました。
こちらの例外発生は、@Param指定ができていないことが原因でした。
そのため、下記のようにパラメータを指定することで解決しました。
/** メールアドレスとパスワードが一致したレコードを取得する */
@Select("select * from users where email = #{email} and password = #{password};")
public User findByEmailAndPassword(@Param("email") String email, @Param("password") String password);
以上が今回発生した例外処理と解決方法でした。
ご参考になれば幸いです。