动态 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. jenkins插件Publish Over SSH因安全问题下架

    最近用docker新搭建了一个jenkins,安装插件的时候发现publish over ssh找不到了,官方给出的解释是存在安全隐患于2022.01.12暂停分发,官方解释如下:https://ww ...

  2. 基于反熔丝FPGA、QSPI FLASH的高可靠程序存储、启动控制系统

    1      涉及术语解释 1.1     三模冗余 三模冗余系统简称TMR(Triple Modular Redundancy),是最常用的一种容错设计技术.三个模块同时执行相同的操作,以多数相同的 ...

  3. mysql中generated always as的使用

    -- generated always as的使用 CREATE TABLE t1( c1 INT, c2 DOUBLE(20,19) , c3 INT GENERATED ALWAYS AS(c1* ...

  4. [LeetCode]66.加一(Java)

    原题地址: plus-one 题目描述: 给定一个由 整数 组成的 非空 数组所表示的非负整数,在该数的基础上加一. 最高位数字存放在数组的首位, 数组中每个元素只存储单个数字. 你可以假设除了整数 ...

  5. 利用 kubeasz 给 suse 12 部署 kubernetes 1.20.1 集群

    文章目录 1.前情提要 2.环境准备 2.1.环境介绍 2.2.配置静态网络 2.3.配置ssh免密 2.4.批量开启模块以及创建文件 2.5.安装ansible 2.5.1.安装pip 2.5.2. ...

  6. Nginx频繁报“500 Internal Server Error”错误

    服务器导致访问量激增,频繁报"500 Internal Server Error"错误.我查了一下nginx的错误日志(apt-get方式安装的nginx的错误日志在/var/lo ...

  7. OpenStack学习系列之十二:安装ceph并对接OpenStack

        Ceph 是一种为优秀的性能.可靠性和可扩展性而设计的统一的.分布式文件系统.Ceph 的统一体现在可以提供文件系统.块存储和对象存储,分布式体现在可以动态扩展.在国内一些公司的云环境中,通常 ...

  8. 【C# Parallel】开端

    使用条件 1.必须熟练掌握锁.死锁.task的知识,他是建立这两个的基础上的.task建立在线程和线程池上的. 2.并不是所有代码都适合并行化. 例如,如果某个循环在每次迭代时只执行少量工作,或它在很 ...

  9. C#操作WMI指南

    WMI应用(一个系统自带的测试WMI语句的工具) 1. 开始-运行-输入:wbemtest 回车2. 单击"连接", 输入:root\cimv2 回车; 或者ROOT\Securi ...

  10. 【C# IO 操作】 文件系统侦听 FileSystemWatcher

    侦听器 :FileSystemWatcher FileSystemWatcher常用属性有: Filter :获取或设置用于确定目录中要监视哪些文件的过滤器字符串.Filter 属性设置为空字符串 ( ...