@Param註解學習

小腿子發表於2020-12-20

在公司做測試的時候遇到了一個關於@Param註解的問題

Dao:

BikeBind getBikeBindByBikeQrCode(String bikeQrCode);

XML:

<select id="getBikeBindByBikeQrCode" resultType="com.ttyc.scm.material.dao.domain.BikeBind" >
    select * from t_scm_bike_bind
    <where>
        <if test="bikeQrCode != null">
            bike_qr_code = #{bikeQrCode}
        </if>
    </where>
</select>

我傳入的bikeQrCode是811010009

使用後報錯There is no getter for property named ‘bikeQrCode’ in 'class java.lang.String

報錯的原因是:

​當參數列中只有一個引數的時候,mybatis中儲存的是{_parameter=811010009,databaseId=null},在if判斷中取值的時候,bikeQrCode對應的匹配不到值就會報錯

解決辦法1:在if中使用_parameter進行比較,如果我們傳入的是其他基本型別也都可以使用這種方法,在傳入的是實體類的時候,可以通過其屬性名直接比較,我試了也可以通過 _parameter.屬性名來比較

<if test="_parameter != null">

解決辦法2:在傳遞引數的時候使用@Param進行描述,mybatis會儲存為 bikeQrCode: 811010009 鍵值對的形式,比較時可以直接通過鍵來找到他的值

如果我們在#{}中使用引數
情況1、如果是一個引數的情況下(這個引數型別可以被mybatis中的typeHandler處理),在xml中可以隨意使用屬性名

例:

select * from t_scm_bike_bind where id = #{abc}

情況2、使用多個引數會被封裝為一個map

BikeBind getBikeBindByBikeOrCodeAndId(int id,String BikeOrCode);

在map中就會被封裝為

key: param1 … paramN或者是引數的索引,索引從0開始

value:傳入的值

我們在xml中直接使用id或BikeOrCode取值是取不到的,可通過{0}進行取值

情況3、使用@Param描述引數的時候,map中的key就是@Param中的值,可以通過@Param的值來取

相關文章