mybatis通过parameterType传基本类型在if标签test中报错

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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值