1. 概述

  MyBatis中动态SQL包括元素:

元素 作用 备注
if 判断语句 单条件分支判断
choose(when、otherwise) 相当于Java中的case when语句 多条件分支判断
trim(where、set) 辅助元素 用于处理SQL拼接问题
foreach 循环语句 用于in语句等列举条件

2. if元素

  if元素是最常用的判断语句,常与test属性联合使用。

2.1 if

  1. <resultMap id="baseResultMap" type="com.libing.helloworld.model.Role">
  2. <id property="id" column="id" />
  3. <result property="roleName" column="role_name" />
  4. </resultMap>
  1. <select id="findBySearchText" resultMap="baseResultMap">
  2. SELECT
  3. id,
  4. role_name
  5. FROM
  6. role
  7. WHERE 1 = 1
  8. <if test="searchText != null and searchText != ''">
  9. AND role_name LIKE CONCAT('%', #{searchText,jdbcType=VARCHAR}, '%')
  10. </if>
  11. ORDER BY id ASC
  12. </select>

2.2 if + where

  1. <select id="findBySearchText" resultMap="baseResultMap">
  2. SELECT
  3. id,
  4. role_name
  5. FROM
  6. role
  7. <where>
  8. <if test="id > 0">
  9. id >= #{id}
  10. </if>
  11. <if test="searchText != null and searchText != ''">
  12. AND role_name LIKE CONCAT(CONCAT('%',#{searchText,jdbcType=VARCHAR}),'%')
  13. </if>
  14. </where>
  15. ORDER BY id ASC
  16. </select>

  MyBatis中where标签会判断如果所包含的标签中有返回值,则插入一个‘where’。此外,如果标签返回的内容是以AND或OR开头,则自动删除开头的AND或OR。

2.3 if + set

  1. <update id="update" parameterType="com.libing.helloworld.model.Role">
  2. UPDATE role
  3. <set>
  4. <if test="roleName != null and roleName != ''">
  5. role_name = #{roleName},
  6. </if>
  7. <if test="remark != null and remark != ''">
  8. remark LIKE CONCAT('%', #{remark, jdbcType=VARCHAR}, '%')
  9. </if>
  10. </set>
  11. WHERE id = #{id}
  12. </update>

  上面形式,当ramark=null时,动态SQL语句会由于多出一个“,”而错误。

3. choose(when,otherwise)元素

  1. <select id="findByCondition" resultMap="baseResultMap">
  2. SELECT
  3. id,
  4. role_name
  5. FROM
  6. role
  7. <where>
  8. <choose>
  9. <when test="id > 0">
  10. id >= #{id}
  11. </when>
  12. <otherwise>
  13. AND role_name LIKE CONCAT('%', #{roleName, jdbcType=VARCHAR}, '%')
  14. </otherwise>
  15. </choose>
  16. </where>
  17. ORDER BY id ASC
  18. </select>

4.trim元素

4.1 trim:if + where

  1. <select id="findByCondition" resultMap="baseResultMap">
  2. SELECT
  3. id,
  4. role_name
  5. FROM
  6. role
  7. <trim prefix="where" prefixOverrides="AND | OR">
  8. <if test="id > 0">
  9. id >= #{id}
  10. </if>
  11. <if test="roleName != null and roleName != ''">
  12. AND role_name = LIKE CONCAT('%', #{roleName, jdbcType=VARCHAR}, '%')
  13. </if>
  14. </trim>
  15. ORDER BY id ASC
  16. </select>

4.2 trim:if + set

  1. <update id="update" parameterType="com.libing.helloworld.model.Role">
  2. UPDATE role
  3. <trim prefix="set" suffixOverrides=",">
  4. <if test="roleName != null and roleName != ''">
  5. role_name = #{roleName},
  6. </if>
  7. <if test="remark != null and remark != ''">
  8. remark LIKE CONCAT('%', #{remark, jdbcType=VARCHAR}, '%')
  9. </if>
  10. </trim>
  11. WHERE id = #{id}
  12. </update>

5. foreach元素

  foreach元素是一个循环语句,作用是遍历集合,支持遍历数组、List、Set接口的集合。

  1. import org.apache.ibatis.annotations.Param;
  1. List<Role> findByIds(@Param("ids") List<Integer> ids);
  1. <select id="findByIds" resultMap="baseResultMap">
  2. SELECT
  3. id,
  4. role_name
  5. FROM
  6. role
  7. WHERE id IN
  8. <foreach collection="ids" index="index" item="id" open="(" separator="," close=")">
  9. #{id}
  10. </foreach>
  11. ORDER BY id ASC
  12. </select>

  其中,

    collection:传入的参数名称,可以是一个数组、List、Set等集合

    item:循环中当前的元素

    index:当前元素在集合的位置下标

    open和close:包裹集合元素的符号

    separator:各个元素的间隔符

  1. int insertBatch(List<Role> list);
  1. <insert id="insertBatch" parameterType="java.util.List">
  2. INSERT role
  3. (
  4. role_name
  5. )
  6. VALUES
  7. <foreach collection="list" item="item" index="index" separator=",">
  8. (
  9. #{item.roleName}
  10. )
  11. </foreach>
  12. </insert>

6. bind元素

  bind元素的作用是通过OGNL表达式去自定义一个上下文变量。

  1. List<Role> findBySearchText(@Param("searchText") String searchText);
  1. <select id="findBySearchText" resultMap="baseResultMap">
  2. <bind name="pattern_searchText" value="'%' + searchText + '%'"/>
  3. SELECT
  4. id,
  5. role_name
  6. FROM
  7. role
  8. WHERE
  9. role_name LIKE #{pattern_searchText}
  10. </select>

  其中,

    searchText:传入的参数名称

MyBatis基础:MyBatis动态SQL(3)的更多相关文章

  1. mybatis 基础(二) 动态sql 关于where if / where choose when otherwise

    个人理解: where if就相当于正常的java中的if 语句,如果有多个条件组合判断的话用 and, or连接 而where choose when otherwise choose就好像是swi ...

  2. 【mybatis深度历险系列】mybatis中的动态sql

    最近一直做项目,博文很长时间没有更新了,今天抽空,学习了一下mybatis,并且总结一下.在前面的博文中,小编主要简单的介绍了mybatis中的输入和输出映射,并且通过demo简单的介绍了输入映射和输 ...

  3. Mybatis入门之动态sql

    Mybatis入门之动态sql 通过mybatis提供的各种标签方法实现动态拼接sql. 1.if.where.sql.include标签(条件.sql片段) <sql id="sel ...

  4. mybatis 详解------动态SQL

    mybatis 详解------动态SQL   目录 1.动态SQL:if 语句 2.动态SQL:if+where 语句 3.动态SQL:if+set 语句 4.动态SQL:choose(when,o ...

  5. mybatis中的动态SQL

    在实际开发中,数据库的查询很难一蹴而就,我们往往要根据各种不同的场景拼接出不同的SQL语句,这无疑是一项复杂的工作,我们在使用mybatis时,mybatis给我们提供了动态SQL,可以让我们根据具体 ...

  6. Mybatis映射文件动态SQL语句-01

    因为在很多业务逻辑复杂的项目中,往往不是简单的sql语句就能查询出来自己想要的数据,所有mybatis引入了动态sql语句, UserMapper.xml <?xml version=" ...

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

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

  8. 6.Mybatis中的动态Sql和Sql片段(Mybatis的一个核心)

    动态Sql是Mybatis的核心,就是对我们的sql语句进行灵活的操作,他可以通过表达式,对sql语句进行判断,然后对其进行灵活的拼接和组装.可以简单的说成Mybatis中可以动态去的判断需不需要某些 ...

  9. 11、MyBatis教程之动态SQL

    12.动态SQL 1.介绍 什么是动态SQL:动态SQL指的是根据不同的查询条件 , 生成不同的Sql语句. 官网描述: MyBatis 的强大特性之一便是它的动态 SQL.如果你有使用 JDBC 或 ...

  10. 【长文】Spring学习笔记(七):Mybatis映射器+动态SQL

    1 概述 本文主要讲述了如何使用MyBatis中的映射器以及动态SQL的配置. 2 MyBatis配置文件概览 MyBatis配置文件主要属性如下: <settings>:相关设置,键值对 ...

随机推荐

  1. 使用ECharts来实现地图下钻功能(某省的市级下钻到县级)

    var cityMap = { "长沙市": "430100", "株洲市": "430200", "湘潭市& ...

  2. https基础

    面试题 https://blog.csdn.net/xihuangwutong/article/list/5? TLS 有三大功能:内容加密,身份认证,数据完整性认证 内容加密是依赖于秘钥协商协议数据 ...

  3. hash_hmac 签名

    <?php /** * =========================================================== * Model_Base * Descriptio ...

  4. Python:Day03 变量、字符编码

    配置环境变量 右键计算机--->属性--->高级系统设置--->高级--->环境变量--->系统变量--->找到Path,双击编辑--->将程序的路径粘贴上去 ...

  5. Oracle查询数据库中所有表的记录数

    1.Oracle查询数据库中所有表的记录数,但是有可能不准建议用第二种方式进行查询 select t.table_name,t.num_rows from user_tables t 2.创建orac ...

  6. 面试笔记--Fast-Fail(快速失败)机制

    1.解决: fail-fast机制,是一种错误检测机制.它只能被用来检测错误,因为JDK并不保证fail-fast机制一定会发生.若在多线程环境下使用fail-fast机制的集合,建议使用“java. ...

  7. 隐写工具Hydan的安装使用方法

    Hydan是可以在32位ELF二进制文件里隐藏信息的工具,主要原理是利用了i386指令中的冗余信息. 官网地址:http://www.crazyboy.com/hydan/ 但这个工具最后更新好像是在 ...

  8. [loadrunner]通过检查点判定事务是否成功

    //检查点设置语句 //tmp在此时为临时参数  web_reg_find("SaveCount=tmp",   "Text=xxx",   LAST);   ...

  9. 实现多个标签页之间通信的几种方法(sharedworker)

      效果图.gif prologue 之前在网上看到一个面试题:如何实现浏览器中多个标签页之间的通信.我目前想到的方法有三种:使用websocket协议.通过localstorage.以及使用html ...

  10. Python api接口和SQL数据库关联

    数据库表创建 服务器环境配置.连接 .操作.数据库 API接口  原则: