• 13.Mybatis之动态sql查询(面试)


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

    1if

    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>

    2where

    where if 般结合使用:
    a> where 标签中的 if 条件都不满足,则 where 标签没有任何功能,即不会添加 where 关键字
    b> 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>

    3trim

    trim 用于去掉或添加标签中的内容
    常用属性:
    prefix :在 trim 标签中的内容的前面添加某些内容
    prefixOverrides :在 trim 标签中的内容的前面去掉某些内容
    suffix :在 trim 标签中的内容的后面添加某些内容
    suffixOverrides :在 trim 标签中的内容的后面去掉某些内容
    <select id="getEmpListByMoreTJ" resultType="Emp">
    select * from t_emp
        <trim prefix="where" suffixOverrides="and">
            <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>

    4choosewhenotherwise

    choose when otherwise 相当于 if...else if..else
    <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>

    5foreach

    属性:
    collection :设置要循环的数组或集合
    item :表示集合或数组中的每 个数据
    separator :设置循环体之间的分隔符
    open :设置 foreach 标签中的内容的开始符
    close :设置 foreach 标签中的内容的结束符
    <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> <!--int deleteMoreByArray(int[] eids);-->
    <delete id="deleteMoreByArray">delete from t_emp where
        <foreach collection="eids" item="eid" separator="or">eid = #{eid}</foreach>
    </delete> <!--int deleteMoreByArray(int[] eids);-->
    <delete id="deleteMoreByArray">delete from t_emp where eid in <foreach collection="eids" item="eid" separator=","
                                                                           open="(" close=")">#{eid}
    </foreach>
    </delete>

    6SQL片段

    sql 片段,可以记录一 段公共 sql 片段,在使用的地方通过 include 标签进行引入
    <sql id="empColumns"> eid
    ,ename,age,sex,did </sql>
    select <include refid="empColumns"></include> from t_emp
    7.注意事项:
    如果用set插入 注意每隔字段之间添加逗号

    int 类型判断的时候 判断是否为0  Integer 判断的时候判断是否为null 否则动态Sql不生效

  • 相关阅读:
    Spring(ioc)
    为什么说C++太复杂(复杂到哪了?)
    python基础知识总结集合
    ASP.net数据从Controller传递到视图
    TikTok本周动态,TikTok Shop新加坡首场大促将于本月举行
    第六章《类的高级特性》第5节:接口
    项目管理必备工具推荐:提高效率、协作与跟踪的实用工具盘点
    【TA 工具积累】参考图展示 PureRef | 截图 Snipaste
    typescript21-接口和类型别名的对比
    【每日思考】---成事的正确思维方式
  • 原文地址:https://blog.csdn.net/weixin_45172902/article/details/125418751