mybatis0040-动态sql

本文深入解析MyBatis框架中的动态SQL技术,包括if、choose、where、trim及foreach等标签的使用方法,通过实例展示如何根据条件动态构建SQL语句,提高数据库操作的灵活性。

前面一篇帖子介绍了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);

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值