系列文章目录
提示:这里可以添加系列文章的所有文章的目录,目录需要自己手动添加
MyBatis之动态Sql
提示:写完文章后,目录可以自动生成,如何生成可参考右边的帮助文档
文章目录
前言
提示:这里可以添加本文要记录的大概内容:
动态SQL是MyBatis的强大功能特性之一,能够完成不同条件下的sql拼接。简单来说,动态SQL是指随着用户的输入或外部条件的变化而变化的SQL语句。
在接下来的博客中,我们将介绍MyBatis中用于生成动态SQL的标签,包括、、、和等。通过这些标签,我们可以根据不同的条件和输入来动态地构建和执行SQL语句,以满足各种数据操作需求。
在每个标签的介绍中,我们将提供示例和解释,以便您能够更好地理解和应用动态SQL。希望这个博客能够帮助您更好地掌握MyBatis的动态SQL特性,并在实际项目中实现更灵活和高效的数据访问。
提示:以下是本篇文章正文内容,下面案例可供参考
一、动态sql
if标签
标签是MyBatis中常用的动态SQL标签之一,通常用来判断条件是否成立,从而确定是否将相关的SQL语句加入到查询中。其基本语法格式如下:
xml
<if test="判断条件">
要执行的sql语句
</if>
其中,test属性用于指定判断条件,当条件成立时,则执行相关的sql语句。例如,以下代码可以判断uname和sex是否为空,并根据判断结果动态地生成查询语句:
xml
<select id="selectUsersIf" parameterType="user" resultType="user">
select * from users where 1=1
<if test="uname!=null and uname!=''">
and uname like "%"#{uname}"%"
</if>
<if test="sex!=null and sex!=''">
and sex = #{sex}
</if>
</select>
在上述代码中,当uname和sex不为空时,会将包含它们的查询条件加入到sql语句中。你可以根据实际情况设置不同的判断条件,以实现更灵活的查询操作。
在使用<if>
标签时,需要注意的问题
- test属性必填,该属性值是一个符合OGNL要求的判断表达式,一般只用true或false作为结果。
- 判断条件property!= null或property == null,适用于任何类型的字段,用于判断属性值是否为空。
- 判断条件property!= ''或property == '',仅适用于String类型的字段,用于判断是否为空字符串。
- if中的条件不能使用&&/||,而应该使用and/or
- if中的条件可以直接通过属性名获取参数POJO的属性值,并且该值可以调用方法。
- where后为什么要加1=1?任意条件都可能拼接到Sql中。如果有多个条件,从第二个条件开始前都需要加And关键字。加上1=1这个永久成立的条件,就不需要考虑后面的条件哪个是第一个条件,后面的条件前都加And关键字即可。
where标签
可以代替sql中的where 1=1 和第一个and,更符合程序员的开发习惯
xml
<select id="findByCondition" resultType="com.zhangsan.user.User" parameterType="com.itbaizhan.user.User">
select * from user
<where>
<if test="username != null and username.length() != 0">
username like #{username}
</if>
<if test="sex != null and sex.length() != 0">
and sex = #{sex}
</if>
</where>
</select>
set标签
标签用在update语句中。借助,可以只对有具体值的字段进行更新。会自动添加set关键字,并去掉最后一个if语句中多余的逗号。
xml
<update id="update" parameterType="com.zhangsan.user.User">
update user
<set>
<if test="username != null and username.length() > 0">
username = #{username},
</if>
<if test="sex != null and sex.length() > 0">
sex = #{sex},
</if>
</set>
<where>
id = #{id}
</where>
</update>
choose,when,otherwise标签
这些标签表示多条件分支,类似JAVA中的switch...case。类似switch,类似case,类似default,用法如下:
xml
<select id="findByCondition" resultType="com.zhangsan.user.User" parameterType="com.itbaizhan.user.User">
select * from user
<where>
<choose>
<when test="username.length() < 5">
username like #{username}
</when>
<when test="username.length() < 10">
username = #{username}
</when>
<otherwise>
id = 1
</otherwise>
</choose>
</where>
</select>
这段代码的含义为:用户名<5时使用模糊查询,用户名>=5并且<10时使用精确查询,否则查询id为1的用户。
foreach标签
MyBatis之动态Sql的foreach标签通常用于循环遍历一个集合,在SQL语句中构建in条件语句或者批量操作语句。其主要属性有item、index、collection、open、separator和close。
item表示集合中每一个元素进行迭代时的别名;index指定一个名字,用于表示在迭代过程中,每次迭代到的位置;collection指向集合对象;open表示该语句以什么开始;separator表示在每次进行迭代之间以什么符号作为分隔符;close表示以什么结束。
你可以将任何可迭代对象,如List、Set、Map或者数组作为集合参数传递给foreach。当使用Map对象(或者Map.Entry对象的集合)时,index是键,item是值。在其他情况下,index是当前迭代的序号,item是本次遍历的对象。以下是示例:
- foreach遍历数组
xml
<delete id="deleteBatch" parameterType="int">
delete from user
<where>
<foreach open="id in(" close=")" separator="," collection="array" item="id" >
#{id}
</foreach>
</where>
</delete>
- 遍历Collection
xml
<insert id="insertBatch" parameterType="com.zhangsan.user.User">
insert into user values
<foreach collection="list" item="user" separator=",">
(null ,#{user.username},#{user.birthday},#{user.sex},#{user.address})
</foreach>
</insert>
- 遍历Map
xml
<select id="findUser" parameterType="map" resultType="com.zhangsan.pojo.User">
select * from user
<where>
<foreach collection="queryMap" separator="and" index="key" item="value">
${key} = #{value}
</foreach>
</where>
</select>
总结
提示:这里对文章进行总结:
在使用MyBatis的动态SQL时,需要注意OGNL表达式的语法和语义,以及不同元素的正确使用方法和适用场景。同时,还需要合理地组织和管理动态SQL语句,以提高代码的可读性和可维护性。