zoukankan      html  css  js  c++  java
  • Mybatis的动态 SQL

    11、动态 SQL

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

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

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

    搭建环境

    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. 编写实体类

      @Data
      public class Blog {
          private int id;
          private String title;
          private String author;
          private Date createTime;
          private int views;
          
          
      }
      
    4. 编写实体类对应Mapper接口 和 Mapper.XML文件

    IF

    与学的jstl相类似

    where 1 =1 用于拼接动态Sql 简化判断

    这里如果if判断成立 则将条件拼接到sql后

    <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>
    

    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>
    

    trim (where,set)

    where 元素只会在子元素返回任何内容的情况下才插入 “WHERE” 子句。而且,若子句的开头为 “AND” 或 “OR”,where 元素也会将它们去除。 其实就是让我们的sql不容易出错

    select * from mybatis.blog
    <where>
        <if test="title != null">
            title = #{title}
        </if>
        <if test="author != null">
            and author = #{author}
        </if>
    </where>
    

    set 元素会动态地在行首插入 SET 关键字,并会删掉额外的逗号

    <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>
    
    

    所谓的动态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>
      
    2. 在需要使用的地方使用Include标签引用即可

      <select id="queryBlogIF" parameterType="map" resultType="blog">
          select * from mybatis.blog
          <where>
              <include refid="if-title-author"></include>
          </where>
      </select>
      

    注意事项:

    • 最好基于单表来定义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)
    
    

    <!--
            select * from mybatis.blog where 1=1 and (id=1 or id = 2 or id=3)
    
            我们现在传递一个万能的map , 这map中可以存在一个集合!
    -->
    <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>
    
    

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

    建议:

    • 现在Mysql中写出完整的SQL,再对应的去修改成为我们的动态SQL实现通用即可!
  • 相关阅读:
    springboot(七):springboot+mybatis多数据源最简解决方案
    springboot(六):如何优雅的使用mybatis
    springboot(五):spring data jpa的使用
    springboot(四):thymeleaf使用详解
    springboot(三):Spring boot中Redis的使用
    springboot(二):web综合开发
    springboot(一):入门篇
    常用十六进制颜色对照表代码查询
    burpsuit之Repeater、Sequencer、Decoder、Comparer模块
    burpsuit之Spider、Scanner、Intruder模块
  • 原文地址:https://www.cnblogs.com/yhnCoder/p/13626143.html
Copyright © 2011-2022 走看看