1.  根据方法传入的参数不同执行不同的 SQL 命令.称为动态 SQL, MyBatis 中动态 SQL 就是在 mapper.xml 中添加逻辑判断等.

2. <if>标签

<select id="selByAccinAccout" resultType="log">
select * from log where 1=1
<!-- OGNL 表达式,直接写 key 或对象的属性.不需要添加任
何特字符号 -->
<if test="accin!=null and accin!=''">
and accin=#{accin}
</if>
<if test="accout!=null and accout!=''">
and accout=#{accout}
</if>
</select>

3. <where>标签

(1)当编写 where 标签时,如果内容中第一个是 and 去掉第一个and
(2) 如果<where>中有内容会生成 where 关键字,如果没有内容不生成 where 关键

(3)比直接使用<if>少写 where 1=1

<select id="selByAccinAccout" resultType="log">
select * from log
  <where>
    <if test="accin!=null and accin!=''">
      and accin=#{accin}
    </if>
    <if test="accout!=null and accout!=''">
      and accout=#{accout}
    </if>
  </where>
</select>

3.  <choose> <when> <otherwise>标签

  (1)只有有一个成立,其他都不执行.

如果 accin 和 accout 都不是 null 或不是””生成的 sql 中只有 where accin=?,即是有第一个查询条件

<select id="selByAccinAccout" resultType="log">
  select * from log
  <where>
    <choose>
      <when test="accin!=null and accin!=''">
        and accin=#{accin}
      </when>
      <when test="accout!=null and accout!=''">
        and accout=#{accout}
      </when>
    </choose>
  </where>
</select>

4. <set>标签

  <set>用在修改 SQL 中 set 从句

(1)去掉最后一个逗号

(2)如果<set>里面有内容生成 set 关键字,没有就不生成

id=#{id} 目的防止<set>中没有内容,mybatis 不生成 set 关键字,如果修改中没有 set 从句 SQL 语法错误.

<update id="upd" parameterType="log" >
  update log
  <set>
    id=#{id},
    <if test="accIn!=null and accIn!=''">
      accin=#{accIn},
    </if>
    <if test="accOut!=null and accOut!=''">
      accout=#{accOut},
    </if>
  </set>
  where id=#{id}
</update>

5. <trim>标签

(1) prefix 在前面添加内容
(2)prefixOverrides 去掉前面内容
(3)suffix 在后面添加内容
(4)suffixOverrieds 去掉后面内容
执行顺序去掉内容后添加内容

下面的<trim>其实是模拟<set>标签

<update id="upd" parameterType="log">
update log
<trim prefix="set" suffixOverrides=",">
a=a,
</trim>
where id=100
</update>

6.  <bind> 标签

作用:给参数重新赋值

应用场景:模糊查询,在原内容前或后添加内容

<select id="selByLog" parameterType="log" resultType="log">
  <bind name="accin" value="'%'+accin+'%'"/>
  select * from log
  where accin=#{accin}
</select>

7. <foreach>标签

作用:循环参数内容,还具备在内容的前后添加内容,还具备添加分隔符功能.

 

适用场景:in 查询中.批量新增中(mybatis 中 foreach 效率比较低)

如果希望批量新增,SQL 命令,

insert into log VALUES(default,1,2,3),(default,2,3,4),(default,3,4,5);

openSession()必须指定   factory.openSession(ExecutorType.BATCH);

即在底层 使用JDBC 的 PreparedStatement.addBatch();

使用实例:

collectino=”” 要遍历的集合

item 迭代变量, #{迭代变量名}获取内容      

open 循环后左侧添加的内容

close 循环后右侧添加的内容

separator 每次循环时,元素之间的分隔符

<select id="selIn" parameterType="list" resultType="log">
select * from log where id in
<foreach collection="list" item="abc" open="(" close=")" separator=",">
#{abc} </foreach>
</select>

8. <sql> 和<include>标签

某些 SQL 片段如果希望复用,可以使用<sql>定义这个片段

<sql id="mysql">
id,accin,accout,money
</sql> <select id="">
select <include refid="mysql"></include>
from log
</select>

mybatis学习 十 动态 SQL的更多相关文章

  1. mybatis学习之动态sql

    mybatis的动态sql语句很强大,在mapper映射文件中使用简单的标签即可实现该效果,下面一个个记录: 1.select查询 简单的select类似如下: <select id=" ...

  2. mybatis 学习五 动态SQL语句

    3.1 selectKey 标签 在insert语句中,在Oracle经常使用序列.在MySQL中使用函数来自动生成插入表的主键,而且需要方法能返回这个生成主键.使用myBatis的selectKey ...

  3. Mybatis学习笔记-动态SQL

    概念 根据不同环境生成不同SQL语句,摆脱SQL语句拼接的烦恼[doge] 本质:SQL语句的拼接 环境搭建 搭建数据库 CREATE TABLE `blog`( `id` VARCHAR(50) N ...

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

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

  5. Mybatis入门之动态sql

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

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

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

  7. mybatis中的动态SQL

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

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

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

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

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

随机推荐

  1. Vue组成和第3方插件

    vue全家桶的成员是:vue-cli,vuex,vue-router,vue-axios(vue2.0). 第三方插件:vue-scroller,vue-lazyload,vue-awesome-sw ...

  2. ubuntu后台运行命令

    参考 https://blog.csdn.net/shaozg168/article/details/6979337 nohup ./test.sh &

  3. Dbutils 连接数据库

    用了JDBC后接着学习Dbutils连接数据库 1.添加驱动包 Class.forName("oracle.jdbc.driver.OracleDriver"); 2.获取数据库连 ...

  4. 160. Intersection of Two Linked Lists (List;Two-Pointers)

    Write a program to find the node at which the intersection of two singly linked lists begins. For ex ...

  5. mysql中创建event定时任务

    从网上借鉴大神的. use onlinexam; -- 查看event事件是否开启 show variables like '%sche%'; -- 开启event事件  (非常重要) set glo ...

  6. TZOJ 2588 Bad Grass(DFS)

    描述 Bessie was munching on tender shoots of grass and, as cows do, contemplating the state of the uni ...

  7. jmeter简单压测设置

    参数化 随机参数 时间参数 顺序自增函数  文件读取  直接引用 响应断言 用来查看sessionid 关联 关联引用 jmeter操作数据库 安装连接程序包 ip 端口号 哪个数据库 可以执行多条s ...

  8. SpringCloud如何创建一个服务提供者provider

    SpringCloud如何创建一个服务提供者provider 创建子moudle provider-demo 创建一个子module,项目名叫provider-demo. 填充springboot和s ...

  9. git查看历史操作

    在提交了若干更新,又或者克隆了某个项目之后,偶尔想回顾下过往提交历史.可以使用git log命令来实现. 最简单的查看提交历史命令如下: $ git log $ git log --oneline $ ...

  10. idea中lombok安装

    项目中经常使用bean,entity等类,绝大部分数据类类中都需要get.set.toString.equals和hashCode方法,虽然eclipse和idea开发环境下都有自动生成的快捷方式,但 ...