MyBatis--动态SQL

动态SQL

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

if

public interface DynamicSQLMapper {

    List<Emp> getEmpByCondition(Emp emp);
}

<mapper namespace="com.bijing.mybatis.mapper.DynamicSQLMapper">

    <!--
        动态SQL:
        1.if,通过test属性中的表达式判断标签中内容是否有效,(是否会拼接到SQL中)
    -->
    <!--    List<Emp> getEmpByCondition();-->
    <select id="getEmpByCondition" resultType="Emp">
        SELECT *
        FROM t_emp
        WHERE
        <!--       当下面条件都不成立会多了个where-->
        <if test="empName!=null and empName!=''">
            emp_name = #{empName}
        </if>
        <!--        当第一个标签不成立时第二个标签中多了个and-->
        <if test="age!=null and age!=''">
            and age =#{age}
        </if>
        <if test="gender != null and gender !=''">
            and gender = #{gender}
        </if>
    </select>
</mapper>   

where

    <select id="getEmpByCondition" resultType="Emp">
        SELECT *
        FROM t_emp
        <where>
            <!--            2.where标签-->
            <!--            a.若where标签中有条件成立会自动生成where关键字-->
            <!--            b.会自动将where标签中内容 前 多余的and去掉,但是内容后如果有and不能去掉(所以and不加在后面不就ok了吗?)-->
            <!--            c.若where标签中没有任何一个条件成立,则where没有任何功能-->
            <if test="empName!=null and empName!=''">
                emp_name = #{empName}
                <!--                emp_name = #{empName} and -->
            </if>
            <!--            当第一个和第三个条件不成立又会多了个and-->
            <if test="age!=null and age!=''">
                and age =#{age}
                <!--                 age =#{age} and -->
            </if>
            <if test="gender != null and gender !=''">
                and gender = #{gender}
                <!--                 gender = #{gender} and -->
            </if>
        </where>

    </select>

trim

  • prefix,suffix:在标签中内容前或者后面添加指定内容
  • prefixOverrides, suffixOverrides:在标签中内容前或者后面去掉指定内容
    <select id="getEmpByCondition" resultType="Emp">
        SELECT *
        FROM t_emp
        <trim prefix="where" suffixOverrides="and">
            <if test="empName!=null and empName!=''">
                <!--                emp_name = #{empName}-->
                emp_name = #{empName} and
            </if>
            <!--            当第一个和第三个条件不成立又会多了个and-->
            <if test="age!=null and age!=''">
                <!--                and age =#{age}-->
                age =#{age} and
            </if>
            <if test="gender != null and gender !=''">
                <!--                and gender = #{gender}-->
                gender = #{gender} and
            </if>
        </trim>

    </select>

choose、when、otherwise

  • 相当于java中的if…else if…else
  • when至少设置一个,otherwise最多设置一个,相当于else
    <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="gender !=null and gender!=''">
                    gender = ${gender}
                </when>
            </choose>
        </where>

    </select>

foreach

  • collection:设置要循环的数组或集合
  • item:用一个字符串表示数组或集合中的每一个数据
  • separator:设置每次循环的数据之间的分隔符
  • open:循环的所有内容以什么开始
  • close:循环的所有内容以什么结束
    <!--    void insertMoreEmp(@Param("emps") List<Emp> emps);-->
    <insert id="insertMoreEmp">
        INSERT INTO t_emp
        VALUES
        <foreach collection="emps" item="emp" separator=",">
            (null,#{emp.empName},#{emp.age},#{emp.gender},null)
        </foreach>
    </insert>

    <!--    void deleteMoreEmp(@Param("empIds") Integer[] empIds);-->
    <delete id="deleteMoreEmp">
        <!--        DELETE-->
        <!--        FROM t_emp-->
        <!--        WHERE emp_id IN-->
        <!--        &#45;&#45; open以什么开始,close以什么结束,此时括号是在foreach外面的,括号在里面不能用-->
        <!--        <foreach collection="empIds" item="empId" separator="," open="(" close=")">-->
        <!--            #{empId}-->
        <!--        </foreach>-->

        DELETE FROM t_emp WHERE
        <foreach collection="empIds" item="empId" separator="or">
            emp_id = #{empId}
        </foreach>
    </delete>

SQL片段

可以记录一段sql,在需要用的地方用include标签进行引用

            <sql id="empColumns">
                emp_id,emp_name,age,gender,dept_id
            </sql>
            
             <select id="getEmpByCondition" resultType="Emp">
        SELECT
        <include refid="empColumns"></include>
        FROM t_emp
        <trim prefix="where" suffixOverrides="and">
            <if test="empName!=null and empName!=''">
                <!--                emp_name = #{empName}-->
                emp_name = #{empName} and
            </if>
            <!--            当第一个和第三个条件不成立又会多了个and-->
            <if test="age!=null and age!=''">
                <!--                and age =#{age}-->
                age =#{age} and
            </if>
            <if test="gender != null and gender !=''">
                <!--                and gender = #{gender}-->
                gender = #{gender} and
            </if>
        </trim>

    </select>
            
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值