• Mybatis--动态SQL



    作者:进击攻城狮
    个人主页:欢迎访问我的主页
    首发时间:2022年8月27日星期六
    订阅专栏:Mybatis
    个人信条:星光不问赶路人,岁月不负有心人。
    注:只当做笔记回顾,如果文章有错误,欢迎在评论区指正。
    🎉 支持我:点赞👍+收藏⭐️+留言📝



    1、动态 SQL

    什么是动态SQL:动态SQL就是指根据不同的条件生成不同的SQL语句

    利用动态 SQL 这一特性可以彻底摆脱这种痛苦。

    动态 SQL 元素和 JSTL 或基于类似 XML 的文本处理器相似。在 MyBatis 之前的版本中,有很多元素需要花时间了解。MyBatis 3 大大精简了元素种类,现在只需学习原来一半的元素便可。MyBatis 采用功能强大的基于 OGNL 的表达式来淘汰其它大部分元素。
    
    if
    choose (when, otherwise)
    trim (where, set)
    foreach
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    搭建环境

    CREATE TABLE `blog` (
      `id` varchar(50) NOT NULL COMMENT '博客id',
      `title` varchar(100) NOT NULL COMMENT '博客标题',
      `author` varchar(30) NOT NULL COMMENT '博客作者',
      `create_time` datetime NOT NULL COMMENT '创建时间',
      `views` int(30) NOT NULL COMMENT '浏览量'
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    创建一个基础工程

    1. 导包

    2. 编写配置文件

    3. 编写实体类

      @Data
      public class Blog {
          private int id;
          private String title;
          private String author;
          private Date createTime;
          private int views;
          
          
      }
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      • 10
    4. 编写实体类对应Mapper接口 和 Mapper.XML文件

    IF

    <select id="queryBlogIF" parameterType="map" resultType="blog">
        select * from mybatis.blog where 1=1
        <if test="title != null">
            and title = #{title}
        if>
        <if test="author != null">
            and author = #{author}
        if>
    select>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    choose (when, otherwise)

        <select id="queryBlogChoose" parameterType="map" resultType="blog">
            select * from mybatis.blog
            <where>
                <choose>
                    <when test="title != null">
                        title = #{title}
                    when>
                    <when test="author != null">
                        and author = #{author}
                    when>
                    <otherwise>
                        and views = #{views}
                    otherwise>
                choose>
            where>
        select>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    trim (where,set)

    select * from mybatis.blog
    <where>
        <if test="title != null">
            title = #{title}
        if>
        <if test="author != null">
            and author = #{author}
        if>
    where>
    <update id="updateBlog" parameterType="map">
        update mybatis.blog
        <set>
            <if test="title != null">
                title = #{title},
            if>
            <if test="author != null">
                author = #{author}
            if>
        set>
        where id = #{id}
    update>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21

    所谓的动态SQL,本质还是SQL语句 , 只是我们可以在SQL层面,去执行一个逻辑代码

    if

    where , set , choose ,when

    SQL片段

    有的时候,我们可能会将一些功能的部分抽取出来,方便复用!

    1. 使用SQL标签抽取公共的部分

      <sql id="if-title-author">
          <if test="title != null">
              title = #{title}
          if>
          <if test="author != null">
              and author = #{author}
          if>
      sql>
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
    2. 在需要使用的地方使用Include标签引用即可

      <select id="queryBlogIF" parameterType="map" resultType="blog">
          select * from mybatis.blog
          <where>
              <include refid="if-title-author">include>
          where>
      select>
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6

    注意事项:

    • 最好基于单表来定义SQL片段!
    • 不要存在where标签

    Foreach

    select * from user where 1=1 and 
    
      <foreach item="id" collection="ids"
          open="(" separator="or" close=")">
            #{id}
      </foreach>
    
    (id=1 or id=2 or id=3)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    1569979229205

    1569979339190

    
    <select id="queryBlogForeach" parameterType="map" resultType="blog">
        select * from mybatis.blog
    
        <where>
            <foreach collection="ids" item="id" open="and (" close=")" separator="or">
                id = #{id}
            foreach>
        where>
    
    select>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    动态SQL就是在拼接SQL语句,我们只要保证SQL的正确性,按照SQL的格式,去排列组合就可以了

    建议:

    • 现在Mysql中写出完整的SQL,再对应的去修改成为我们的动态SQL实现通用即可!
  • 相关阅读:
    一个重量级HTTP api的304优化分析与突发失效问题解决
    ChatGLM3-6B-32K 在linux(Ubuntu) GPU P100(16G)复现记录
    em,rem,px,rpx的区别与使用
    申请全国400电话的步骤及注意事项
    状态机动态规划之股票问题总结
    基于循环神经网络空中目标意图识别实现(附源码)
    GC 算法与种类
    Redbook Chapter 7: Query Optimization翻译批注
    R语言layout () 函数
    Git分支合并别的分支代码
  • 原文地址:https://blog.csdn.net/yi_chen_c/article/details/126560132