MyBatis-----7、MyBatis动态SQL

本文详细介绍了Mybatis框架中动态SQL的if、where、trim、choose、when、otherwise、foreach和sql标签的使用,演示了如何解决多条件查询的灵活性问题,包括标签的条件控制和循环操作,适用于前端、后端开发者理解和实践。
摘要由CSDN通过智能技术生成

mybatis框架的动态sql技术是一种根据特定条件动态拼装sql语句的功能,存在的意义是为了解决拼接sql语句字符串时的痛点问题。动态sql本质上是映射文件中的一系列标签。
<font size= color=>

if 标签:多条件查询方式1

接口方法

	/*
    * 多条件查询
    * */
    List<Emp> getEmpByConditions(Emp emp);

映射文件

    <!--List<Emp> getEmpByConditions(Emp emp);-->
    <select id="getEmpByConditions" resultType="Emp">
        select * from t_emp where 1=1
        <if test="empName != null and empName != ''">
            and emp_name = #{empName}
        </if>
        <if test="age != null and age !=''">
            and age = #{age}
        </if>
        <if test="sex != null and sex !=''">
            and sex = #{sex}
        </if>
        <if test="email != null and email !=''">
            and email = #{email}
        </if>
    </select>

select * from t_emp where 1=1,该语句中的1=1为恒成立条件,通过恒成立条件可以更好的拼接后续的其余条件(如果后续条件都不成立就不会多出where关键字,或者后续只有某些条件成立不会多出and关键字)且不影响最终的查询结果

where标签:多条件查询方式2

where标签中有内容时,会自动生成where关键字,并且将内容前多余的and和or去掉;如果where标签中的内容都都不符合条件(where标签中没有内容),则不生成where关键字(where标签没有任何效果)。注意:where标签不能将其中内容后面多余的and和or去掉。

<select id="getEmpByConditions" resultType="Emp">
        select * from t_emp
        <where>
            <if test="empName != null and empName != ''">
                and emp_name = #{empName}
            </if>
            <if test="age != null and age !=''">
                and age = #{age}
            </if>
            <if test="sex != null and sex !=''">
                and sex = #{sex}
            </if>
            <if test="email != null and email !=''">
                and email = #{email}
            </if>
        </where>
    </select>

trim标签:多条件查询方式3

trim 标签中有四个属性prefix、suffix、 suffixOverrides、 prefixOverrides

  • prefix | suffix:将trim标签中内容前面或后面添加指定内容
  • suffixOverrides | prefixOverrides:将trim标签中内容前面或后面去掉指定内容

若标签中有内容时:根据标签中是属性设置在前面或后面进行添加或删除指定内容 ;若标签中没有内容时,trim标签也没有任何效果(和where一样)

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

choose、when、otherwise标签

choose、when、otherwise标签相当于java中的if…else if…else效果
choose是一个父标签,when标签和otherwise标签需要写在choose标签中

<!--List<Emp> getEmpByChoose(Emp emp);-->
    <select id="getEmpByChoose" resultType="Emp">
        select * from t_emp
        <where>
            <choose>
                <when test="empName != null and empName != ''">
                    emp_name = #{empName}
                </when>
                <when test="age != null and age != ''">
                    age = #{age}
                </when>
                <when test="sex != null and sex != ''">
                    sex = #{sex}
                </when>
                <when test="email != null and email != ''">
                    email = #{email}
                </when>
                <otherwise>
                    did = 1
                </otherwise>
            </choose>
        </where>
    </select>

when标签至少要有一个,otherwise标签最多只能有一个;choose 标签按顺序判断其内部 when 标签中的判断条件是否成立,如果有一个成立,则执行相应的 SQL 语句,choose 执行结束;如果都不成立,则执行 otherwise 中的 SQL 语句

foreach标签

foreach是用来进行循环的,例如,批量删除与批量添加操作从浏览器端所获取的是一个集合,因此要通过对数组进行循环来实现功能。
foreach 标签主要有以下属性,说明如下(以使用IN关键字为例)。
collection:设置需要循环的数组或集合
item:表示集合中每一个元素进行迭代时的别名。
index:指定一个名字,表示在迭代过程中每次迭代到的位置。
open:表示该语句以什么开始(既然是 in 条件语句,所以必然以‘(’开始)。
separator:表示在每次进行迭代之间以什么符号作为分隔符(既然是 in 条件语句,所以必然以,作为分隔符)。
close:表示该语句以什么结束(既然是 in 条件语句,所以必然以‘)’结束)。

使用foreach标签进行批量删除:两种方式分别对应关键字IN和OR:

 <!--int deleteMoreByArray(@Param("eids") Integer[] eids);-->
    <!--foreach 标签主要有以下属性,说明如下。
        item:表示集合中每一个元素进行迭代时的别名。
        index:指定一个名字,表示在迭代过程中每次迭代到的位置。
        open:表示该语句以什么开始(既然是 in 条件语句,所以必然以(开始)。
        separator:表示在每次进行迭代之间以什么符号作为分隔符(既然是 in 条件语句,所以必然以,作为分隔符)。
        close:表示该语句以什么结束(既然是 in 条件语句,所以必然以)开始)。
     -->
    <!--批量删除方式1-->
    <delete id="deleteMoreByArray">
        delete from t_emp where eid in
            <foreach collection="eids" item="eid" separator="," open="(" close=")">
                #{eid}
            </foreach>

    </delete>
    <!--批量删除方式2 int deleteMoreByArrayTwo(@Param("eids") Integer[] eids);-->
    <delete id="deleteMoreByArrayTwo">
        delete from t_emp where
        <foreach collection="eids" item="eid" separator="or">
            eid = #{eid}
        </foreach>
    </delete>

使用foreach进行批量添加:

    <!--int insertMoreByList(@Param("emps") List<Emp> emps);-->
    <insert id="insertMoreByList">
        insert into t_emp values
        <foreach collection="emps" item="emp" separator=",">
            (null,#{emp.empName},#{emp.age},#{emp.sex},#{emp.email},null)
        </foreach>
    </insert>

sql标签

在这里插入图片描述
使用sql标签可以定义sql片段,通过include标签引用sql片段,include标签中的refid属性对应应用sql片段的id

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值