【MyBatis學習06】_parameter:解決There is no getter for property named in class java.lang.String
我們知道在mybatis的對映中傳引數,只能傳入一個。通過#{引數名} 即可獲取傳入的值。
Mapper介面檔案:
public int delete(int id) throws Exception;
MapperL配置檔案:
<delete id="delete" parameterType="int">
delete from user where id=#{id}
</delete>
介面中我們定義了delete(int id),形參的名稱為id。順理成章的在sql段裡就用#{id}去獲取。
其實這裡的”引數名”可以是任意的。
因為JAVA反射只能獲取方法引數的型別,但無從得知方法引數的名字的
上面這個例子把#{id}
#{di}
,一樣執行。當然為了便於閱讀程式碼,還是用#{id}
。 _parameter
則是java對通過反射獲取引數後,給引數取的別名。所以用#{_parameter}
也行。
但有幾種情況你必須得用_parameter
:
第一種情況:拼接字元${}。咱這裡先不去考慮SQL注入這些問題。
public List<User> findByName(String searchkey) throws Exception;
<select id="findByName" parameterType="String" resultType="twm.mybatisdemo.pojo.User" >
select * from user where username like '%${searchkey}%'
</select>
因為要使用模糊查詢。要在入參前後加上%,所以不能用佔位符#{},而要用拼接字串
一切都似乎沒有問題,執行,報錯:
Exception in thread “main”
org.apache.ibatis.exceptions.PersistenceException: ### Error querying database. Cause:
org.apache.ibatis.reflection.ReflectionException: There is no getter for property named ‘searchkey’ in ‘class java.lang.String’
org.apache.ibatis.reflection.ReflectionException: There is no getter for property named ‘searchkey’ in ‘class java.lang.String’
問題就出在拼接字串${searchkey}
。和佔位符#{}
不同的是,java不會自動將${searchkey}
對應成_parameter
。因此只能自己寫
<select id="findByName" parameterType="String" resultType="twm.mybatisdemo.pojo.User">
select * from user where username like '%${_parameter}%'
</select>
OK,一切又正常了。
可是你沒有覺得這種寫法太不賞必悅目了?
mybatis考慮到這點,你只需在介面的方法引數前加上param註解就好了。
public List<User> findByName(@Param(value="searchkey") String searchkey) throws Exception
;
第二種情況:動態SQL中的條件判斷語句中
public List<User> findByName(String searchkey) throws Exception;
<select id="findByName" parameterType="String" resultType="twm.mybatisdemo.pojo.User">
<bind name="likestr" value="'%'+ searchkey +'%'"></bind>
select * from user
<where>
<if test="searchkey !='' and searchkey !=null">
username like #{likestr}
</if>
</where>
</select>
在if和bind元素中涉及到引數searchkey。直接使用searchkey也會報上面一樣的錯誤
解決辦法就是用_parameter替換searchkey
或者在介面的方法引數前加上param註解。
public List<User> findByName(@Param(value="searchkey") String searchkey) throws Exception;