• 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不生效

  • 相关阅读:
    Go复合类型之数组类型
    分库分表实战之从根上带你吃透MySQL的索引
    FreeRTOS个人笔记-FreeRTOSConfig.h
    Vue的devtools安装教程
    【附源码】计算机毕业设计SSM甜心驿站饮品信息管理
    常见开发、测试模型
    【HTTP】GET 和 POST 的区别
    数据源、映射器的复用
    粉丝推荐的 GitHub 项目 yyds
    猿创征文|【FreeSwitch开发实践】使用sipp对FreeSwitch进行压力测试
  • 原文地址:https://blog.csdn.net/weixin_45172902/article/details/125418751