动态 SQL 是 MyBatis 的强大特性之一。如果你使用过 JDBC 或其它类似的框架,你应该能理解根据不同条件拼接 SQL 语句有多痛苦,例如拼接时要确保不能忘记添加必要的空格,还要注意去掉列表最后一个列名的逗号。利用动态 SQL,可以彻底摆脱这种痛苦。

如果你之前用过 JSTL 或任何基于类 XML 语言的文本处理器,你对动态 SQL 元素可能会感觉似曾相识。在 MyBatis 之前的版本中,需要花时间了解大量的元素。借助功能强大的基于 OGNL 的表达式,MyBatis 3 替换了之前的大部分元素,大大精简了元素种类,现在要学习的元素种类比原来的一半还要少。

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

理解:在sql层面执行逻辑代码

  1. if

    根据不同的条件(包括无条件)进行查询,大大降低了代码的冗余

        <select id="queryByIf" parameterType="map" resultType="userBean">
    SELECT * FROM user WHERE 1=1
    <if test="UId != null">
    AND UId = #{UId}
    </if>
    <if test="UName != null">
    AND UName = #{UName}
    </if>
    </select>

    注:(1).这里resultType写的是集合中的元素类型,并不是集合本身

    (2).test中的条件可以通过and连接

  2. chose,when,otherwise

    我们不想使用所有的条件,而只是想从多个条件中选择一个使用。

        <select id="queryByIf" parameterType="map" resultType="userBean">
    SELECT * FROM user WHERE
    <choose>
    <when test="UId != null">
    UId = #{UId}
    </when>
    <when test="UName != null">
    UName = #{UName}
    </when>
    <otherwise>
    1=1
    </otherwise>
    </choose>
    </select>

    注:这个语句类似swith,choose->switch,when->case,otherwise->default

  3. trim、where、set

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

    set 元素会动态地在行首插入 SET 关键字,并会删掉额外的逗号(这些逗号是在使用条件语句给列赋值时引入的)。

    trim可以完成对两者的实现与优化

    where使用:

        <select id="queryByIf" parameterType="map" resultType="userBean">
    SELECT * FROM user
    <where>
    <if test="UName != null">
    AND UState = #{UState}
    </if>
    <choose>
    <when test="UId != null">
    AND UId = #{UId}
    </when>
    <otherwise>
    AND 1=1
    </otherwise>
    </choose>
    </where>
    </select>

    注:这里的where写了之后,原句中的where就不用写了,在代码运行过程,where标签能够自动补上where,并且去除不需要的AND(不会补上)

    set使用:

        <update id="updateById" parameterType="map">
    UPDATE user
    <set>
    <if test="UState != null">UState = #{UState},</if>
    <choose>
    <when test="UName != null">
    UName = #{UName},
    </when>
    <when test="USet != null">
    USet = #{USet},
    </when>
    </choose>
    </set>
    WHERE UId = #{UId}
    </update>

    注:这里的set写了之后,原句中的set也会自动补全,并且去除不需要的','(不会补上)

    trim的定义格式:

    实现where

    <trim prefix="WHERE" prefixOverrides="AND |OR ">
    ...
    </trim>

    实现set

    <trim prefix="SET" suffixOverrides=",">
    ...
    </trim>
  4. foreach使用

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

        <select id="queryListByForeach" parameterType="map" resultType="userBean">
    SELECT * FROM user
    <where>
    <foreach collection="USets" item="item" open="(" separator="OR" close=")">
    USet = #{item}
    </foreach>
    </where>
    </select>

    说明:主要解释一下foreach中的几个参数,这里collection是map中的一个集合,Uset为集合中的一个参数(名字随意),open定义了迭代开始所放置的字符串,separator定义的是迭代时的分隔符,close定义了迭代结束放置的字符串

  5. 补充:sql片段

    类似于前端组件的概念

    通过<sql id="">定义组件,通过<include refid="">引用组件

    注意:

    (1). 最好基于单表来定义SQL片段

    (2). 不要存在where标签

