【MyBatis學習06】_parameter:解決There is no getter for property named in class java.lang.String

咱們知道在mybatis的映射中傳參數,只能傳入一個。經過#{參數名} 便可獲取傳入的值。java

Mapper接口文件:sql

public int delete(int id) throws Exception;

MapperL配置文件:apache

<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}也行。mybatis

但有幾種狀況你必須得用_parameterapp

第一種狀況:拼接字符${}。咱這裏先不去考慮SQL注入這些問題。ui

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>

由於要使用模糊查詢。要在入參先後加上%,因此不能用佔位符#{},而要用拼接字符串atom

{searchkey}
一切都彷佛沒有問題,運行,報錯:
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’ ### Cause:
org.apache.ibatis.reflection.ReflectionException: There is no getter for property named ‘searchkey’ in ‘class java.lang.String’spa

問題就出在拼接字符串${searchkey}。和佔位符#{}不一樣的是,java不會自動將${searchkey}對應成_parameter。所以只能本身寫code

<select id="findByName" parameterType="String" resultType="twm.mybatisdemo.pojo.User"> select * from user where username like '%${_parameter}%' </select>

OK,一切又正常了。
但是你沒有以爲這種寫法太不賞必悅目了?orm

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;
相關文章
相關標籤/搜索