• 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
  • 相关阅读:
    Springboot毕业设计毕设作品,心理评测系统 开题报告
    ☆打卡算法☆LeetCode 29、两数相除 算法解析
    【生活】浅浅记录
    Permissions for ‘xxx.pem‘ are too open
    RasberryPi 3B+ 树莓派 初识
    获取Git提交信息,发版是需要Git的tag或者commitId
    【牛客讨论区】第四章:Redis
    国庆加速度!新增功能点锁定功能,敏捷开发新增估算功能,助力项目快速突破!
    升级requests的方法
    Linux上编译sqlite3库出现undefined reference to `sqlite3_column_table_name‘
  • 原文地址:https://blog.csdn.net/qq_44724899/article/details/127665473