这篇文章主要介绍“Mybatis中where标签与if标签怎么结合使用”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“Mybatis中where标签与if标签怎么结合使用”文章能帮助大家解决问题。
使用<where>标签
select筛选出视图对象的参数,用于给前端返回页面参数使用。
<sql id="selectFileVo">
select file_id,
uuid,
file_name,
file_url,
status,
create_time,
update_time
from file
</sql>
以下代码格式是正确,我们先观察下
或者
and
的位置。
or
<select id="selectFileList" parameterType="File" resultMap="FileResult">
<include refid="selectFileVo"/>
<where>
<if test="fileName != null and fileName != ''">
and file_name like concat('%', #{fileName}, '%')
</if>
<if test="status != null and status != ''">
and status = #{status}
</if>
<if test="params.beginCreateTime != null and params.beginCreateTime != '' and params.endCreateTime != null and params.endCreateTime != ''">
and create_time between #{params.beginCreateTime} and #{params.endCreateTime}
</if>
</where>
</select>
再看一下错误的写法;
<select id="selectFileList" parameterType="File" resultMap="FileResult">
<include refid="selectFileVo"/>
<where>
<if test="fileName != null and fileName != ''">
file_name like concat('%', #{fileName}, '%') and
</if>
<if test="status != null and status != ''">
status = #{status} and
</if>
<if test="params.beginCreateTime != null and params.beginCreateTime != '' and params.endCreateTime != null and params.endCreateTime != ''">
create_time between #{params.beginCreateTime} and #{params.endCreateTime}
</if>
</where>
</select>
这时候运行该代码,当
或
beginCreateTime
为空时,我们会发现报错SQL执行异常,原因是where多了一个
endCreateTime
。
and
总结
当
标签判断失败后,
<if>
标签关键字可以自动去除掉库表字段赋值前面的
<where>
,不会去掉语句后面的
and
关键字,即
and
标签只会去掉
<where>
标签语句中的最开始的
<if>
关键字。所以上面的写法(
and
写在后面)是不符合mybatis规范的。
and
不使用<where>标签
当不使用
标签时,正确的写法可以参考以下代码:
<where>
<select id="selectFileList" parameterType="File" resultMap="FileResult">
<include refid="selectFileVo"/>
where 1=1
<if test="fileName != null and fileName != ''">
and file_name like concat('%', #{fileName}, '%')
</if>
<if test="status != null and status != ''">
and status = #{status}
</if>
<if test="params.beginCreateTime != null and params.beginCreateTime != '' and params.endCreateTime != null and params.endCreateTime != ''">
and create_time between #{params.beginCreateTime} and #{params.endCreateTime}
</if>
</select>
此时我们发现
是写在前面的,同时增加了
and
条件。
1=1
如果我们去掉
条件,同时去掉第一个
1=1
标签的
<if>
。
and
<select id="selectFileList" parameterType="File" resultMap="FileResult">
<include refid="selectFileVo"/>
where
<if test="fileName != null and fileName != ''">
file_name like concat('%', #{fileName}, '%')
</if>
<if test="status != null and status != ''">
and status = #{status}
</if>
<if test="params.beginCreateTime != null and params.beginCreateTime != '' and params.endCreateTime != null and params.endCreateTime != ''">
and create_time between #{params.beginCreateTime} and #{params.endCreateTime}
</if>
</select>
这种情况下,当
为空时,sql语句中会出现
fileName
这种错误的语法,最终导致sql执行异常。所以正确的代码中,使用
where and
条件,当
1=1
为空时,sql语句就会变成
fileName
,后面接不接
where 1=1
都能正确执行。
and
在不使用
标签的情况下,
<where>
写在后面,在
and
条件最后增加
where
判断,原理和上面一样,这里就不再赘述了。
1=1
以上就是Mybatis中where标签与if标签怎么结合使用的详细内容,更多关于Mybatis中where标签与if标签怎么结合使用的资料请关注九品源码其它相关文章!