转载地址:http://www.itsoku.com/course/4/81
参考资料
1.MyBatis<foreach>
标签的几种循环方法
⭕1.IF标签
当test成立的时候,if体内部的sql会被拼接上。
<select id="getList1" resultType="com.XXX.UserModel" parameterType="map">
SELECT id,name,age FROM t_user
WHERE 1 = 1
<if test="id != null">
AND id = #{id}
</if>
<if test="name!=null and name.toString() != '' ">
AND name = #{name}
</if>
<if test="age != null">
AND age = #{age}
</if>
</select>
⭕2.choose/when/otherwise标签
相当于java中的
if..else if..else
传入id、name、age作为条件,按顺序进行判断,如果id不为空,将id作为条件,忽略其他条件,如果id为空,会判断name是否为空,name不为空将name作为条件,如果name为空,再看看age是否为空,如果age不为空,将age作为条件。
<select id="getList2" resultType="com.XXX.UserModel" parameterType="map">
SELECT id,name,age FROM t_user
WHERE 1 = 1
<choose>
<when test="id != null">
AND id = #{id}
</when>
<when test="name != null and name.toString() != '' ">
AND name = #{name}
</when>
<when test="age != null">
AND age = #{age}
</when>
</choose>
</select>
⭕3.set标签
如果我们不使用set标签的话,得到的SQL会变得多了个
,号
,SQL报错
UPDATE t_user SET name = ?, age = ?, where id = ?
<update id="update1" parameterType="com.XXX.UserModel">
UPDATE t_user
<set>
<if test="name != null">
name = #{name},
</if>
<if test="age != null">
age = #{age},
</if>
</set>
<!--使用where标签是为了避免WHERE 1 = 1这种写法 -->
<where>
<if test="id != null">
AND id = #{id}
</if>
</where>
</update>
⭕4.trim标签
语法
<trim prefix="" prefixOverrides="" suffix="" suffixOverrides="">
</trim>
trim元素内部可以包含各种动态sql
,如where、chose、sql等各种元素,使用trim包含的元素,mybatis处理过程:
- 先对trim
内部的sql进行拼接
,比如这部分sql叫做sql1 - 将sql1字符串前面的部分中包含trim的
prefixOverrides
指定的部分给去掉,得到sql2 - 将sql2字符串后面的部分中包含trim的
suffixOverrides
指定的部分给去掉,得到sql3 - 在sql3前面追加trim中
prefix
指定的值,得到sql4 - 在sql4后面追加trim中
suffix
指定的值,得到最终需要拼接的sql5
<select id="getList1" resultType="com.XXX.UserModel" parameterType="map">
SELECT id,name,age FROM t_user
<!--多个需要覆盖的之间用|进行分割,suffixOverrides写法和prefixOverrides的写法类似-->
<trim prefix="where" prefixOverrides="and|or">
<if test="id != null">
AND id = #{id}
</if>
<if test="name != null and name.toString() != '' ">
AND name = #{name}
</if>
<if test="age != null">
AND age = #{age}
</if>
</trim>
</select>
<update id="update1" parameterType="com.XXX.UserModel">
UPDATE t_user
<trim prefix="SET" prefixOverrides="," suffixOverrides=",">
<if test="name != null">
name = #{name},
</if>
<if test="age != null">
age = #{age},
</if>
</trim>
<where>
<if test="id != null">
AND id = #{id}
</if>
</where>
</update>
⭕5.foreach标签
语法
<foreach collection="需要遍历的集合" item="集合中当前元素" index="" open="" separator="每次遍历的分隔符" close="">
动态sql部分
</foreach>
- collection:可以是一个List、Set、Map或者数组
- item:集合中的当前元素的引用
- index:用来访问当前元素在集合中的位置
- separator:各个元素之间的分隔符
- open和close用来配置最后用什么前缀和后缀将foreach内部所有拼接的sql给包装起来。
⏹in多值查询
<select id="getList1" resultType="com.XXX.UserModel" parameterType="map">
SELECT id,name,age FROM t_user
<where>
<if test="id != null">
AND id = #{id}
</if>
<if test="name != null and name.toString() != '' ">
AND name = #{name}
</if>
<if test="age != null">
AND age = #{age}
</if>
<if test="idList != null and idList.size() >= 1">
<foreach collection="idList" item="id" open="AND id in (" separator="," close=")">
#{id}
</foreach>
</if>
</where>
</select>
⏹批量插入
<insert id="insertBatch" parameterType="list">
INSERT INTO t_user (id,name,age) VALUES
<foreach collection="collection" separator="," item="item">
(#{item.id}, #{item.name}, #{item.age})
</foreach>
</insert>
⭕6.sql和include标签
这两2个标签一般进行配合使用,可以实现代码重用的效果
⏹sql元素可以用来定义一段动态sql
<sql id="sql片段id">
各种动态sql
</sql>
⏹其他地方需要使用的时候需要通过include关键字进行引入
<include refid="需要引入的sql片段的id"/>
使用案例
<sql id="findSql">
<where>
<if test="id != null">
AND id = #{id}
</if>
<if test="name != null and name.toString() != ''">
AND name = #{name}
</if>
<if test="age != null">
AND age = #{age}
</if>
<if test="idList != null and idList.size() >= 1">
<foreach collection="idList" item="id" open="AND id in (" separator="," close=")">
#{id}
</foreach>
</if>
</where>
</sql>
<select id="getList1" resultType="com.XXX.UserModel" parameterType="map">
SELECT id,name,age FROM t_user
<include refid="findSql" />
</select>
<select id="getList1Count" resultType="com.XXX.UserModel" parameterType="map">
SELECT count(*) FROM t_user
<include refid="findSql" />
</select>