一、MyBatis常用标签
常用标签:<if>、<where>、<trim>、<foreach>
1、<if> 标签
作用:where 语句的条件动态拼接
<!--使用 if 元素根据条件动态查询用户信息-->
<select id="selectUser" resultType="com.domain.UserInfo" parameterType="com.domain.UserInfo">
select * from user_info where 1=1
<if test="uname!=null and uname!=''">
and uname like concat('%',#{uname},'%')
</if >
<if test="usex !=null and usex !=''">
and usex=#{usex}
</if >
</select>
注:
(1) where后面1=1,是为了解决当两个条件都不为true时,sql语句不合法导致报错的问题,也可以通过下面的where标签解决。
2、<where> 标签
作用:输出 where 语句,可以智能的过滤掉条件中多出来的 and 或者or。若条件都不满足,则会查出所有记录。
<!--使用where元素根据条件动态查询用户信息-->
<select id="selectUser" resultType="com.domain.UserInfo" parameterType="com.domain.MyInfo">
select * from user_info
<where>
<if test="uname != null and uname ! = ''">
and uname like concat('%',#{uname},'%')
</if>
<if test="usex != null and usex != '' ">
and usex=#{usex}
</if >
</where>
</select>
3、<trim> 标签
作用:用于添加 SQL 语句的前缀或者后缀
所以可利用 <trim> 来代替 <where> 的功能
<!--使用trim元素根据条件动态查询用户信息-->
<select id="selectUser" resultType="com.domain.UserInfo"parameterType="com.domain.UserInfo">
select * from user_info
<trim prefix="where" prefixOverrides = "and | or">
<if test="uname!=null and uname!=''">
and uname like concat('%',#{uname},'%')
</if>
<if test="usex!=null and usex!=''">
and usex=#{usex}
</if>
</trim>
</select>
注:
prefix:指定sql语句拼接的前缀
subfix:指定sql语句拼接的后缀
prefixOverrides:指定sql语句前面要去除的关键字或字符,如AND 逗号 括号等
suffixOverrides:指定sql语句后面要去除的关键字或字符
4、<foreach> 标签
作用:用于在 SQL 语句中迭代一个集合,可用在构建 in 条件中
<!--使用foreach元素查询用户信息-->
<select id="selectUserByForeach" resultType="com.domain.UserInfo" parameterType=
"List">
select * from user_info where uid in
<foreach item="item" index="index" collection="list"
open="(" separator="," close=")">
# {item}
</foreach>
</select>
<foreach> 元素的属性包括:
item:表示集合中每一个元素进行迭代时的别名
index:表示标识指定一个名字,用于表示在迭代过程中每次迭代到的位置
open:表示该语句以什么开始
separator:表示在每次进行迭代之间以什么符号作为分隔符
close:表示以什么结束
二、MyBatis标签使用场景示例
1、List 批量插入数据操作
<!--使用List批量插入多条记录-->
<insert id="insertByList" parameterType="java.util.List">
INSERT INTO user_info
(name,sex,address,status,create_time)
VALUES
<foreach collection="userInfoList" item="item" index="index" separator=",">
(
#{item.name},
#{item.sex},
#{item.address},
#{item.status},
#{item.createTime}
)
</foreach>
</insert>
2、使用List批量更新数据操作
Sql释义:根据 id 值的不同,设置对应的状态值和创建时间
<!--使用List批量更新多条记录-->
<update id="updateByList" parameterType="java.util.List">
<if test="userInfoList!=null">
UPDATE user_info
<trim prefix="set" suffixOverrides=",">
<trim prefix="status = case" suffix="end,">
<foreach collection="userInfoList" item="item" index="index">
<if test="item.status != null and item.status != ''">
WHEN id=#{item.id} THEN #{item.status}
</if>
</foreach>
</trim>
<trim prefix="create_time = case" suffix="end,">
<foreach collection="userInfoList" item="item" index="index">
<if test="item.createTime != null">
WHEN id=#{item.id} THEN #{item.createTime}
</if>
</foreach>
</trim>
</trim>
<where>
id IN
<foreach collection="userInfoList" item="item" index="index" separator="," open="(" close=")">
<if test="item.id != null and item.id != ''">
#{item.id}
</if>
</foreach>
</where>
</if>
</update>
注:时间类型判断为空时,只使用<if test="item.createTime != null">
网友评论