文档章节

mybatis动态SQL 条件查询

今晚打-老虎
 今晚打-老虎
发布于 2016/07/20 12:23
字数 1093
阅读 7
收藏 0

MyBatis的动态SQL是基于OGNL表达式的,它可以帮助我们方便的在SQL语句中实现某些逻辑。 MyBatis中用于实现动态SQL的元素主要有:

  • if
  • choose(when,otherwise)
  • trim
  • where
  • set
  • foreach

1、if就是简单的条件判断,利用if语句我们可以实现某些简单的条件选择。先来看如下一个例子:

<select id="Test" parameterType="Blog" resultType="Blog">  
    select * from test where 11 = 1  
    <if test="title != null">  
        and title = #{title}  
    </if>  
    <if test="content != null">  
        and content = #{content}  
    </if>  
    <if test="owner != null">  
        and owner = #{owner}  
    </if>  
</select>

满足条件就在后面拼接SQL

2、choose元素的作用就相当于JAVA中的switch语句,通常都是与when和otherwise搭配使用

<select id="Test" parameterType="Blog" resultType="Blog">  
    select * from t_blog where 11 = 1   
    <choose>  
        <when test="title != null">  
            and title = #{title}  
        </when>  
        <when test="content != null">  
            and content = #{content}  
        </when>  
        <otherwise>  
            and owner = "owner1"  
        </otherwise>  
    </choose>  
</select> 
当title !=null 时输出and title = #{title},后面的条件不再执行, content同理,当条件都不成立,输出otherwise里的内容

3、where主要是简化SQL语句中where中的条件判断

<select id="Test" parameterType="Blog" resultType="Blog">  
    select * from t_blog   
    <where>  
        <if test="title != null">  
            title = #{title}  
        </if>  
        <if test="content != null">  
            and content = #{content}  
        </if>  
        <if test="owner != null">  
            and owner = #{owner}  
        </if>  
    </where>  
</select> 
where元素的作用是会在写入where元素的地方输出一个where,另外一个好处是你不需要考虑where元素里面的条件输出是什么样子的,MyBatis会智能的帮你处理,如果所有的条件都不满足那么MyBatis就会查出所有的记录

4、trim元素的主要功能是可以在自己包含的内容前加上某些前缀,也可以在其后加上某些后缀,与之对应的属性是prefix和suffix;可以把包含内容的首部某些内容覆盖,即忽略,也可以把尾部的某些内容覆盖,对应的属性是prefixOverrides和suffixOverrides;正因为trim有这样的功能,所以我们也可以非常简单的利用trim来代替where元素的功能

prefix:前缀覆盖并增加其内容 suffix:后缀覆盖并增加其内容 prefixOverrides:前缀判断的条件 suffixOverrides:后缀判断的条件

<select id="dynamicTrimTest" parameterType="Blog" resultType="Blog">  
        select * from t_blog   
        <trim prefix="where" prefixOverrides="and |or">  
            <if test="title != null">  
                title = #{title}  
            </if>  
            <if test="content != null">  
                and content = #{content}  
            </if>  
            <if test="owner != null">  
                or owner = #{owner}  
            </if>  
        </trim>  
    </select>    

5、set元素主要是用在更新操作的时候,它的主要功能和where元素其实是差不多的,主要是在包含的语句前输出一个set

<update id="Test" parameterType="Blog">  
        update t_blog  
        <set>  
            <if test="title != null">  
                title = #{title},  
            </if>  
            <if test="content != null">  
                content = #{content},  
            </if>  
            <if test="owner != null">  
                owner = #{owner}  
            </if>  
        </set>  
        where id = #{id}  
    </update> 
 上述示例代码中,如果set中一个条件都不满足,即set中包含的内容为空的时候就会报错

