在公司做测试的时候遇到了一个关于@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的值来取