动态SQL是MyBatis中一个强大的特性。 在JDBC代码中根据不同的条件拼写SQL语句是一件痛苦的事情,而且还容易出错。借助功能强大的基于 OGNL 的表达式,MyBatis的动态SQL在可以让你清晰高效地构建你的SQL语句,提升幸福感。 MyBatis3的标签主要有以下几种: 一起来看看怎么使用吧! 这俩是我们最常用的标签语句,where语句根据条件来判断是否要包含if标签下的内容 这里如果用户传了非空的name值,就可以根据age和name两个条件来查询,不传的话默认就只根据age = 12这个条件来查询,如果还需要其他的条件语句,在下面继续添加即可 如果where语句中没有age = 12这个默认条件,而且用户也没有传name和age条件,最终生成的SQL语句会像这样 这显然不符合SQL语法规范,会报错的 如果传了name,SQL又会变成下面这样 依然会报错 其实我们只要使用where标签语句就可以解决以上问题,SQL修改后如下 where标签语句会判断是否有if子语句满足条件,如果都不满足条件,整个where语句都会被移除 如果传入了name,where标签会判断语句的开头是否为“AND”或者“OR”,如果是会自动去除 如果传入的对象参数中没有指定的字段,而你又在if语句中使用了该字段 传入的User实体中根本没有nickname字段,这时会报以下错误 choose语句可以实现类似我们Java中switch语句的功能,按顺序对when子句进行条件匹配,满足条件就会使用该when标签下的语句 这时会有以下几种情况: 注意:choose标签语句也要放在where标签下,否则也会出现跟上面if语句一样的问题 set标签主要用来实现动态更新功能的 trim标签下有四个属性 实现类似where标签的功能 实现类似set标签的功能 foreach标签的作用就对集合进行遍历,经常被用来构建IN条件语句 比如我们传入一个字符串集合nameList,然后查询name在这个集合中user数据 这样拼接后的语句如下 foreach标签还有两个属性,index(表示当前迭代的序号)和nullable(表示集合是否可以为空) bind标签常用来创建一个变量,可以在上下文中使用 这里注意bind的value属性中,没有使用#{name}来获取name属性的值,而是直接用name来获取属性值。 本文介绍了MyBatis常用标签的使用方法和注意事项,希望可以帮到你,有问题可以在评论区交流下,欢迎点赞收藏关注。if where
select * from user
where age = 12
<if test="name != null">
and name = #{name}
</if>
select * from user
where age = 12
<if test="name != null">
and name = #{name}
</if>
<if test="age != null">
and age = #{age}
</if>
使用where标签对SQL进行智能预处理
select * from user
where
select * from user
where and name = 'pname'
select * from user
<where>
<if test="name != null">
and name = #{name}
</if>
<if test="age != null">
and age = #{age}
</if>
</where>
select * from user
select * from user
where name = 'pname'
常见问题
select * from user
<where>
<if test="nickname != null">
and name = #{nickname}
</if>
</where>
choose when otherwise
select * from user
<where>
<choose>
<when test="name != null">
and name = #{name}
</when>
<when test="age != null">
and age = #{age}
</when>
<otherwise>
and sex = 'male'
</otherwise>
</choose>
</where>
trim set
update user
<set>
<if test="name != null">name = #{name},</if>
<if test="age != null">age = #{age},</if>
</set>
where id = #{id}
trim标签的作用
如何使用trim
select * from user
<trim prefix="where" prefixOverrides="AND |OR ">
<if test="name != null">
and name = #{name}
</if>
<if test="age != null">
and age = #{age}
</if>
</trim>
<update id="updateByPrimaryKeySelective">
update user
<trim prefix="set" suffixOverrides=",">
<if test="name != null">name = #{name},</if>
<if test="age != null">age = #{age},</if>
</trim>
where id = #{id}
</update>
foreach
select * from user
<where>
<if test="nameList != null">
and name in
<foreach collection="nameList" open="(" separator="," close=")" item="name">
#{name}
</foreach>
</if>
</where>
select * from user WHERE name in ( ? , ? )
其他
select * from user
<where>
<if test="name != null">
<bind name="nameLike" value="'%' + name + '%'"/>
and name like #{nameLike}
</if>
</where>