6、 foreach的主要用在构建in条件中,它可以在SQL语句中进行迭代一个集合。foreach元素的属性主要有item,index,collection,open,separator,close。item表示集合中每一个元素进行迭代时的别名,index指定一个名字,用于表示在迭代过程中,每次迭代到的位置,open表示该语句以什么开始,separator表示在每次进行迭代之间以什么符号作为分隔符,close表示以什么结束,在使用foreach的时候最关键的也是最容易出错的就是collection属性,该属性是必须指定的,但是在不同情况下,该属性的值是不一样的,主要有一下3种情况: 如果传入的是单参数且参数类型是一个List的时候,collection属性值为list 如果传入的是单参数且参数类型是一个array数组的时候collection的属性值为array 如果传入的参数是多个的时候,我们就需要把它们封装成一个Map了,当然单参数也可以封装成map,实际上如果你在传入参数的时候,在MyBatis里面也是会把它封装成一个Map的,map的key就是参数名,所以这个时候collection属性值就是传入的List或array对象在自己封装的map里面的key

    <select id="dynamicForeachTest" resultType="Blog">  
        select * from t_blog where id in  
        <foreach collection="list" index="index" item="item" open="(" separator="," close=")">  
            #{item}  
        </foreach>  
    </select>  

© 著作权归作者所有

共有 人打赏支持
今晚打-老虎
粉丝 0
博文 24
码字总数 5568
作品 0
嘉定
程序员
私信 提问
Mybatis配置文件详解(4)

本次主要来了解: MyBatis数据库配置文件SqlMapConfig.xml SQL映射配置中输入映射的配置 SQL映射配置中输出映射的配置 SQL映射配置中动态SQL语句的配置 1. SqlMapConfig配置文件详解 主要来配...

LeaveStyle
2018/08/30
0
0
MyBatis动态SQL(认真看看, 以后写SQL就爽多了)

作者:阿进的写字台 cnblogs.com/homejim/p/9909657.html 0 一起来学习 mybatis PRIMARY KEY ()) ENGINE=InnoDB AUTOINCREMENT=7 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb40900aici COMMENT=......

程序员小灰
02/21
0
0
Mybatis(三)动态sql

当我们使用传统JDBC方法去写复杂的SQL语句的时候,需要去进行大量的拼接。常常会因为一个小错误如少写了一个空格导致错误,而且还很难找出错误的原因,Mybatis的动态SQL功能正是为了解决这些...

什么都不懂的小石
2017/12/03
0
0
MyBatis常用SQL语句整理笔记

最近使用Mybatis作为持久层框架,自然/动态sql写得也比较多了,最常见的就是在查询语句中使用if标签来动态地改变过滤条件。 Mybatis强大特性之一就是它的动态sql,免除了拼接sql带来的各种麻...

6pker
2015/09/15
1K
0
在使用ibatis实现多条件模糊查询的语句

大家一般能想到的做法是,将String语句进行拼串例如: String sql1="select * from 表名where"; String sql2="条件1"; String sql3="条件2"; String sql4="条件3"; ...... String sqln="条件n......

xinlll
2012/10/23
0
0

没有更多内容

加载失败,请刷新页面

加载更多

C++随笔(四)Nuget打包

首先把自己编译好的包全部准备到一个文件夹 像这样 接下来新建一个文本文档,后缀名叫.nuspec 填写内容 <?xml version="1.0"?><package xmlns="http://schemas.microsoft.com/packaging/201......

Pulsar-V
55分钟前
2
0
再谈使用开源软件搭建数据分析平台

三年前,我写了这篇博客使用开源软件快速搭建数据分析平台, 当时收到了许多的反馈,有50个点赞和300+的收藏。到现在我还能收到一些关于dataplay2的问题。在过去的三年,开源社区和新技术的发...

naughty
今天
3
0
Python3的日期和时间

python 中处理日期时间数据通常使用datetime和time库 因为这两个库中的一些功能有些重复,所以,首先我们来比较一下这两个库的区别,这可以帮助我们在适当的情况下时候合适的库。 在Python文...

编程老陆
今天
2
0
分布式面试整理

并发和并行 并行是两个任务同时进行,而并发呢,则是一会做一个任务一会又切换做另一个任务。 临界区 临界区用来表示一种公共资源或者说是共享数据,可以被多个线程使用,但是每一次,只能有...

群星纪元
今天
3
0
手机通过wifi遥控arduino

手机下载Blinker 从Blinker官网下载手机App,安装到手机。 手机连接WiFi。 点击我的设备右上角的"+"添加设备,选择Arduino -> wifi接入,复制密钥以备后续使用。 点击新建的设备,可以在新界...

davidwbnu
昨天
4
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部