Mybatis入门——动态Sql (三)

本文详细介绍了MyBatis框架中常用的动态SQL标签,包括if(条件判断)、where(添加查询条件)、foreach(处理IN条件)、set(更新操作简化)和trim(添加前后缀)的用法和示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目录

动态Sql概述

MyBatis常用动态Sql标签

if标签

where标签

foreach标签

set标签

trim标签


动态Sql概述

     Mybatis框架主要通过标签的配合使用实现SQL语句的动态拼接、前后缀格式化处理 、复杂参数处理等功能。

实现动态SQL的主要元素主要有:

  •   if
  •   where
  •   choose
  •   foreach
  •   set
  •   trim

MyBatis常用动态Sql标签

    常用标签

  •   if
  •   where
  •   choose
  •   foreach
  •   set
  •   trim

if标签

       if 标签通常用于 WHERE 语句、UPDATE 语句、INSERT 语句中,通过判断参数值来决定是否使用某个查询条件、判断是否更新某一个字段、判断是否插入某个字段的值。if可以和很多的标签一起使用!

Mapper接口

/**
* 根据id和realName查询
* @param id
* @param realName
* @return
*/
List<SysUser> selectByIdAndRealName(@Param("id") int id,@Param("realName") String realName);

Mapper.xml

<select id="selectByIdAndRealName" resultType="SysUser">
    SELECT * FROM t_sysuser 
    <if test="id != null"> /*如果传入进来的id不等于空*/
        where id=#{id}
    </if>
    <if test="realName != null">
        and realName like concat('%',#{realName},'%')
    </if>
</select>

test

private SqlSession sqlSession=MyBatisUtil.createSqlSession(); //Mybatis帮助类

    @Test
    public void selectByIdAndRealName() {
        List<SysUser> userList = sqlSession.getMapper(SysUserMapper.class).selectByIdAndRealName(2, "张");
        System.out.println(userList.toString());
    }

where标签

以上面的示例为例。当我们不传入id (id为空),realName给张。那么,这时的sql语句就有问题少了where,所以,接下来就需要用到我们的where标签。

注:只需要修改我们的mapper.xml文件就行了。它会自动帮我们加上where标签,智能处理and、or等关键字  (第一个if的and不能加上)

<select id="selectByIdAndRealName" resultType="SysUser">
    SELECT * FROM t_sysuser
    <where>
        <if test="id != null"> /*如果传入进来的id不等于空*/
            id=#{id}
        </if>
        <if test="realName != null">
            and realName like concat('%',#{realName},'%')
        </if>
    </where>
</select>

foreach标签

       oreach 标签主要用于构建 in 条件,只要看见in就要马上想到foreach。可在 sql 中对集合进行迭代。也常用到批量删除、添加等操作中。

/**
* 查询在指定地址里面的用户
* @param addressList
* @return
*/
List<SysUser> selectByAddress(@Param("addressList") List<String> addressList);
<select id="selectByAddress" resultType="SysUser">
    SELECT * FROM t_sysuser
    where address in
    <foreach collection="addressList" item="address" open="(" separator="," close=")">
        #{address}
    </foreach>
</select>
private SqlSession sqlSession=MyBatisUtil.createSqlSession(); //Mybatis帮助类

    @Test
    public void selectByAddress() {
        List<String> addressList=new ArrayList<>();
        addressList.add("北京市海淀区学院路61号");
        addressList.add("北京市海淀区西二旗辉煌国际16层");
        List<SysUser> userList = sqlSession.getMapper(SysUserMapper.class).selectByAddress(addressList);
        System.out.println(userList.toString());
        sqlSession.close();
    }

set标签

   更新用户表数据时,除重新赋值的属性外,其他属性的值都更新为null,简化SQL语句中set子句处理,智能忽略更新语句尾部多出来的逗号。

/**
* 修改用户信息
* @param sysUser
* @return
*/
int  updateById(SysUser sysUser);
<update id="updateById" parameterType="SysUser">
    update t_sysuser
    <set>
        <if test="account !=null">
            account=#{account},
        </if>
        <if test="realName !=null">
            realName=#{realName},
        </if>
        <if test="sex !=null">
            sex=#{sex}
        </if>
    </set>
    where id=#{id}
</update>

trim标签

  添加前后缀,智能忽略标签前后多余的and、or或逗号等字符

语法:

<trim  prefix = "前缀"  suffix = "后缀"  prefixOverrides = "忽略前缀"  suffixOverrides = "忽略后缀" >   

   …

</trim>

<update id="updateById" parameterType="SysUser">
    update t_sysuser
    <trim prefix="set" suffix="where id=#{id}" suffixOverrides=",">
        <if test="account !=null">
            account=#{account},
        </if>
        <if test="realName !=null">
            realName=#{realName},
        </if>
        <if test="sex !=null">
            sex=#{sex}
        </if>
    </trim>
</update>

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值