mybatis 之动态 SQL

1、动态 SQL 简介:

动态 SQL 是 MyBatis 强大特性之一。极大的简化我们拼装 SQL 的操作。

动态 SQL 元素和使用 JSTL 或者其他类似基于 XML 的文本处理器相似。

MyBatis 采用功能强大的基于 OGNL 的表达式来简化操作。

- if

- choose(when,otherwise)

- trim(where,set)

- foreach

2、if:判断(要求是携带了哪个字段查询条件,就带上这个字段的值):

a、创建一个 EmployeeMapperDynamicSQL 接口,并且在这个接口中提供一个 getEmpsByCondictionIf 方法。(该方法中提供一个 Employee 的参数)在EmployeeMapperDynamicSQL.xml 文件中添加 select 标签,并提供相应的 where 子标签和 if 标签的设置。

b、可以看到下图的输出结果中,传入的参数是动态变动的。(下图的 sql 语句 会随着传入的对象属性值的不同而发生相应的改变)

注:如果第一个 参数不存在,where 标签会在 sql 第二个的参数 and 去掉。

2、trim:自定义输出 sql 字符串的截取规则:

-  prefix="" :在trim 标签中输出的字符串添加前缀字符。

-  suffixOverrides="" :在 trim 标签中输出的字符串删除指定的前缀字符。

-  suffix="" :在trim 标签中输出的字符串添加后缀字符。

-  prefixOverrides="":在 trim 标签中输出的字符串删除指定的后缀字符。

注:可以看到,以上输出结果中,前缀的 where 字符串被添加,后缀的 and 被删除掉了。

3、choose(when)标签:相当于 javase 中的 switch-case 条件语句:

(有 id 属性值时以 id 查询,有 lastName 属性值时以 lastName 查询,只选其一。)

注:可以看到打印出来的 sql 语句中传入的实参为 "%i%"。

3、update、set 标签:用于更新操作:

a、在 EmployeeMapperDynamicSQL 接口中添加 updateEmp 方法,后在 EmployeeMapperDynamicSQL.xml 文件中添加 update 标签以及 set 子标签。

b、下图的输出结果中的 sql 语句中可以看到, last_name 后的 ,因为添加了 set 标签而被去掉, 并且在 tbl_employees 后添加了 set 字符串。

4、动态遍历集合:

a、在 EmployeeMapperDynamicSQL 中添加 getEmpsByConditionForeach 方法,并在 EmployeeMapperDynamicSQL.xml 文件中设置 select 标签。

-  foreach 标签:循环遍历属性值

*  collection 属性:指定要遍历的集合。list 类型的参数会特殊处理封装在 map 中,map 的 key 就叫 list

*  item:将当前遍历出的元素赋值给指定的变量

*  separator:每个元素之间的分隔符

*  open:遍历出的结果字符串前加上的开始字符串

*  close:遍历出的结果字符串前加上的最后字符串

* index:遍历 list 的时候,index 就是索引,item 就是当前值

遍历 map 的时候,index 表示 map 的 key,item 就是当前值

b、如下图的输出的 sql 语句,会随着集合的元素数量的不同动态修改 in 后的字符串。

5、批量保存:使用 foreach 标签:

a、在 EmployeeMapperDynamicSQL 接口中添加 addEmps 方法,并在 EmployeeMapperDynamicSQL.xml 文件中设置 insert 标签以及 foreach 子标签。

b、下图的输出结果中可以看到,批量插入成功。

    附:

    1、mybatis 中的两个内置参数:

_parameter:代表整个参数

单个参数:_parameter 就是这个参数

多个参数:参数会被封装到一个 map中:_parameter 就是代表这个 map

_databaseId:如果配置了 databaseIdProvider 标签,_databaseId 就是代表当前数据库的别名 oracle。

    2、抽取可重用的 sql 片段,方便后面引用:

sql 抽取:经常要查询的列名,或者插入用的列名(抽取出来方便使用)

include 来引用已经抽取的 sql

时间: 06-02

mybatis 之动态 SQL的相关文章

MyBatis的动态SQL详解

MyBatis的动态SQL是基于OGNL表达式的,它可以帮助我们方便的在SQL语句中实现某些逻辑,本文详解mybatis的动态sql,需要的朋友可以参考下 MyBatis 的一个强大的特性之一通常是它的动态 SQL 能力.如果你有使用 JDBC 或其他 相似框架的经验,你就明白条件地串联 SQL 字符串在一起是多么的痛苦,确保不能忘了空 格或在列表的最后省略逗号.动态 SQL 可以彻底处理这种痛苦. 通常使用动态SQL不可能是独立的一部分,MyBatis当然使用一种强大的动态SQL语言来改进这种

