1 MyBatis动态SQL之综述和 if 语句
摘要:使用 MyBatis 动态SQL,通过 if, choose, when, otherwise, trim, where, set, foreach和bind等标签,可组合成非常灵活的SQL语句,从而既提高 SQL 语句的准确性,也大大提高攻城狮的开关效率。
1 MyBatis动态SQL之if 语句
2 MyBatis动态sql之where标签|转
3 MyBatis动态SQL之set标签|转
4 MyBatis动态SQL之trim元素|转
5 MyBatis动态sql中foreach标签的使用
6 MyBatis动态SQL之choose(when、otherwise)语句
7 MyBatis动态SQL之bind标签|转
综述
动态 SQL 是 MyBatis 的强大特性之一。如果你使用过 JDBC 或其它类似的框架,你应该能理解根据不同条件拼接 SQL 语句有多痛苦,例如拼接时要确保不能忘记添加必要的空格,还要注意去掉列表最后一个列名的逗号。利用动态 SQL,可以彻底摆脱这种痛苦。
使用动态 SQL 并非一件易事,但MyBatis 3 基于功能强大的 OGNL 表达式借助可用于任何 SQL 映射语句中的、强大的动态 SQL 语言,显著地提升了这一特性的易用性。
OGNL,全称为Object-Graph Navigation Language,它是一个功能强大的表达式语言,用来获取和设置Java对象的属性,它旨在提供一个更高的更抽象的层次来对Java对象图进行导航。
如果你之前用过 JSTL 或任何基于类 XML 语言的文本处理器,你对动态 SQL 元素可能会感觉似曾相识。MyBatis 3 常用的动态SQL元素包括:
- if
- where
- set
- trim
- foreach
- choose (when、otherwise)
下面我们就用一个简单示例来看看在MyBatis中怎么使用动态SQL。
定义表结果和实体类
首先,在数据库创建一个表tb_employee,并插入测试数据。SQL脚本如下:
CREATE TABLE tb_employee(
ID INT(11) PRIMARY KEY AUTO_INCREMENT,
loginname VARCHAR(18),
PASSWORD VARCHAR(18),
NAME VARCHAR(18) DEEAULT NULL,
SEX CHAR(2) DEEAULT NULL,
AGE INT(11) DEFAULT NULL,
phone VARCHAR(21),
sal DOUBLE,
state VARCHAR(18)
);
INSERT INTO tb_employee(loginname,PASSWORD,NAMB,sex,age,phone,sal,state
VALUES('jack','123456','楼兰胡杨",'男',26,'13900000001',9800,'ACTIVE');
INSERT INTO tb_employee (loginname,PASSWORD,NAMB,sex,age,phone,sal,state)
VALUES('rose','123456','Wiener','女',21,'13900000002',6800,'ACTIVE');
INSERT INTO tb_employee (loginname,PASSWORD,NAME,sex,age,phone,sal,state)
VALUES('tom','123456','汤姆','男',25,'13900000003,8800,'ACTIVE');
INSERT INTO tb_employee (loginname,PASSWORD,NAME sex,age,phone,sal,state)
VALUES('alice','123456','爱丽丝','女’,20,'13900000004,5800,ACTIVE');
在数据库中执行SQL 脚本,完成创建tb_employee的操作。用实体类Employee映射tb_employee表。tb_employee 和 mployee将贯穿动态SQL所有章节。
if语句
动态SQL通常会做的事情是有条件地包含where子句的一部分。比如:
<select id="selectEmployeeById" resultType="cn.mybatis.domain.Employee">
SELECT * FROM tb_employee WHERE state = 'ACTIVE'
<!-- 可选条件,如果传进来的参数有id属性,则加上id查询条件-->
<if test="id != null">
and id = #{id}
</if>
</select>
假设在上述SQL中查询条件id的值不为null,那么控制台打印出来的SQL为:
SBLECT * EROM tb_employee WHERE state = 'ACTIVE' and id = ?
以上语句提供了一个可选的、根据id查找Employee的功能。如果没有传入id,那么所有处于“ACTIVE”状态的Employee都会被返回; 反之若传入了id,那么就会把查找id内容的Employee结果返回。如果想通过两个条件搜索该怎么办呢? 很简单,只要多加入一个条件即可,例如:
<select id="selectEmployeeByIdLike" resultType="cn.mybatis.domain.Employee">
SELECT * FROM tb_employee WHERE state = 'ACTIVE'
<!-- 可选条件,如果传进来的参数有id属性,则加上id查询条件-->
<if test="id != null">
and id = #{id}
</if>
<!-- 两个可选条件,例如登录功能的登录名和密码查询-->
<if test="loginname != null and password != null">
and loginname = #{loginname} and password = #{password)
</if>
</select>
可以使用两个等于号==判断id等于null的场景,if语句示例如下:
<if test="id == null">
如果不使用if语句,则其SQL脚本如下:
<select id="selectByName" resultType="cn.mybatis.domain.Employee">
<!-- 这和普通的sql 查询语句十分相似 -->
select * from tb_employee WHERE state = 'ACTIVE'and id = #{id} and loginname=#{loginname} and password=#{password}
</select>
我们从上面的查询语句可以发现,如果 #{loginname} 为空,那么查询结果也是空,使用起来缺乏灵活性,而动态SQL完全不畏惧这个。这就是动态SQL的长处之所在。
Reference
1 MyBatis动态SQL之综述和 if 语句的更多相关文章
- mybatis实战教程(mybatis in action)之八:mybatis 动态sql语句
mybatis 的动态sql语句是基于OGNL表达式的.可以方便的在 sql 语句中实现某些逻辑. 总体说来mybatis 动态SQL 语句主要有以下几类:1. if 语句 (简单的条件判断)2. c ...
- 9.mybatis动态SQL标签的用法
mybatis动态SQL标签的用法 动态 SQL MyBatis 的强大特性之一便是它的动态 SQL.如果你有使用 JDBC 或其他类似框架的经验,你就能体会到根据不同条件拼接 SQL 语句有多么 ...
- 自己动手实现mybatis动态sql
发现要坚持写博客真的是一件很困难的事情,各种原因都会导致顾不上博客.本来打算写自己动手实现orm,看看时间,还是先实现一个动态sql,下次有时间再补上orm完整的实现吧. 用过mybatis的人,估计 ...
- Mybatis动态SQL单一基础类型参数用if标签
Mybatis动态SQL单一基础类型参数用if标签时,test中应该用 _parameter,如: 1 2 3 4 5 6 <select id="selectByName" ...
- 超全MyBatis动态SQL详解!( 看完SQL爽多了)
MyBatis 令人喜欢的一大特性就是动态 SQL. 在使用 JDBC 的过程中, 根据条件进行 SQL 的拼接是很麻烦且很容易出错的. MyBatis 动态 SQL 的出现, 解决了这个麻烦. My ...
- Mybatis动态SQL简单了解 Mybatis简介(四)
动态SQL概况 MyBatis 的强大特性之一便是它的动态 SQL 在Java开发中经常遇到条件判断,比如: if(x>0){ //执行一些逻辑........ } Mybatis应用中,S ...
- mybatis原理分析学习记录,mybatis动态sql学习记录
以下个人学习笔记,仅供参考,欢迎指正. MyBatis 是支持定制化 SQL.存储过程以及高级映射的持久层框架,其主要就完成2件事情: 封装JDBC操作 利用反射打通Java类与SQL语句之间的相互转 ...
- mybatis 动态sql和参数
mybatis 动态sql 名词解析 OGNL表达式 OGNL,全称为Object-Graph Navigation Language,它是一个功能强大的表达式语言,用来获取和设置Java对象的属性, ...
- MyBatis动态SQL之一使用 if 标签和 choose标签
bootstrap react https://segmentfault.com/a/1190000010383464 xml 中 < 转义 to thi tha <if test=&qu ...
- 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 ...
随机推荐
- 跨平台Windows和Linux(银河麒麟)操作系统OCR识别应用
1 运行效果 代码下载链接: https://pan.baidu.com/s/1NUfLTjk6kzXJKsaH7yo4qA?pwd=rk5c 提取码: rk5c. 在银河麒麟桌面操作系统V10(SP ...
- wordpress无法显示gitee图床的图片
wordpress无法显示gitee图床的图片 Question:如题 Solution:是防盗链的问题,gitee官网给出了防盗链的方法,而github貌似没有. Reference:你已经是个成熟 ...
- Golang入门:Linux上的go语言安装与配置
Tips:本文以本文撰写时的 Go 语言最新版本,也就是 go.1.19.2 版本为例. Linux 发行版本使用 Ubuntu 22.04.1 LTS 为例来做演示. 安装 C 工具 Go 的工具链 ...
- 手写Rpc框架-1
手写Rpc框架 - 导读 git仓库-all-rpc GTIEE:https://gitee.com/quercus-sp204/all-rpc [参考源码 yrpc] 1. Rpc概念 RPC 即远 ...
- [源码系列:手写spring] AOP第一节:切点表达式
在本专栏之前的文章中已经带大家熟悉了Spirng中核心概念IOC的原理以及手写了核心代码,接下来将继续介绍Spring中另一核心概念AOP. AOP即切面编程是Spring框架中的一个 ...
- 第10章面向对象编程(高级部分)-cnblog
类变量与类方法 static修饰的成员变量(类变量,静态变量)的特性? 同一个类所有对象共享 类变量是随着类的加载而创建, 所以即使没有创建对象实例也可以访问 ,但是类变量的访问, 必须遵守 相关的访 ...
- git库移植
记一次个人项目移植到组织项目的git应用,留爪. 1. 首先保证你本地有一份完整的库 2. 在 gitee 组织里新建一份裸库 3. 本地库移除所有远程库 git remote //查看所有远程库 g ...
- Go初入武林之乘法表
为统一管理源码, 请到gitee中查看. GoTimesTable
- 关于TFDMemtable的使用场景【3】处理数据
原因很多: 1.通过TFDMemtable处理数据时,避免影响数据感知 2.处理速度很快. ------------------------------ 从Tdataset读取数据: Procedur ...
- Win10锁屏与关机相关设置-注册表
禁用锁屏 HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Authentication\LogonUI\SessionData ...