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的全类名"

Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