mybatis有几种传值方式,其中一种是这样:
mapper接口中的方法如下:
public interface TestMapper extends MyMapper<Test> {
void testMethod(Integer type);
}
mapper的xml中通过parameterType来获取type参数:
<select id="testMethod" parameterType="integer" resultType="com.xx.Test">
SELECT * from test_table WHERE type = #{type}
<if test="type == 1">
AND status=2
</if>
</select>
这个xml配置就会引起报错,报错内容就是Integer类没有type字段的getter方法,原因就是if标签中的test="type == 1" 这个判断引起的,(where后面的 type=#{type} 这个是可以取到值的)
怎么解决?有三种方式
第一种方式是把if标签中的type改成_parameter 即可,如下:
<if test="_paramter == 1">
AND status=2
</if>
因为在java8之前,反射是无法获取方法的参数名的(可以看一下这篇文章末尾反射获取一个方法中的参数名(不是类型) - 光闪 - 博客园),
即mybatis根本都不知道参数名称叫type, where后面的#{type}只是做了一个特殊处理,不管你是#{type}也好,还是#{abc}也好,都把值赋给它, 但是test里面的字段就不是这么处理的,就是硬性的通过parameterType=“integer” 中指定的这个类型调用对应的get方法获取值的,所以就报错了。
第二种方式是更换接口中传值的方式:
接口中使用@Param("type") 传值,如下:
void testMethod(@Param("type") Integer type);
第三种就是不传integer类型,把type参数放到map里面,或者搞一个java bean 把type传过去
//1,把type放到map中传过去
void testMethod(Map<String,Integer> map);
或者
//2,把type放到自定义bean中传过去
void testMethod(KeyValueBean bean);
class KeyValueBean {
private Integer type;
//生成set和get
}
如果传的是Map类型,xml中的parameterType="map"(mybatis参数类型和java类型的映射可以看五、深入理解Mybatis中的参数parameterType (传递一个简单参数,传递多个参数:@Param、使用自定义对象、按位置、使用Map)_小小白学计算机的博客-CSDN博客_parametertype)
如果传的是自定义bean ,xml中的parameterType="自定义bean的全类名"