MyBatis-动态sql常见使用

发布于:2024-04-26 ⋅ 阅读:(15) ⋅ 点赞:(0)

Mybatis框架的动态SQL技术是一种根据特定条件动态拼装SQL语句的功能,它存在的意义是为了解决
拼接SQL语句字符串时的痛点问题。

1. if

if标签可通过test属性的表达式进行判断:若表达式的结果为true,则标签中的内容会执行;反之标签中的内容不会执行

<select id="getEmpListByMoreTJ" resultType="Emp">
  select * from t_emp where 1=1
  <if test="ename != '' and ename != null">
  	and ename = #{ename}
  </if>
  <if test="age != '' and age != null">
  	and age = #{age}
  </if>
  <if test="sex != '' and sex != null">
  	and sex = #{sex}
  </if>
</select>

2. where

where和if一般结合使用:

  • 若where标签中的if条件都不满足,则where标签没有任何功能,即不会添加where关键字
  • 若where标签中的if条件满足,则where标签会自动添加where关键字,并将条件最前方多余的
    and去掉
  • 注意:where标签不能去掉条件最后面多余的and
<select id="getEmpListByMoreTJ2" resultType="Emp">
  select * from t_emp
  <where>
    <if test="ename != '' and ename != null">
    	ename = #{ename}
    </if>
    <if test="age != '' and age != null">
    	and age = #{age}
    </if>
    <if test="sex != '' and sex != null">
    	and sex = #{sex}
    </if>
  </where>
</select>

3. choose、when、otherwise

choose、when、otherwise相当于switch () 、case: 、default;只会选中一个

<select id="getEmpListByChoose" resultType="Emp">
  select <include refid="empColumns"></include> from t_emp
  <where>
    <choose>
      <when test="ename != '' and ename != null">
      	ename = #{ename}
      </when>
      <when test="age != '' and age != null">
      	age = #{age}
      </when>
      <when test="sex != '' and sex != null">
      	sex = #{sex}
      </when>
      <when test="email != '' and email != null">
      	email = #{email}
      </when>
    </choose>
  </where>
</select>

4. foreach

foreach 标签用于遍历集合或数组,并在 SQL 语句中动态生成对应的参数。

以下是 foreach 标签的基本用法:

  • 批量插入

方法:int insertMoreEmp(List emps)

sql:

<insert id="insertMoreEmp">
  insert into t_emp values
  <foreach collection="emps" item="emp" separator=",">
  	(null,#{emp.ename},#{emp.age},#{emp.sex},#{emp.email},null)
  </foreach>
</insert>
  • 批量删除1

方法:int deleteMoreByArray(int[] eids);

sql:

<delete id="deleteMoreByArray">
  delete from t_emp where
  <foreach collection="eids" item="eid" separator="or">
  	eid = #{eid}
  </foreach>
</delete>
  • 批量删除2

方法:int deleteMoreByArray(int[] eids);

sql:

<delete id="deleteMoreByArray">
  delete from t_emp where eid in
  <foreach collection="eids" item="eid" separator="," open="(" close=")">
  	#{eid}
  </foreach>
</delete>
  • 批量查询

方法:int selectUsersByIds(int[] ids);

sql:

<select id="selectUsersByIds" resultType="User">
    SELECT * FROM user
    WHERE id IN
    <foreach collection="ids" item="id" open="(" separator="," close=")">
        #{id}
    </foreach>
</select>

参数解析:

属性:
collection:设置要循环的数组或集合
item:表示集合或数组中的每一个数据
separator:设置循环体之间的分隔符
open:设置foreach标签中的内容的开始符
close:设置foreach标签中的内容的结束符

5. trim

trim用于去掉或添加标签中的内容

如:

<select id="getEmpListByMoreTJ" resultType="Emp">
  select * from t_emp
  <trim prefix="where" suffixOverrides="and|or">
    <if test="ename != '' and ename != null">
    	ename = #{ename} and
    </if>
    <if test="age != '' and age != null">
    	age = #{age} and
    </if>
    <if test="sex != '' and sex != null">
    	sex = #{sex}
    </if>
  </trim>
</select>

参数解析:

常用属性:
prefix:在trim标签中的内容的前面添加某些内容
prefixOverrides:在trim标签中的内容的前面去掉某些内容
suffix:在trim标签中的内容的后面添加某些内容
suffixOverrides:在trim标签中的内容的后面去掉某些内容


网站公告

今日签到

点亮在社区的每一天
去签到