1. 程式人生 > >MyBatis中mapper介面方法多引數傳入

MyBatis中mapper介面方法多引數傳入

測試一個更新使用者密碼的mapper方法的時候出現了這個異常:

Caused by: org.apache.ibatis.binding.BindingException: Parameter 'password' not found. Available parameters are [0, 1, param1, param2]
at org.apache.ibatis.binding.MapperMethod$ParamMap.get(MapperMethod.java:186)
at org.apache.ibatis.reflection.wrapper.MapWrapper.get(MapWrapper.java:45)
at org.apache.ibatis.reflection.MetaObject.getValue(MetaObject.java:122)
at org.apache.ibatis.scripting.defaults.DefaultParameterHandler.setParameters(DefaultParameterHandler.java:79)
at org.apache.ibatis.executor.statement.PreparedStatementHandler.parameterize(PreparedStatementHandler.java:93)
at org.apache.ibatis.executor.statement.RoutingStatementHandler.parameterize(RoutingStatementHandler.java:64)
at org.apache.ibatis.executor.SimpleExecutor.prepareStatement(SimpleExecutor.java:86)
at org.apache.ibatis.executor.SimpleExecutor.doUpdate(SimpleExecutor.java:49)
at org.apache.ibatis.executor.BaseExecutor.update(BaseExecutor.java:117)
at org.apache.ibatis.executor.CachingExecutor.update(CachingExecutor.java:76)
at org.apache.ibatis.session.defaults.DefaultSqlSession.update(DefaultSqlSession.java:198)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at org.mybatis.spring.SqlSessionTemplate$SqlSessionInterceptor.invoke(SqlSessionTemplate.java:434)
... 34 more

先看看測試程式碼

@Update({"update", TABLE_NAME, "set password=#{password} where id=#{id}"})
void setPassword(String password, int id);//mapper方法
userDAO.setPassword("abcd",4);//設定id為4的使用者密碼
在單個引數的情況下並不會出現找不到引數這個問題,mybatis預設把方法的引數傳入sql語句中,如果引數是物件就在物件的屬性中查詢和#{xxx}中名稱相同的屬性傳入。本來以為這種按照名稱匹配的查詢方法也適用於方法有多個引數的情況,然而僅僅這樣做無法達到這個目的。


下面給出兩種比較方便的解決辦法。

1. 按照方法的引數順序,在sql引數中以0、1、2...(引數索引號)代替sql引數的名稱。

比如下面的例子#{0}傳入方法的第一個引數password,#{1}傳入方法第二個引數id。

@Update({"update", TABLE_NAME, "set password=#{0} where id=#{1}"})
void setPassword(String password, int id);

2.引入註解org.apache.ibatis,Param,在方法引數中對每個引數用@Param註解並給出一個和sql語句中需要傳入的引數相同的名稱,這樣就能把方法的引數和sql語句相應引數進行匹配。如下

@Update({"update", TABLE_NAME, "set password=#{password} where id=#{id}"})
void updatePassword(@Param("password") String password, @Param("id") int id);