什么是动态SQL?

MyBatis的强大之处便是它的动态SQL,如果你使用JDBC那么在根据不同条件查询时,拼接SQL语句是多么的痛苦。 比如查询一个学生信息,可以根据学生的姓名,性别,班级,年龄,学历等信息来查询,并且多个条件可以任意组合。 而MyBatis中集成了非常强大的 OGNL表达式,可以帮助我们解决这个问题。

if标签

if标签作为mybatis动态sql中的条件判断,它可以判断你是否传入某个字段的值以决定你是否执行这条sql语句。

<select id="selectIf" parameterType="Map" resultMap="Employee">
select * from tal_employee where 1=1
<if test="lastName!=null and lastName!=''">
and last_name=#{lastName},
</if>
<if test="email!=null and email!=''">
and email=#{email},
</if>
<if test="gender!=null and gender!=''">
and gender=#{gender},
</if>
</select>

使用IF标签可以完成我们的动态sql语句并且,我们很多时候可能判断这个的时候却又不判断那个,我们只好分成几个方法写,有了这个if标签我们就可以很好根据业务需求完成自己的语句拼接合并成一个方法。

where标签

where标签可以替代if和choose标签,不需要添加多余的where 1=1条件。当where中的条件没有一个满足时,不输出where关键字。如果条件满足,会去掉第一个开头的and或者or。

<select id="findAll" resultMap="Employee" parameterType="Map">
select * from tal_employee
<!-- 使用where会去除前面 and/or -->
<where>
<if test="lastName!=null and lastName!=''">
and last_name=#{lastName}
</if>
<if test="email!=null and email!=''">
and email=#{email}
</if>
<if test="gender!=null and gender!=''">
and gender=#{gender}
</if>
</where>
</select>

choose标签

有些时候,我们不想用到所有的条件语句,而只想从中择其一二。 choose标签为Mybatis中的提供多重条件判断,使用when和otherwise标签进行条件判断,多个条件中只有一个被执行。

