前面一篇帖子介绍了mapper.xml文件的几个重要的的标签,详见:https://blog.youkuaiyun.com/wrongyao/article/details/84630792
这边帖子主要介绍,动态sql
动态sql主要包括以下几个标签
-
if 条件标签
-
choose (when oterwise) 可以实现if else 选择
-
where
-
trim
-
foreach 遍历集合
1、if标签
基础语法:test是条件表达式
<if test=""></if>
and相当于java的&&,or相当于java的||
用处:
where条件使用,改造之前的根据sysUser查询数据,注意加上1=1,或者当userName和password都不存在时会报错。
<select id="selectByUserNameAndPassword" resultMap="sysUser">
SELECT
*
FROM
sys_user
WHERE
1=1
<if test="userName != null">
AND user_name = ${userName}
</if>
<if test="password">
AND password = ${password}
</if>
</select>
update标签中使用,改造前面的例子,实现一个update可以更新所有字段,注意set的最后加上id=#{id}这样可以保证所有字段都不存在的时候,也不会报错。
<update id="update">
UPDATE sys_user
set
<if test="email != null">
email = #{email},
</if>
<if test="userName != null">
user_name = #{userName},
</if>
sys_user_id = #{sysUserId}
WHERE
sys_user_id = #{sysUserId}
</update>
2、choose,when,otherwirse实现if elseif else逻辑
<choose >
<when test= "sys_user_id != null" >
and id= #{id}
</when >
<when test= "userName ! = null">
and user name = #{userName}
</when>
<otherwise>
and 1 = 2
</otherwise>
</choose >
3、where标签
之前用if标签的时候,加了一个where 1=1 确保没有条件满足的时候不会报错,其实还有一种实现方式就是去除where关键字,where标签可以实现,它的作用是如果where标签里面的值不为空,则加上where关键字,并去除第一个and或or
<select id="selectByUserNameAndPassword" resultMap="sysUser">
SELECT
*
FROM
sys_user
<where>
<if test="userName != null">
AND user_name = #{userName}
</if>
<if test="password">
AND password = #{password}
</if>
</where>
</select>
4、trim标签 trim为修整的意思,这边就是修正sql的意思
<trim prefix="" prefixOverrides="" suffix="" suffixOverrides=""></trim>
prefix:<trim>标签值不为空时,拼接sql的前缀;
prefixOverrides:<trim>标签值不为空时,拼接sql需要去除的第一个前缀字段,多个选择可用 | 连接;
suffix和suffixOverrides:同理suffix和suffixOverrides表示<trim>标签值不为空时,拼接sql的后缀和拼接sql需要去除的最后一个后缀字段,多个选择可用 | 连接;
这个标签可以实现<where>标签的功能,如下
<trim prefix="where" prefixOverrides="AND|OR">
<if test="userName != null">
AND user_name = #{userName}
</if>
<if test="password">
AND password = #{password}
</if>
</trim>
表示如果userName和password有一个不为空,加上where关键字,覆盖第一个AND和OR关键字
后缀在in条件时候拼接的时多使用
5、foreach遍历集合
遍历list集合(set一样),下为实现批量插入。
<insert id="insertSysUsers">
INSERT INTO sys_user(
<include refid="sysUserSql"/>
) VALUES
<foreach collection="sysUsers" item="sysUser" separator=",">
(
null,
#{sysUser.userName},
#{sysUser.password},
#{sysUser.email},
#{sysUser.createTime},
#{sysUser.headImg}
)
</foreach>
</insert>
<include refid=""> 引入sql片段
<sql id="sysUserSql">
sys_user_id,
user_name,
PASSWORD,
email,
create_time,
head_img
</sql>
遍历map,实现map多条件查询
<select id="selectByConditions" resultMap="sysUser">
SELECT
*
FROM
sys_user
WHERE
1 = 1
<foreach collection="conditions" index="key" item="value">
AND ${key} = #{value}
</foreach>
</select>
注意mapper接口传入集合的时候需要使用@params注解,否则,xml中取不到值,会报错
public List<SysUser> selectByConditions(@Param("conditions") Map<String, Object> conditions);
public int insertSysUsers(@Param("sysUsers") List<SysUser> sysUsers);
本文深入解析MyBatis框架中的动态SQL技术,包括if、choose、where、trim及foreach等标签的使用方法,通过实例展示如何根据条件动态构建SQL语句,提高数据库操作的灵活性。

被折叠的 条评论
为什么被折叠?



