MyBatis动态SQL
在项目的开发中,编码人员经常需要根据不同的条件拼接SQL语句。在组拼SQL语句的过程中除了实现核心功能以外还需要处处小心,时时警惕确保不遗漏必要的标点符号、空格以及关键字。
动态SQL常用标签如下:
<if/>
<where/>
<choose/>、<when/>、<otherwise/>
<set/>
<trim/>
<bind/>
<foreach/>
<sql/>
<include/>
if查询案例代码
<select id="queryUserWithIf" resultType="User"> select * from user where 1=1 <if test="username !=null and username !='' "> and username=#{username} </if> <if test="password !=null and password !='' "> and password=#{password} </if> </select>
where查询案例代码
<select id="queryUserWithWhere" resultType="User"> select * from user <where> <if test="username !=null and username !=''"> and username=#{username} </if> <if test="password !=null and password !=''"> and password=#{password} </if> </where> </select>
<choose/>、<when/>、<otherwise/>案例代码
<select id="queryUserWithChoose" resultType="User"> select * from user <where> <choose> <when test="username !=null and username !=''"> and username=#{username} </when> <when test="password !=null and password !=''"> and password=#{password} </when> <otherwise> and username like concat('%','lu','%') </otherwise> </choose> </where> </select>
<set>案例代码
<update id="updateUserWithSet" parameterType="User"> update user <set> <if test="username !=null and username !=''"> username=#{username}, </if> <if test="password !=null and password !=''"> password=#{password}, </if> <if test="gender !=null and gender !=''"> gender=#{gender} </if> </set> where id=#{id} </update>
<trim/>
<trim/>标签常用于用于在SQL语句前后添加或删除一些内容。<trim/>标签常用属性及其作用如表5-1所示。
表5-1 <trim/>标签属性
属性 |
释义 |
prefix |
在SQL语句前添加内容 |
prefixOverrides |
删除SQL语句前多余的关键字或字符 |
suffix |
在SQL语句后添加内容 |
suffixOverrides |
删除SQL语句后多余的关键字或字符 |
<trim>案例代码
<update id="updateUserWithTrim" parameterType="User"> update user <trim prefix="set" suffixOverrides="and"> username=#{username} and </trim> where id=#{id} </update>
在映射文件中依据用户id进行更新操作。在更新语句中利用<trim/>标签的prefix属性在username前添加set关键字并利用<trim/>标签的suffixOverrides属性去掉and关键字。假如不使用<trim/>标签那么拼接后的SQL语句为update user username=#{username} and where id=#{id} 很明显,这条SQL语句是错误的。
<foreach/>
<foreach/>标签用于在SQL语句中遍历List、数组、Map等集合。除此以外,该标签常用于SQL中的in查询。
<foreach/>标签常见属性及其作用如表5-2所示。
表5-2 < foreach />标签属性
属性 |
释义 |
collection |
待遍历的集合 |
item |
集合中被遍历的当前对象 |
index |
当集合为List和数组时index是对象的索引。 当集合是Map时index是Map的键。 |
open |
表示开始符号,其常用值为"(" |
separator |
表示各元素之间的分隔符,其常用值为"," |
close |
表示结束符号,其常用值为")" |
<foreach>案例代码
<!-- 测试foreach遍历List --> <select id="queryUserWithForeach1" resultType="User"> select * from user where id in <foreach collection="userIDList" open="(" separator="," close=")" item="userID"> #{userID} </foreach> </select> <!-- 测试foreach遍历数组 --> <select id="queryUserWithForeach2" resultType="User"> select * from user where id in <foreach collection="userIDArray" index="i" item="userID" open="(" separator="," close=")" > #{userID} </foreach> </select> <!-- 测试foreach与Map的使用 --> <select id="queryUserWithForeach3" resultType="User"> select * from user where gender = #{userMap.gender} and id in <foreach collection="userMap.userIDList" item="userID" index="key" open="(" separator="," close=")" > #{userID} </foreach> </select>
<sql/>
<sql/>标签用于定义可重用的SQL片段,该标签常用属性为id作为SQL片段的唯一标识。
<include/>
<include/>标签常与<sql/>标签配合使用,即使用<include/>引用已经定义的SQL片段。<include/>标签的属性refid表示引用的<sql/>标签的id值。
<sql>、<include>案例代码
<!-- 测试动态SQL语句include --> <select id="queryUserWithInclude" resultType="User"> select <include refid="columns"/> from user <where> <if test="username !=null and username !=''"> and username=#{username} </if> <if test="password !=null and password !=''"> and password=#{password} </if> </where> </select>
标签:username,password,标签,user,SQL,MyBatis,动态,id From: https://www.cnblogs.com/shangeg/p/17743961.html