Mybatis 使用<if test/>实现选择插入

来源:互联网 发布:传奇网页游戏源码 编辑:程序博客网 时间:2024/06/16 13:35

最近遇到需要需要根据 areaId的范围进行插入,在使用中使用when test实现数据范围选择,之前在test中使用 大于号 > 是没有问题的,例如

<when test="praise > 0">

于是根据编程的想法,就写了这个

<if test="praise > 0 and praise <100">

结果编译出错,说Mybatis不支持小于号,也还是挺蒙啊,为什么大于支持,小于就不支持了。。
当然查到了解决问题的办法
1.用

<select id="getGroupUserList" parameterType="int" resultType="int">...<when test="praise > 100000 and praise &lt; 1000000">...

我加入了select的头,是因为后面继续的报错,报错是Integer中不能找到praise的getter
报错的意思很明确,要按照int对应的Integer类查找praise属性,这显然是没有的。继续查。
还是两种解决方法,
1.DAO接口中适用注解@Param(value=”praise”) int num
2.将参数名(上面的例子为‘praise’)替换为”_parameter”

看到这里我就很晕了,使用注解在没有if的判断时不会报错,例如,并且不去注解参数

<select id="selectUserInfo" resultType="string" parameterType="int">        SELECT nickname FROM user_info WHERE userid=#{userId}    </select>

但是加上判断就会将参数理解为parameterType类型中的成员变量。网上说问题原因是Mybatis默认采用ONGL解析参数,所以会自动采用对象树的形式获取传入的变量值。
于是判断在没有if时mybatis不会强制采用对象树去获取,而在使用if之后将会采用。
查看官网文档
动态 SQL 元素和使用 JSTL 或其他类似基于 XML 的文本处理器相似。在 MyBatis 之前的版本中,有很多的元素需要来了解。MyBatis 3 大大提升了它们,现在用不到原先一半的元素就可以了。MyBatis 采用功能强大的基于 OGNL 的表达式来消除其他元素。

也就是对于动态sql我们必须制定参数的来源,要么使用注解,要是使用_parameter符号。
简单的解释先到这里,后续看来有必要看看源码啊。。

2 0
原创粉丝点击