• 动态SQL


    什么是动态SQL:

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

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

    动态 SQL 元素可能会感觉似曾相识。在 MyBatis 之前的版本中,需要花时间了解大量的元素。借助功能强大的基于 OGNL 的表达式,MyBatis 3 替换了之前的大部分元素,大大精简了元素种类,现在要学习的元素种类比原来的一半还要少。

    • if
    • choose (when, otherwise)
    • trim (where, set)
    • foreach

    动态SQL:

    数据库:

    public class Blog {
        private int id;
        private String title;
        private String author;
        private Date createTime;  // 属性名和数据库不一致 设置 <setting name="mapUnderscoreToCamelCase" value="true"/>
        private int views;
    }

    编写Mapper接口与MapperXML:

    if

    <select id="getBlogIf" parameterType="map" resultType="Blog">
        select * from blog where 1=1
        <if test="title != null">
            and title = #{title}
        </if>
        <if test="author != null">
            and author = #{author}
        </if>
    </select>

    这条语句提供了可选的查找文本功能。如果不传入 “title”,那么所有数据都会返回

    choose(when、otherwise)

    <select id="getBlogChoose" parameterType="map" resultType="Blog">
        select * from 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>

    传入了 “title” 就按 “title” 查找,传入了 “author” 就按 “author” 查找的情形。若两者都没有传入,就返回标记为 featured 的 BLOG

    trim(where、set)

    where

    <select id="getBlogChoose" parameterType="map" resultType="Blog">
        select * from blog
        <where>
            <if test="title != null">
                and title = #{title}
            </if>
            <if test="author != null">
                and author = #{author}
            </if>
        </where>
    </select>

    where 元素只会在子元素返回任何内容的情况下才插入 “WHERE” 子句。而且,若子句的开头为 “AND” 或 “OR”,where 元素也会将它们去除。

    set

    <update id="updateBlog" parameterType="map">
        update blog
            <set>
                <if test="id != null">id=#{id},</if>
                <if test="title != null">title=#{title},</if>
                <if test="author != null">author=#{author},</if>
                <if test="views != null">views=#{views},</if>
            </set>
        where id=#{id}
    </update>

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

    sql

    <sql id="set-all">
        <set>
            <if test="id != null">id=#{id},</if>
            <if test="title != null">title=#{title},</if>
            <if test="author != null">author=#{author},</if>
            <if test="views != null">views=#{views},</if>
        </set>
    </sql>
    <update id="updateBlog" parameterType="map">
        update blog
            <include refid="set-all"></include>
        where id=#{id}
    </update>

    sql 可以提高代码的可用性

    foreach

    <select id="queryBlogForeach" parameterType="map" resultType="Blog">
        select * from
        <where>
            <foreach collection="ids" item="id" open="and (" close=")" separator="or">
                id = #{id}
            </foreach>
        </where>
    </select>

    动态 SQL 的另一个常见使用场景是对集合进行遍历(尤其是在构建 IN 条件语句的时候)

    它允许你指定一个集合,声明可以在元素体内使用的集合项(item)和索引(index)变量。它也允许你指定开头与结尾的字符串以及集合项迭代之间的分隔符。

     

  • 相关阅读:
    面向对象三大特性:封装,继承,多态(三、多态的进一步讲解)
    面向对象三大特性:封装,继承,多态(二、多态)
    面向对象三大特性:封装,继承,多态(一,封装和继承)
    zookeeper+dubbo+demo
    Eclipse常见版本和JDK常用版本对应关系
    Navicat 连接MySQL 8.0.11 出现2059错误
    Neo4j elk Elasticsearch kibana kettle
    jvm垃圾回收机制GC
    jvm 这我就能会了 擦
    spring的4种事务特性,4种隔离级别,7种传播行为
  • 原文地址:https://www.cnblogs.com/shangwei/p/15268201.html
Copyright © 2020-2023  润新知