在mybatis 3 或以上的版本提供了4类标签,分别是:if,choose(when,otherwise),rim(where,set),foreach。接下来将分别介绍这几种标签的具体用法,映射xml文件以及调用示例如下:

  一、映射文件

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.mybatis.dynamicsql.dynamicMapper"> <!-- 1、if操作含模糊查询 -->
<select id="getIF" parameterType="com.mybatis.dynamicsql.IFArgs"
resultType="com.mybatis.bean.YProducts">
select * from Y_Products where CategoryID = 3 <!-- 需要注意的是test="productName != null" 中的productName 是parameterType对应对象的
的属性 -->
<!-- 注意模糊查询的写法 '%${字段名}%' -->
<if test="productName != null">
and ProductName like '%${productName}%'
</if>
<if test="minNum != null and maxNum != null">
and StockNum between #{minNum} and #{maxNum}
</if>
</select> <!-- 2、choose操作 -->
<!-- 类似于Java 的switch语句,choose为switch,when为case,otherwise则为default。 -->
<select id="getCHOOOSE" parameterType="com.mybatis.dynamicsql.CHOOSEArgs"
resultType="com.mybatis.bean.YProducts">
select * from Y_Products
<where>
<choose>
<when test="productName != null ">
and ProductName like '%${productName}%'
</when>
<when test="stockNum != null and stockNum >0">
and StockNum > #{stockNum}
</when>
<when test="unitPrice != null and unitPrice>0">
<!-- 避免转义 -->
<![CDATA[ and UnitPrice < #{unitPrice} ]]>
</when>
<otherwise> CategoryID > #{categoryid} </otherwise>
</choose>
</where>
</select> <!-- 3、where操作 -->
<select id="getWHERE" parameterType="com.mybatis.dynamicsql.IFArgs"
resultType="com.mybatis.bean.YProducts">
select * from Y_Products <where>
<if test="productName != null">
ProductName like '%${productName}%'
</if>
<if test="minNum != and minNum >0 and maxNum != null and maxNum>0">
StockNum between #{minNum} and #{maxNum}
</if>
</where>
</select> <!-- 4、set操作 -->
<update id="updateSET" parameterType="com.mybatis.dynamicsql.SETArgs">
update Y_Products
<set>
<!-- 注意行尾的逗号,会自动去掉末尾最后一个逗号 -->
<if test="pname !=null and pname != '' ">
ProductName = #{pname},
</if>
<if test="pdesc !=null and pdesc != '' ">
ProductDesc = #{pdesc},
</if>
<if test="stocknum >0">
StockNum = #{stocknum},
</if>
</set>
where ProductID = #{id}
</update> <!-- 5、trim操作 -->
<update id="getTRIM" parameterType="com.mybatis.dynamicsql.SETArgs">
update Y_Products
<!-- 语句前面加set,结尾去掉逗号 -->
<trim prefix="set" suffixOverrides=",">
<!-- 注意行尾的逗号 -->
<if test="pname !=null and pname != '' ">
ProductName = #{pname},
</if>
<if test="pdesc !=null and pdesc != '' ">
ProductDesc = #{pdesc},
</if>
<if test="stocknum >0">
StockNum = #{stocknum},
</if>
</trim>
where ProductID = #{id}
</update> <!-- 主是要迭代一个集合,通常是用于IN 条件。List实例将使用“list”做为键,数组实例以“array”做为键 -->
<!-- 6、foreach操作1 -->
<select id="getFOREACH1" resultType="com.mybatis.bean.YProducts">
select * from Y_Products
where ProductID in
<!-- 参数类型为整型类型 -->
<foreach collection="list" item="listIds" open="(" separator=","
close=")">
#{listIds}
</foreach>
</select> <!-- 7、foreach操作2 -->
<select id="getFOREACH2" resultType="com.mybatis.bean.YProducts">
select * from Y_Products
where ProductName in
<!-- 参数类型为字符类型 ,不需要再加单引号,内部会自动识别匹配 -->
<foreach collection="list" item="xxsList" open="(" separator=","
close=")">
#{xxsList}
</foreach>
</select> </mapper>

  二、调用示例

package com.mybatis.dynamicsql;

import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;
import java.util.List;
import java.util.ListIterator; import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.junit.Test; import com.mybatis.bean.YProducts;
import com.mybatis.util.MybatisUtils; public class Main { // http://my.oschina.net/ydsakyclguozi/blog/270322?fromerr=0ndPg1QQ /**
* if标签
*/
@Test
public void test_getIF() {
SqlSessionFactory factory = MybatisUtils.getFactory();
SqlSession session = null;
try {
session = factory.openSession(true); IFArgs ifArgs = new IFArgs();
ifArgs.setProductName("o");
ifArgs.setMinNum(40);
ifArgs.setMaxNum(50); String statement = "com.mybatis.dynamicsql.dynamicMapper.getIF";
List<YProducts> yProductsList = session.selectList(statement,
ifArgs);
for (YProducts yProducts : yProductsList) {
System.out.println(yProducts);
} } catch (Exception e) {
e.printStackTrace();
} finally {
session.close();
} } /**
* choose标签
*/
@Test
public void test_getCHOOSE() {
SqlSessionFactory factory = MybatisUtils.getFactory();
SqlSession session = null;
try {
session = factory.openSession(true); CHOOSEArgs chooseArgs = new CHOOSEArgs();
// chooseArgs.setStockNum(10);
// chooseArgs.setUnitPrice(100);
// chooseArgs.setProductName("n");
// chooseArgs.setCategoryid(1); String statement = "com.mybatis.dynamicsql.dynamicMapper.getCHOOOSE";
List<YProducts> yProductsList = session.selectList(statement,
chooseArgs);
for (YProducts yProducts : yProductsList) {
System.out.println(yProducts);
} } catch (Exception e) {
e.printStackTrace();
} finally {
session.close();
}
} /**
* where标签
*/
@Test
public void test_getWHERE() {
SqlSessionFactory factory = MybatisUtils.getFactory();
SqlSession session = null;
try {
session = factory.openSession(true); IFArgs ifArgs = new IFArgs();
ifArgs.setProductName("o");
// ifArgs.setMinNum(40);
// ifArgs.setMaxNum(50); String statement = "com.mybatis.dynamicsql.dynamicMapper.getWHERE";
List<YProducts> yProductsList = session.selectList(statement,
ifArgs);
for (YProducts yProducts : yProductsList) {
System.out.println(yProducts);
} } catch (Exception e) {
e.printStackTrace();
} finally {
session.close();
}
} /**
* set标签
*/
@Test
public void test_updateSET() {
SqlSessionFactory factory = MybatisUtils.getFactory();
SqlSession session = null;
try {
session = factory.openSession(true); SETArgs setArgs = new SETArgs();
setArgs.setId(1); setArgs.setPdesc("ddddddddddddddddddd");
setArgs.setPname("hosyo");
// setArgs.setStocknum(100); String statement = "com.mybatis.dynamicsql.dynamicMapper.updateSET";
int rVal = session.update(statement, setArgs);
System.out.println(rVal > 0 ? "success" : "fail"); } catch (Exception e) {
e.printStackTrace();
} finally {
session.close();
}
} /**
* trim标签
*/
@Test
public void test_getTRIM() {
SqlSessionFactory factory = MybatisUtils.getFactory();
SqlSession session = null;
try {
session = factory.openSession(true); SETArgs setArgs = new SETArgs();
setArgs.setId(1); setArgs.setPdesc("xxxdddddxx");
setArgs.setPname("hosyo2016");
// setArgs.setStocknum(100); String statement = "com.mybatis.dynamicsql.dynamicMapper.getTRIM";
int rVal = session.update(statement, setArgs);
System.out.println(rVal > 0 ? "success" : "fail"); } catch (Exception e) {
e.printStackTrace();
} finally {
session.close();
}
} /**
* foreach标签
*/
@Test
public void test_getFOREACH() {
SqlSessionFactory factory = MybatisUtils.getFactory();
SqlSession session = null;
try {
session = factory.openSession(true); //1、整形类型参数
// List<Integer> listIds = new ArrayList();
// listIds.add(1);
// listIds.add(3);
// listIds.add(5); //2、字符串类型参数
List<String> strList = new ArrayList<String>();
strList.add("hosyo2016");
strList.add("Chang");
strList.add("Aniseed Syrup"); String statement = "com.mybatis.dynamicsql.dynamicMapper.getFOREACH2";
List<YProducts> yProductsList = session.selectList(statement, strList);
for (YProducts yProducts : yProductsList) {
System.out.println(yProducts);
} } catch (Exception e) {
e.printStackTrace();
} finally {
session.close();
}
}
}

  三、需要注意的问题

    1、模糊查询, '%${字段名}%'

    2、表达式类似test="productName != null " 这里面的"productName"就是parameterType所对应对象的属性

    3、<![CDATA[ and UnitPrice < #{unitPrice} ]]> 特殊符号需要避免转义

    4、<trim prefix="set" suffixOverrides=","> 前缀加set,去掉后缀,

    5、<foreach collection=""></foreach> 中collection的值可以是list或者array,这个主要由调用方法传入参数决定  

      in 里面的不管只整型还是字符类型,都不需要单独加单引号,mybatis内部会自动匹配

  

  

MyBatis之五:动态sql语句的更多相关文章

  1. mybatis 的动态sql语句是基于OGNL表达式的。

    mybatis 的动态sql语句是基于OGNL表达式的.可以方便的在 sql 语句中实现某些逻辑. 总体说来mybatis 动态SQL 语句主要有以下几类:1. if 语句 (简单的条件判断)2. c ...

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

    一看这标题,我都感觉到是mybatis在动态SQL语句中的多条件查询是多么的强大,不仅让我们用SQL语句完成了对数据库的操作:还通过一些条件选择语句让我们SQL的多条件.动态查询更加容易.简洁.直观. ...

  3. Mybatis中动态SQL语句中的parameterType不同数据类型的用法

    Mybatis中动态SQL语句中的parameterType不同数据类型的用法1. 简单数据类型,    此时#{id,jdbcType=INTEGER}中id可以取任意名字如#{a,jdbcType ...

  4. MyBatis 构造动态 SQL 语句

    以前看过一个本书叫<深入浅出 MFC >,台湾 C++ 大师写的一本书.在该书中写到这样一句话,“勿在浮沙筑高台”,这句话写的的确对啊.编程很多语言虽然相通,但是真正做还是需要认真的学习, ...

  5. Mybatis 的动态 SQL 语句

    <if>标签 我们根据实体类的不同取值,使用不同的 SQL 语句来进行查询. 比如在 id 如果不为空时可以根据 id 查询, 如果 username 不同空时还要加入用户名作为条件.这种 ...

  6. 阶段3 1.Mybatis_08.动态SQL_03.mybatis中动态sql语句-foreach和sql标签

    foreach标签 in的查询 sql语句好写,但是传参在映射文件里面改怎么传呢 定义一个List<Integer>成员变量,然后生成get和set 定义一个新的查询方法 open:开始符 ...

  7. 阶段3 1.Mybatis_08.动态SQL_02.mybatis中动态sql语句-where标签的使用

    这里的userSex是实体类里面的属性名,而不是数据库内的字段名称 一个老王改成性别女,为了区分一下 增加sex字段的查询 where标签 用上where和刚才的执行效果是一样的 where标签使我们 ...

  8. mybatis实战教程(mybatis in action)之八:mybatis 动态sql语句

    mybatis 的动态sql语句是基于OGNL表达式的.可以方便的在 sql 语句中实现某些逻辑. 总体说来mybatis 动态SQL 语句主要有以下几类:1. if 语句 (简单的条件判断)2. c ...

  9. 【转】mybatis实战教程(mybatis in action)之八:mybatis 动态sql语句

    转自:除非申明,文章均为一号门原创,转载请注明本文地址,谢谢! 转载地址:http://blog.csdn.net/kutejava/article/details/9164353#t5 1. if ...

  10. Mybatis学习笔记(四) 之动态SQL语句

    动态SQL mybatis 的动态sql语句是基于OGNL表达式的.可以方便的在 sql 语句中实现某些逻辑. 总体说来mybatis 动态SQL 语句主要有以下几类: 1. if 语句 (简单的条件 ...

随机推荐

  1. memcache分布式部署的原理分析

    下面本文章来给各位同学介绍memcache分布式部署的原理分析,希望此文章对你理解memcache分布式部署会有所帮助哦.   今天在封装memcache操作类库过程中,意识到一直以来对memcach ...

  2. android模块化app开发笔记-2插件间布局文件共享

    android编程时布局文件,图片资源等都是放在同一个文件夹下,这样照成一个问题就是我们想重用UI布局文件和图片时就还需要其分离这些资料,相信大部分android程序员都遇到过这样的问题,其痛苦程度不 ...

  3. DevExpress 中根据数据库字典动态生成卡式菜单 z

    第三方的Devexpress套件因为要使用权限机制控制不同用户进入系统显示菜单所以要配合字典数据动态生成.在WEB中这种问题灰常的轻松在winform里就稍微有点不同为了用DEV实现卡式菜单有组的概念 ...

  4. XTUOJ 1248 TC or CF 搜索

    这个题一眼看上去不会 然后有人说是网络流 然后我就想怎么建图啊,然后不会(是本蒟蒻太垃圾了),肯定有网络流解法 然后去群里问了gdut的巨巨,他说他队友爆搜+剪枝过了(我也是非常的叹服) 然后我也写了 ...

  5. 《零成本实现Web自动化测试--基于Selenium》第二章 Selenium简介和基础

    第一部分 Selenium简介 1.Selenium 组建 1.1 Selenium-IDE Selenium-IDC是开发Selenium测试案例的集成开发环境.它像FireFox插件一样的工作,支 ...

  6. bzoj 3275 Number(最小割)

    [题意] 给定n个数,要求选出一些数满足 1.存在c,a*a+b*b=c*c 2.gcd(a,b)=1  使得和最大. [思路] 二分图的最大权独立集(可以这么叫么QAQ 先拆点,对于不满足条件的两个 ...

  7. (转载)OC学习篇之---概述

    前言 终于开启了OC的学习篇了,之前由于工作上的事,学习就一直搁浅了,不过最近由于各种原因,感觉必须要开启iOS的开发旅程了,不然就老了.因为之前一直是做Android的,所以学习iOS来就没那么费劲 ...

  8. hadoop的压缩解压缩,reduce端join,map端join

    hadoop的压缩解压缩 hadoop对于常见的几种压缩算法对于我们的mapreduce都是内置支持,不需要我们关心.经过map之后,数据会产生输出经过shuffle,这个时候的shuffle过程特别 ...

  9. Java——泛型(最易懂的方式讲解泛型)

    来自: 代码大湿 代码大湿 写在前面: 只要认真看过,基本能很熟悉泛型的特性.泛型是JDK1.5之后出现的,比如JDK1.5之前的ArrayList,会出现2个问题 1:向ArrayList当中添加对 ...

  10. HDU 5806 NanoApe Loves Sequence Ⅱ (模拟)

    NanoApe Loves Sequence Ⅱ 题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5806 Description NanoApe, t ...