• mybatis4:动态sql


    一.动态sql

    1.整体框架

    在这里插入图片描述

    2.动态sql解决问题

    • 例子:
      出现一个选项框,选择里面的条件来进行sql查询结果的过滤,我们需要动态调整sql语句
    • 帮助拼接sql
    • 出现问题:判断接受的数据是什么?
      可能是null:即最开始并未获取到数据参数
      可能是空字符串:即提交但是并未选择任何条件
    • 由服务器判断是否来拼接条件到where后

    3.具体语句

    ①if标签

    • test属性可以判断是否成立从而是否加入文本内容到sql语句
    • 细节注意:
      where后需要增加1=1 否则可能出现where后没有值的情况
      test为true的内容需要增加and 否则出现无连接符的情况
    
    <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>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    ②where标签

    • where帮助解决if中的难题(where标签内添加if)
    • where特性:
      如果where里面的条件都不成立,则也不会有where
      如果where里的条件有成立,则会添加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>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    ③trim标签

    • 对where标签的出现和and标签出现的控制
    • 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>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    ④choose、when、otherwise解决选择单个条件

    • 即choose内部只会有一个条件被添加则where后面(满足则跳出)
    
    <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>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20

    ⑤foreach标签(用于批量添加和批量删除)

    • collections属性 可以是数组或列表
      注意:此时最好加入@param 否则数组和列表都会放入map中,不清楚其键名为什么
    • item属性 为得到的数组或列表中的元素
    • separater:分割符以什么分开
    • 注意区分总体括号还是单条数据括号
    
    <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>
    
    <delete id="deleteMoreByArray">
    delete from t_emp where
    <foreach collection="eids" item="eid" separator="or">
    eid = #{eid}
    foreach>
    delete>
    
    <delete id="deleteMoreByArray">
    delete from t_emp where eid in
    <foreach collection="eids" item="eid" separator="," open="(" close=")">
    #{eid}
    foreach>
    delete>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21

    ⑥sql片段(解决某些字段用次数过多)

    <sql id="empColumns">
    eid,ename,age,sex,did
    sql>
    select <include refid="empColumns">include> from t_emp
    
    • 1
    • 2
    • 3
    • 4
  • 相关阅读:
    css动画效果网站集合
    《数字化与碳中和(园区篇)》报告正式发布,助力加快推进国家“双碳”战略实施
    多线程(线程互斥)
    帮管客CRM(jiliyu)接口SQL注入漏洞
    这就叫速度,并发编程深度解析实战七天杀上 GitHub 榜首
    制作一个简单HTML个人网页网页(HTML+CSS)大话西游之大圣娶亲电影网页设计
    荷兰国旗问题与快速排序算法
    流量卡套餐解析:网上申请的短期套餐到底是多久呢?
    记一次事故看 Redis 开发规范
    秋招还没Offer怎么办?
  • 原文地址:https://blog.csdn.net/qq_44724899/article/details/127665473