MyBatis框架中的动态SQL:if、where、trim、foreach等标签的用法详解(含代码)

发布时间:2024年01月25日

目录

if标签

where标签

trim标签

choose、when、otherwise

foreach标签


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

sql表字段如下:

if标签

用于不确定根据哪几个字段查询的情况下,则可判断如果有此字段的值则拼接,否则跳过。

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

最后执行的sql语句:

select * from emp where 1=1 and name like concat('%',?,'%') and gender = ? and ...

<!--List<Emp> getEmpListByCondition(Emp emp); //接口EmpMapper中定义的方法-->
<select id="getEmpListByCondition" resultType="com.softeem.bean.Emp">
        select * from emp where 1=1
        <if test="name != '' and name != null">
            and name like concat('%',#{name},'%')
        </if>
        <!--不能跟''空字符串进行比较,因为时间是Date类型-->
        <if test="joinDate != null">
            <!--日期不能用`${}`字符串拼接,只能使用?占位符。-->
            and join_date = #{joinDate}
        </if>
        <!--if是类中属性在判断-->
        <if test="gender != '' and gender != null">
            and gender = #{gender}
        </if>
        <if test="salary > 0 and salary != null">
            and salary = #{salary}
        </if>
    </select>

where标签

跟单独使用if标签的区别就是加了where标签,可以不用在sql语句中写where 1=1,where标签中的if语句满足会自动在sql语句中加入where关键字

where和if一般结合使用:

a>若where标签中的if条件都不满足,则where标签没有任何功能,即不会添加where关键字

b>若where标签中的if条件满足,则where标签会自动添加where关键字,并将条件最前方多余的

and去掉

注意:where标签不能去掉条件最后多余的and

<!-- List<Emp> getEmpListByConditionWhere(Emp emp); //接口EmpMapper中定义的方法 -->
<select id="getEmpListByConditionWhere" resultType="com.softeem.bean.Emp">
    select * from emp
    <where>
        <if test="name != '' and name != null">
            and name like concat('%',#{name},'%')
        </if>
        <!--不能跟''空字符串进行比较,因为时间是Date类型-->
        <if test="joinDate != null">
            <!--日期不能用`${}`字符串拼接,只能使用?占位符。-->
            and join_date = #{joinDate}
        </if>
        <!--if是类中属性在判断-->
        <if test="gender != '' and gender != null">
            and gender = #{gender}
        </if>
        <if test="salary > 0 and salary != null">
            and salary = #{salary}
        </if>
    </where>

</select>

trim标签

trim用于去掉或添加标签中的内容常用属性:

prefix:在trim标签中的内容的前面添加某些内容

prefixOverrides:在trim标签中的内容的前面去掉某些内容

suffix:在trim标签中的内容的后面添加某些内容

suffixOverrides:在trim标签中的内容的后面去掉某些内容

比如,条件查询需要where关键字,那么就可以在trim标签中添加prefix="where"

<!-- List<Emp> getEmpListByMoreTrim(Emp emp); -->
<select id="getEmpListByMoreTrim" resultType="com.softeem.bean.Emp">
    select * from emp
  <!-- 在trim标签中的内容前加上where,后面删除and-->
    <trim prefix="where" suffixOverrides="and">
        <if test="name != '' and name != null">
            and name like concat('%',#{name},'%')
        </if>
        <if test="gender != '' and gender != null">
            and gender = #{gender}
        </if>
    </trim>
</select>

choose、when、otherwise

choose、when、otherwise相当于if...else if..else

只会拼接一个<when>标签内的内容

<!-- List<Emp> getEmpListByChoose(Emp emp); -->
<select id="getEmpListByChoose" resultType="com.softeem.bean.Emp">
    select * from emp
    <where>
        <choose>
            <when test="name != '' and name != null">
                name like concat('%',#{name},'%')
            </when>
            <when test="gender != '' and gender != null">
                gender = #{gender}
            </when>
        </choose>
    </where>
</select>

foreach标签

foreach 标签通常用于对集合进行迭代,生成动态的SQL语句。

collection 属性指定要迭代的集合

item 属性指定在迭代过程中每个元素的别名

index 属性指定在迭代过程中的索引值

open 属性指定在迭代开始时插入的字符串

separator 属性指定在每个元素之间插入的字符串

close 属性指定在迭代结束时插入的字符串。

示例如下:

sql:insert into emp values (null, ?, ?, ?, ?, ?)

<!-- int insertMoreEmp(@Param("emps") List<Emp> emps); -->
<!--    foreach 生成插入语句-->
<insert id="insertMoreEmp">
    insert into emp values
    <foreach collection="emps" item="emp" separator=",">
    <!--这边是属性!不是表中字段-->
        (null,#{emp.name},#{emp.gender},#{emp.salary},#{emp.joinDate},#{emp.deptId})
    </foreach>
</insert>

sql:delete from emp where ? or ? or?

<!-- int deleteMoreByArray(@Param("eids") int[] eids); -->
<!--    删除 delete from emp where ? or ? or? -->
<delete id="deleteMoreByArray">
    delete from emp where
    <foreach collection="eids" item="eid" separator="or">
     id = #{eid}
    </foreach>
</delete>

sql:delete from emp where id in (?,?,?,...)

<!-- int deleteMoreByArray2(@Param("eids") int[] eids); -->
<!--   delete from emp where id in (?,?,?,...) -->
<delete id="deleteMoreByArray2">
    delete from emp where id in
    <foreach collection="eis" item="eid" open="(" separator="," close=")">
        #{eid}
    </foreach>
</delete>
文章来源:https://blog.csdn.net/m0_66111719/article/details/135745482
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。