MyBatis 的强大特性之一便是它的动态 SQL。动态 SQL 元素和 JSTL 或基于类似 XML 的文本处理器相似。在 MyBatis 之前的版本中,有很多元素需要花时间了解。MyBatis 3 大大精简了元素种类,现在只需学习原来一半的元素便可。MyBatis 采用功能强大的基于 OGNL 的表达式来淘汰其它大部分元素。

1.if标签

映射文件配置:

  	<select id="query" resultMap="baseMap" parameterType="user">
select * from t_user
<!-- 这里的1=1方便测试 -->
where 1=1
<!-- 条件if标签通过判断name参数是否为空决定是否使用这个SQL语句 -->
<if test="name!=null" >
and name=#{name}
</if>
</select>

测试代码name=null的情况下:

@Test
public void test() {
List<User> list = mapper.query(new User());
for (User user : list) {
System.err.println("在name=null的情况下"+user);
}
}

测试结果:



测试代码name!=null的情况下:

@Test
public void test() {
User testUser = new User();
testUser.setName("zhangsan");
List<User> list = mapper.query(testUser);
for (User user : list) {
System.err.println("在name=null的情况下"+user);
}
}

2. choose,when,otherwise

choose选择语句,差不多等同于java语句中的switch语句。通过创建多个标签元素来选择符合要求的元素。when表示在满足某种情况下调用该内容,otherwise表示在所有情况都不满足的情况下调用的内容。

配置标签代码使用方式:

<select id="query" resultMap="baseMap" parameterType="user">
select * from t_user
where 1=1
<!-- 如果满足其中的条件就调用其中的SQL语句 -->
<choose>
<when test="no!=null">
and no=#{no}
</when>
<when test="name!=null">
and name=#{name}
</when>
<otherwise>
<if test="age!=null" >
and age=#{age}
</if>
</otherwise>
</choose>
</select>

3.where

上述配置代码中为了方便测试我都在where后面添加1=1来方便测试,但是有时候我们对where是否使用也需要动态决定。这个时候就可以使用where标签来解决这个问题。

<select id="queryById" resultType="user" parameterType="int">
select *
from t_user
<where>
<if test="no!=null" >
no=#{no}
</if>
</where>
</select>

这里满足条件就会自动添加where并调用其中的SQL代码。

4.set

set标签主要用于SQL更新UPDATE代码中,用法如下代码:

<update id="update" parameterType="user">
update t_user
<!-- 通过set来动态设置更新的参数 -->
<set>
<if test="name!=null">name=#{name}</if>
<if test="age!=null">age=#{age}</if>
</set>
where no = #{no}
</update>

5.trim

trim标签是一个格式化标签,可以用来代替set或者where标签的功能。具体用法如下代码:

<update id="update" parameterType="user">
update t_user
<!-- <set>
<if test="name!=null">name=#{name}</if>
<if test="age!=null">age=#{age}</if>
</set> -->
<!-- prefix表示调用SQL语句时在最前面添加的前缀
prefixOverrides表示调用SQL语句时去掉的第一个指定内容
suffix表示调用SQL语句时在最后面添加的后缀
suffixOverride表示调用SQL语句时去掉的最后一个指定内容
-->
<trim prefix="set" prefixOverrides="and | or">
<if test="name!=null"> and name=#{name}</if>
<if test="age!=null"> or age=#{age}</if>
</trim>
where no = #{no}
</update>

通过这个trim获得了跟set一样的效果,不过更具有灵活性。