Mybaties——动态sql的更多相关文章

  1. 小D课堂-SpringBoot 2.x微信支付在线教育网站项目实战_3-4.动态Sql语句Mybaties SqlProvider

    笔记 4.动态Sql语句Mybaties SqlProvider     简介:讲解什么是动态sql,及使用 1.             @UpdateProvider(type=VideoSqlP ...

  2. 值得注意的ibatis动态sql语法格式

    一.Ibatis常用动态sql语法,简单粗暴用一例子 <select id="iBatisSelectList" parameterClass="java.util ...

  3. Mysql - 游标/动态sql/事务

    游标这个在我目前的项目里面用的还不多, 但是其功能还是很强大的. 动态sql以前都没用过, 是跟着富士康(不是张全蛋的富土康哦)过来的同事学的. 还是挺好用的. 我的数据库方面, 跟他学了不少. 在此 ...

  4. MyBatis4:动态SQL

    什么是动态SQL MyBatis的一个强大特性之一通常是它的动态SQL能力.如果你有使用JDBC或其他相似框架的经验,你就明白条件串联SQL字符串在一起是多么地痛苦,确保不能忘了空格或者在列表的最后的 ...

  5. 分享公司DAO层动态SQL的一些封装

    主题 公司在DAO层使用的框架是Spring Data JPA,这个框架很好用,基本不需要自己写SQL或者HQL就能完成大部分事情,但是偶尔有一些复杂的查询还是需要自己手写原生的Native SQL或 ...

  6. MySQL存储过程动态SQL语句的生成

    用Mysql存储过程来完成动态SQL语句,使用存储过程有很好的执行效率: 现在有要求如下:根据输入的年份.国家.节假日类型查询一个节假日,我们可以使用一般的SQL语句嵌入到Java代码中,但是执行效率 ...

  7. 【Java EE 学习 79 下】【动态SQL】【mybatis和spring的整合】

    一.动态SQL 什么是动态SQL,就是在不同的条件下,sql语句不相同的意思,曾经在“酒店会员管理系统”中写过大量的多条件查询,那是在SSH的环境中,所以只能在代码中进行判断,以下是其中一个多条件查询 ...

  8. 自定义函数执行动态sql语句

    --函数中不能调用动态SQL,使用用存储过程吧.如果还要对函数做其他操作,换成存储过程不方便,可以考虑把其他操作一起封装在存储过程里面.如:   create proc [dbo].[FUN_YSCL ...

  9. mybatis入门基础(五)----动态SQL

    一:动态SQL 1.1.定义 mybatis核心对sql语句进行灵活操作,通过表达式进行判断,对sql进行灵活拼接.组装. 1.2.案例需求 用户信息综合查询列表这个statement的定义使用动态s ...

随机推荐

  1. LeetCode随缘刷题之盛最多水的容器

    package leetcode.day_01_30; /** * 给你 n 个非负整数 a1,a2,...,an,每个数代表坐标中的一个点(i,ai) .在坐标内画 n 条垂直线,垂直线 i的两个端 ...

  2. F WebDriver and 环境配置

    https://seleniumhq.github.io/docs/wd.html WEBDRIVER The biggest change in Selenium recently has been ...

  3. 神奇小证明之——世界上只有5个正多面体+构造x3=2a3

    今天我彻底放飞自我了...作业还没写完...但就是要总结一些好玩的小性质...谁给我的勇气呢?

  4. Solution -「AGC 010C」「AT 2304」Cleaning

    \(\mathcal{Description}\)   Link.   给定一棵 \(n\) 个点的无根树,点有点权,每次选择两个不同的叶子,使它们间的简单路径的所有点权 \(-1\),问能否将所有点 ...

  5. 【流行前沿】联邦学习 Federated Learning with Only Positive Labels

    核心问题:如果每个用户只有一类数据,如何进行联邦学习? Felix X. Yu, , Ankit Singh Rawat, Aditya Krishna Menon, and Sanjiv Kumar ...

  6. HTTP流量神器Goreplay核心源码详解

    摘要:Goreplay 前称是 Gor,一个简单的 TCP/HTTP 流量录制及重放的工具,主要用 Go 语言编写. 本文分享自华为云社区<流量回放工具之 goreplay 核心源码分析> ...

  7. tar压缩打包实用命令总结

    一.tar常用命令参数 用法:tar [参数] [文件] -v 显示指令执行过程 -c 创建压缩文件 -x 解压文件 -z 通过gzip指令处理文件 -f 指定文件 -C 解压文件到指定目录 -t - ...

  8. 【Python自动化Excel】pandas处理Excel的“分分合合”

    话说Excel数据表,分久必合.合久必分.Excel数据表的"分"与"合"是日常办公中常见的操作.手动操作并不困难,但数据量大了之后,重复性操作往往会令人崩溃. ...

  9. C#异步编程由浅入深(三)细说Awaiter

      上一篇末尾提到了Awaiter这个类型,上一篇说了,能await的对象,必须包含GetAwaiter()方法,不清楚的朋友可以看上篇文章.那么,Awaiter到底有什么特别之处呢?   首先,从上 ...

  10. 对于计算正确率时 logits.argmax(dim=1),torch.eq(pre_label,label)

    额  好像是一句非常简单的代码 ,但是作为新手 ,我是完全看不懂哎 前十眼. 首先 这里的logits是一个 (a,b)维的张量.其中a是你的全连接输出维度,b是一个batch中的样本数量. 我们经过 ...