首頁 > 軟體

mybatis對傳入基本型別引數的判斷方式

2022-03-12 13:00:31

對傳入基本型別引數的判斷

mybatis的xml檔案的sql語句中parameterType為基本型別,如:

<select id="getCustomer" parameterType="Integer" resultType="Customer">
    select * from customer
    where
    <if test="id != null">id=#{id}</if>
<select>

會報錯:There is no getter for property named 'id' in 'class java.lang.Integer'

這是因為Integer物件中沒有id屬性

解決辦法

<select id="getCustomer" parameterType="Integer" resultType="Customer">
    select * from Customer
    where
    <if test="_parameter != null">id=#{_parameter}</if>
<select>

即將接收引數的引數名改為_parameter,注意改成其他引數名沒用。

傳入基本型別引數時test判斷報錯

在使用mybatis的時候出現了這樣的問題:

//Dao層的介面中的程式碼
List<Map<String,Object>> getName(String username);
//對應的mapper中的程式碼
<select id="getName" resultType="java.util.Map">
    select name,client_id
    from table1
    <where> 
        <if test=" username!= null and username!='' ">
            and username= #{id}
        </if>
    </where> 
</select>

//報的錯誤
org.mybatis.spring.MyBatisSystemException: nested exception is org.apache.ibatis.reflection.ReflectionException: 
There is no getter for property named 'username' in 'class java.lang.String'

分析

There is no getter for property named ‘username’ in ‘class java.lang.String’,這句話打大概意思是:在“class java.lang.String”中沒有名為“username”的屬性的getter方法。因為mybatis預設採用ONGL解析引數,所以會自動採用物件樹的形式取string.num值,引起錯誤。

解決辦法

if test中的id用_parameter替換,而實際的語句不需要修改and a.id =#{id},因為Mybatis當只傳入一個引數時#{ } 中的內容沒有要求。

在Mapper中給出入參設定名稱,例:public … getName(@Param(“username”) String username);這樣修改後我們前面的寫法就不會報錯了。

小結一下

在傳入基本型別的資料時,if標籤中test判斷的書寫hi根據ognl表示式來取值的,所以不能直接寫引數的名稱,要利用_parameter來替代,或者利用註解@Pram("")來給引數起別名。

補充一點點:標籤when中的test屬性也有同樣的問題!!!

以上為個人經驗,希望能給大家一個參考,也希望大家多多支援it145.com。


IT145.com E-mail:sddin#qq.com