MyBatis动态SQL(一)的更多相关文章

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

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

  2. 9.mybatis动态SQL标签的用法

    mybatis动态SQL标签的用法   动态 SQL MyBatis 的强大特性之一便是它的动态 SQL.如果你有使用 JDBC 或其他类似框架的经验,你就能体会到根据不同条件拼接 SQL 语句有多么 ...

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

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

  4. Mybatis动态SQL单一基础类型参数用if标签

    Mybatis动态SQL单一基础类型参数用if标签时,test中应该用 _parameter,如: 1 2 3 4 5 6 <select id="selectByName" ...

  5. 超全MyBatis动态SQL详解!( 看完SQL爽多了)

    MyBatis 令人喜欢的一大特性就是动态 SQL. 在使用 JDBC 的过程中, 根据条件进行 SQL 的拼接是很麻烦且很容易出错的. MyBatis 动态 SQL 的出现, 解决了这个麻烦. My ...

  6. Mybatis动态SQL简单了解 Mybatis简介(四)

    动态SQL概况 MyBatis 的强大特性之一便是它的动态 SQL 在Java开发中经常遇到条件判断,比如: if(x>0){ //执行一些逻辑........ }   Mybatis应用中,S ...

  7. mybatis原理分析学习记录,mybatis动态sql学习记录

    以下个人学习笔记,仅供参考,欢迎指正. MyBatis 是支持定制化 SQL.存储过程以及高级映射的持久层框架,其主要就完成2件事情: 封装JDBC操作 利用反射打通Java类与SQL语句之间的相互转 ...

  8. mybatis 动态sql和参数

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

  9. MyBatis动态SQL之一使用 if 标签和 choose标签

    bootstrap react https://segmentfault.com/a/1190000010383464 xml 中 < 转义 to thi tha <if test=&qu ...

  10. MyBatis动态SQL(认真看看, 以后写SQL就爽多了)

    目录 0 一起来学习 mybatis 1 数据准备 2 if 标签 2.1 在 WHERE 条件中使用 if 标签 2.1.1 查询条件 2.1.2 动态 SQL 2.1.3 测试 2.2 在 UPD ...

随机推荐

  1. Cors之带凭据的请求

    带凭据的请求 默认情况下,跨源请求不提供凭据.通过将withCredentials属性设置为true,可以制定某个请求应该发送凭据.

  2. 纪念——代码首次达到近50K(更新:78.8K 2019行)

    #include<bits/stdc++.h> #define re register #define F(A) for(re int (A)=1;(A)<=8;++(A)) usi ...

  3. spring boot自动配置之jdbc(转)

    1.DataSource配置 1.1 默认配置application.xml spring.datasource.url=jdbc:mysql://localhost/test spring.data ...

  4. eclipse svn提交忽略文件及文件夹,ignore设置无效..

    如果之前提交过此文件,就不能设置忽略该文件了.所以第一次提交的时候要搞清楚再提交. [亲测,的确如此,用 Windows -> Preferences -> Team -> Igno ...

  5. Redhat/Fedora 或类似系统, 配置网络的工具介绍

    在Redhat早期的版本中, 有linuxconf .redhat-config-network .netconfig 等工具: 在Redhat/Fedora 最新的版本有 system-config ...

  6. (转)Json在Unity中的简单使用

    Json数据解析在Unity3d中的应用 最近做项目过程中因为Json文件名写错了一个字母Unity报错,找错误找到半夜,当时为了验错,写了一个小Demo,正好借此总结一下Json. 1.什么是Jso ...

  7. Leetcode49. Group Anagrams字母异位词分组

    给定一个字符串数组,将字母异位词组合在一起.字母异位词指字母相同,但排列不同的字符串. 示例: 输入: ["eat", "tea", "tan&quo ...

  8. 【每日一linux命令7】用户及用户组

    一.查询用户及用户组相关命令 1.whoami 查询当前登录的用户名 2.groups 查询当前登录用户名所在的用户组 3.groups root 查询root用户名所在的用户组 二.怎么批量查看用户 ...

  9. LUOGU P1512 伊甸园日历游戏

    题目描述 Adam和Eve玩一个游戏,他们先从1900.1.1到2001.11.4这个日期之间随意抽取一个日期出来.然后他们轮流对这个日期进行操作: 1 : 把日期的天数加1,例如1900.1.1变到 ...

  10. Node.js概述1

    为什么我们要学习Node.js? 认为: Node.js就学习一周,时间比较短,不重要 将来工作我后端又不用Node.js做,我们又java/python/php/c,为什么要在意它 Node.js接 ...