<select id="chooseTest" parameterType="Map" resultMap="Employee">
select * from tal_employee
<choose>
<when test="lastName != null and lastName != ''">
and last_name like concat('%',#{lastName},'%')
</when>
<when test="gender != null and gender != ''">
and gender = #{gender}
</when>
<!-- 如果上面两个条件不成立,那么会选择otherwise标签相当于ifelse -->
<otherwise>
and id = #{id}
</otherwise>
</choose>
</select>

set标签

set标签主要用于在update更新值时,动态添加更新的列,如果列没有值则不添加。避免使用多余的,号。

<update id="update" parameterType="Map">
update tal_employee
<!-- 使用set会去除末尾逗号 -->
<set>
<if test="lastName!=null and lastName!=''">
last_name=#{lastName},
</if>
<if test="email!=null and email!=''">
email=#{email},
</if>
<if test="gender!=null and gender!=''">
gender=#{gender},
</if>
</set>
where id = #{id}
</update>

有了set这个标签就想指定更新那个字段就是那个字段,高端大气上档次。

trim标签

where默认是将第一个的and或者or去掉,set是将更新中的,去掉,如果用户想自定义一些规则,则需要使用另外一个自定义标签<trim>。

<!-- 替代set标签 -->
<trim prefix="set" suffixOverrides=",">
<if test="lastName!= null"></if>
</trim>
<!-- 替代where标签 -->
<trim prefix="where" prefixOverrides="and|or">
<if test="lastName!= null"></if>
</trim>

foreach标签

foreach标签这个标签是用来迭代我们的集合对象,它支持list,array,map。它有属性:

collection:循环集合或指定类型

item:每次迭代的结果

separator:设置分隔符

open:开始符号(前缀)可选

close:结束符号(后缀)可选

index:list和数据的序号,可选

<select id="manyID" parameterType="List" resultMap="Employee">
select * from tal_employee where id
in
<foreach collection="list" item="id" open="(" close=")"
separator=",">
#{id}
</foreach>
</select>

SQL标签

用来定义常量,通过include来引用

<sql id="select">
select * from tal_employee
</sql>
<select id="findAll" resultMap="Employee">
<!--select * from tal_employee -->
<!-- 引入已经定义好的sql -->
<include refid="select"></include>
</select>

Mybaits动态Sql的更多相关文章

  1. JAVA框架 Mybaits 动态sql

    动态sql 一:if标签使用: 我们在查询的时候,有时候由于查询的条件的不确定性,导致where的后面的条件的不同,这时候就需要我们进行where后面的条件进行拼接. Mapper配置文件: < ...

  2. mybaits动态SQL中的DECIMAL

    数据库:mysql数据库字段类型:decimal(11,2)java程序类型:java.math.BigDecimal 使用mybatis的动态语句 <if test ="money! ...

  3. MyBaits动态sql语句

    1 在接口中书写方法 public interface EmployeeMapperDynamicSQL { public List<Employee> getEmpsTestInnerP ...

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

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

  5. [刘阳Java]_MyBatis_动态SQL标签用法_第7讲

    1.MyBatis的动态SQL是基于OGNL表达式的,它可以帮助我们方便的在SQL语句中实现某些逻辑. 2.MyBatis中用于实现动态SQL的元素主要有 if choose(when,otherwi ...

  6. Mybatis解析动态sql原理分析

    前言 废话不多说,直接进入文章. 我们在使用mybatis的时候,会在xml中编写sql语句. 比如这段动态sql代码: <update id="update" parame ...

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

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

  8. 自己动手实现mybatis动态sql

    发现要坚持写博客真的是一件很困难的事情,各种原因都会导致顾不上博客.本来打算写自己动手实现orm,看看时间,还是先实现一个动态sql,下次有时间再补上orm完整的实现吧. 用过mybatis的人,估计 ...

  9. mybatis 动态sql和参数

    mybatis 动态sql 名词解析 OGNL表达式 OGNL,全称为Object-Graph Navigation Language,它是一个功能强大的表达式语言,用来获取和设置Java对象的属性, ...

随机推荐

  1. python序列化

    一. 序列化 1 定义: 在我们存储数据或者⽹网络传输数据的时候. 需要对我们的对象进⾏行行处理理. 把对象处理理成 ⽅方便便存储和传输的数据格式. 这个过程叫序列列化. 不同的序列列化, 结果也不同 ...

  2. excel数据有隐藏字符导致正则校验不通过

    问题现象: 原因: 肉眼看不出任何问题,实际原因“有问题的”待校验字符串第一个单引号和第一个数字之间有个不可见字符 (注:Chrome控制台.常见编辑器定位光标 “Backspace退格删除”时,第一 ...

  3. Axure8破解码

    升级了 8.0.0.3321 版本后,原来的 license 失效了,解决方法就是使用下面的这组注册码 License:米 业成 (STUDENT)Key:nFmqBBvEqdvbiUjy8NZiyW ...

  4. 迅为-i.MX6Q核心板_四核工业级

    飞思卡尔Freescale Cortex A9 四核处理器处理器:CPU Freescale Cortex-A9 四核 i.MX6Q,主频 1.2 GHz 核心板工艺:十层设计,沉金工艺基本参数:内存 ...

  5. oracle查询语句 select a||','||b||','||c from table where a in('m','n')

    查询table表中 字段a = m 或 n 时,a列,b列,c列的值,并且这三列之间用 ","(逗号)分割. 追问:连接符的作用呢?就是显示的时候链接abc和中间的逗号么?追答:| ...

  6. Bagging, Boosting, Bootstrap

    Bagging 和 Boosting 都属于机器学习中的元算法(meta-algorithms).所谓元算法,简单来讲,就是将几个较弱的机器学习算法综合起来,构成一个更强的机器学习模型.这种「三个臭皮 ...

  7. 【运维】浪潮服务器一块硬盘显示红色Offline(或者Failed)解决办法

    [写在前面]           最近服务器不知道为什么总是出现故障,以前戴尔服务器硬盘出现故障,也就是说硬盘旁边的灯显示为红色的时候,一般情况下都是表示硬盘坏掉了,直接买一块新的硬盘,将坏掉的硬盘拿 ...

  8. 很清晰的解读i2c协议【转】

    转自:https://blog.csdn.net/weixin_41718085/article/details/79376823 转载:http://dpinglee.blog.163.com/bl ...

  9. logging模块--日志文件

    初级的使用配置模式类似与print 默认打印waring等级及以上--通过更改等级来测试代码 logging.debug("debug no china") #调试模式 loggi ...

  10. Anaconda安装新模块

    如果使用import导入的新模块没有安装,则会报错,下面是使用Anaconda管理进行安装的过程:1.打开Anaconda工具,如图: 2.可通过输入 conda list 查看已安装的模块 3.如果 ...