1. 程式人生 > >【MyBatis學習06】_parameter:解決There is no getter for property named in class java.lang.String

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

因為要使用模糊查詢。要在入參前後加上%,所以不能用佔位符#{},而要用拼接字串{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’

問題就出在拼接字串${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;