Mybatis的动态Sql

基础部分可以查看我的另一篇博客:http://blog.csdn.net/elim168/article/details/40622491 MyBatis的动态SQL是基于OGNL表达式的,它可以帮助我们方便的在SQL语句中实现某些逻辑. MyBatis中用于实现动态SQL的元素主要有: if choose(when,otherwise) trim where set foreach if就是简单的条件判断,利用if语句我们可以实现某些简单的条件选择.先来看如下一个例子: Xml代码 <sele

mybatis 使用动态SQL

RoleMapper.java public interface RoleMapper { public void add(Role role); public void update(Role role); public void delete(Role role); public List<Role> getRoleList(Role role); } RoleMapper.xml <?xml version="1.0" encoding="UTF-8&

MyBatis中动态SQL语句完成多条件查询

http://blog.csdn.net/yanggaosheng/article/details/46685565 MyBatis中动态SQL语句完成多条件查询 <select id="queryEmp"  resultType="cn.test.entity.Emp"> select * from emp where 1=1 <if test="deptNo!=null"> and deptno=#{deptNO} &

MyBatis 构造动态 SQL 语句

以前看过一个本书叫<深入浅出 MFC >,台湾 C++ 大师写的一本书.在该书中写道这样一句话,"勿在浮沙筑高台",这句话写的的确对啊.编程很多语言虽然相同,但是真正做还是需要认真的学习,如果只是想着按想像着来,真的是会走很多弯路,浪费很多时间. 无法使用 not in 在项目中需要使用到 not in ,想着不是很复杂,但是这个问题困扰了我个把小时,很是郁闷.自己拼接好了字符串,字符串的内容是 not in 中的各个 id 值.通过 not in 来进行 update 的

MyBatis探究-----动态SQL详解

1.if标签 接口中方法:public List<Employee> getEmpsByEmpProperties(Employee employee); XML中:where 1=1必不可少 <select id="getEmpsByEmpProperties" resultType="com.mybatis.entity.Employee"> select * from t_employee where 1=1 <if test=&

Mybatis系列---动态SQL

问题: 什么是动态SQL? 动态SQL有什么作用? 传统的使用JDBC的方法,相信大家在组合复杂的的SQL语句的时候,需要去拼接,稍不注意哪怕少了个空格,都会导致错误.Mybatis的动态SQL功能正是为了解决这种问题, 其通过 if, choose, when, otherwise, trim, where, set, foreach,可组合成非常灵活的SQL语句,从而提高开发人员的效率. 下述可知道这四个操作节点中的子节点都是差不多是一样的,insert和update中多了一个selectK

一分钟带你了解下MyBatis的动态SQL!

MyBatis的强大特性之一便是它的动态SQL,以前拼接的时候需要注意的空格.列表最后的逗号等,现在都可以不用手动处理了,MyBatis采用功能强大的基于OGNL的表达式来实现,下面主要介绍下. 一.if标签 if是最常用的判断语句,主要用于实现某些简单的条件选择.基本使用示例如下: <select id="queryAllUsersByName" resultType="com.example.springboot.mybatisxml.entity.User&quo

Mybatis的动态sql拼接语句

Mybatis的动态sql拼接语句 1.主配置文件SqlMapConfig.xml  <?xml version="1.0" encoding="utf-8" ?> <!DOCTYPE configuration         PUBLIC "-//mybatis.org//DTD Config 3.0//EN"         "http://mybatis.org/dtd/mybatis-3-config.dtd

mybatis入门-动态sql

什么是动态sql 判断的动态sql mybatis核心就是对sql语句进行灵活操作,通过表达式进行判断,对sql进行灵活拼接.组装. 现有需求如下:需要查询用户,输入的是用户类,如果用户的性别类不为空,则将性别作为查询条件之一,如果用户的姓名不为空,则将用户姓名作为查询条件之一.如果用户两个属性都为空,则查询所有用户. 我们知道,在mapper中,我们的传入参数只有一个,多个参数只能通过包转类来实现,现在这种问题怎么解决呢?答案就是在xml文件中加入判断,使sql语句动态生成.刚才的需求所对应的