iBatis第四章:动态SQL的用法
一、什么是动态SQL,以及使用动态SQL的好处
所谓动态SQL,是针对静态SQL而言的,静态SQL的SQL语句是固定的,使用动态SQL是为了增强SQL的灵活性和复用性,可以用一个动态SQL达到在不同条件下执行不同的SQL语句的效果,如果不用动态SQL,我们可能需要使用几个不同的SQL语句才能达到目的,但是使用动态SQL,只需要一个SQL就可以实现。
例如下面是一个动态SQL的例子:
select * from t_user
<dynamic prepend="where">
<isNull property="id">
id is null
</isNull>
<isNotNull>
id = #id#
</isNotNull>
</dynamic>
上面的SQL语句会根据调用这个SQL语句的入参来组装成不同的SQL语句,当id为null时,其语句如下:
select * from t_user where id is null
当id不为null时,其SQL语句如下:
select * from t_user where id = #id#
由此可见,我们通过一个动态SQL就达到了两个静态SQL的目的,分别处理了两种不同的情况,这就是动态SQL的好处。
注意:在数据库中,查询值为null的情况不能用=来处理,例如select * from t_user where id is null和select * from t_user where id = ''是不同的!
二、如何使用动态SQL
iBatis 为我们处理动态SQL提供了一组相应的标签,我们只需要使用者一套动态标签就可以享受动态SQL带给我们的便利之处了。下面分别讨论 iBatis 的动态标签,它分为5大类:
1、<dynamic>标签
2、二元标签
3、一元标签
4、参数标签
5、<iterate>标签
在讨论这些动态标签之前,我们先说明一下,有一些标签的属性是共享的,例如 prepend、open、close等这几个属性。其中prepend表示添加前缀、open和close分别表示开始和结尾,后面例子详细说明。
-----------------1、<dynamic>标签
<dynamic>是动态标签的最顶层标签,也就是说它不能嵌套,它用来划分一个动态SQL片段。
其属性如下:
prepend:前缀
open:以XX开始
close:以XX结束
示例:
<select id="select_stulist" parameterClass="com.test.bean.Student" resultClass="com.test.bean.Student">
select id,name,sex from t_stu
<dynamic prepend="where">
<isNotNull property="sex">
sex = #sex#
</isNotNull>
</dynamic>
</select>
/**
* 测试动态标签 <dynamic>
*/
private void testDynamic(){
SqlMapClient sqlMapClient = BaseDAO.getInstance();
Student student = new Student();
try {
student.setSex("女");
List<Student> stuList = sqlMapClient.queryForList("select_stulist", student);
if(stuList != null && stuList.size()>0){
for(Student stu:stuList){
System.out.println(stu.getName()+" "+stu.getSex());
}
}
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
动态标签的好处就是可以根据我们的参数不同实现不同的 sql查询功能。
-----------------2、二元标签
二元标签的作用就是将我们的参数同另外一个值或者参数进行比较,如果结果为true,则包含二元标签内的内容,否则就不包含。
常用的二元标签如下:
<isEqual> 用于比较值是否相同
<isNotEqual> 用于比较值是否不同
<isGreaterThan> 比较值是否大于
<isGreaterEqual> 比较值是否大于等于
<isLessThan> 比较值是否小于
<isLessEqual> 比较值是否小于等于
二元标签的常用属性:
property:指定需要比较的属性
compareProperty:指定需要与property比较的属性
compareValue:指定一个静态值,用于同property的属性值比较【注意compareProperty和compareValue必须指定其中一个】
prepend:前缀作用
open:以XX开始
close:以XX结束
示例:
<typeAlias alias="student" type="com.test.bean.Student"></typeAlias>
<!-- 测试 二元 标签 :如果入参性别为男 则查询编号大于给定值的学生信息-->
<select id="select_stulist1" parameterClass="student" resultClass="student">
select id,name,sex from t_stu
<dynamic prepend="where">
<isEqual property="sex" compareValue="男">
id > #id#
</isEqual>
</dynamic>
</select>
private void testBinaryTag(){
SqlMapClient sqlMapClient = BaseDAO.getInstance();
Student student = new Student();
try {
student.setId(2);
student.setSex("男");
List<Student> stuList = sqlMapClient.queryForList("select_stulist1", student);
if(stuList != null && stuList.size()>0){
for(Student stu:stuList){
System.out.println(stu.getId()+"______"+stu.getName()+" "+stu.getSex());
}
}
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
二元标签可以用我们的入参与给定值进行比较。满足根据是否满足一定条件来生成不同的SQL。
-----------------3、一元标签
一元标签用于参考入参的某个属性是否满足一定条件,如果满足,则包含标签内的内容,否则忽略标签体得内容。
常用一元标签:
<isNull> 确定所指定的字段是否为null
<isNotNull> 确定所指定的字段是否不为null
<isEmpty> 确定所指定的字段是否为null、或者" "、以及是否为空的集合
<isNotEmpty> 确定所指定的字段是否不为null、或者不为" "、以及是否不为空的集合
<isPropertyAvailable> 是否存在所指定的字段,对于Bean它寻找属性,对于集合它寻找键值
<isNotPropertyAvailable> 与上面相反
一元标签常用属性:
property:指定需要比较的属性
prepend:前缀作用
open:以XX开始
close:以XX结束
示例:
<typeAlias alias="student" type="com.test.bean.Student"></typeAlias>
<!-- 测试 一元 标签 -->
<select id="select_stulist2" parameterClass="student" resultClass="student">
select id,name,sex from t_stu
<dynamic prepend="where">
<isNotNull property="sex">
sex = #sex#
</isNotNull>
</dynamic>
</select>
private void testUnaryTag(){
SqlMapClient sqlMapClient = BaseDAO.getInstance();
Student student = new Student();
try {
//如果性别不为null,则查询指定性别的数据
student.setSex("女");
List<Student> stuList = sqlMapClient.queryForList("select_stulist2", student);
if(stuList != null && stuList.size()>0){
for(Student stu:stuList){
System.out.println(stu.getId()+"______"+stu.getName()+" "+stu.getSex());
}
}
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
-----------------4、参数标签
参数标签用于检查某个参数是否传递进来了,主要有下面两个标签:
<isParameterPresent>和<isNotParameterPresent> ,这个不常用,了解即可。以后用到在做详细学习。
-----------------5、<iterate>标签
<iterate>允许一个集合或者数组作为一个属性传递到映射语句,我们通过遍历这个集合或者数组,得到一个具体的SQL。它仅有<iterate>这个个标签,主要有如下几个属性:
property:指定需要比较的属性
prepend:前缀作用
open:以XX开始
close:以XX结束
<conjunction>: 用于连接集合或者数组产生的SQL的字符或者符号。
示例:
<typeAlias alias="student" type="com.test.bean.Student"></typeAlias>
<!-- 测试 iterate标签 -->
<select id="select_stulist3" parameterClass="student" resultClass="student">
select id,name,sex from t_stu
<dynamic prepend="where name in">
<iterate property="names" open="(" close=")" conjunction=",">
#names[]#
</iterate>
</dynamic>
</select>
private void testIterateTag(){
SqlMapClient sqlMapClient = BaseDAO.getInstance();
Student student = new Student();
try {
List<String> names = new ArrayList<String>();
names.add("修改后的姓名");
names.add("新增学生测试");
student.setNames(names);
List<Student> stuList = sqlMapClient.queryForList("select_stulist3", student);
if(stuList != null && stuList.size()>0){
for(Student stu:stuList){
System.out.println(stu.getId()+"______"+stu.getName()+" "+stu.getSex());
}
}
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
iBatis第四章:动态SQL的用法的更多相关文章
- [刘阳Java]_MyBatis_动态SQL标签用法_第7讲
1.MyBatis的动态SQL是基于OGNL表达式的,它可以帮助我们方便的在SQL语句中实现某些逻辑. 2.MyBatis中用于实现动态SQL的元素主要有 if choose(when,otherwi ...
- mybatis学习笔记四(动态sql)
直接贴图,注解在代码上,其他的配置文件在学习一中就不贴了 1 数据库 2 实体类 package com.home.entity; /** * 此类是: 用户实体类 * @author hpc * @ ...
- 【转载】 mybatis入门系列四之动态SQL
mybatis 详解(五)------动态SQL 目录 1.动态SQL:if 语句 2.动态SQL:if+where 语句 3.动态SQL:if+set 语句 4.动态SQL:choose(when, ...
- MyBatis学习 之 四、动态SQL语句
有些时候,sql语句where条件中,需要一些安全判断,例如按某一条件查询时如果传入的参数是空,此时查询出的结果很可能是空的,也许我们需要参数为空时,是查出全部的信息.使用Oracle的序列.mysq ...
- 数据库系统原理(第四章:SQL与关系数据库基本操作 )
一.SQL概述 sql是结构化查询语言(Structured Query Language,SQL)是专门用来与数 据库通信的语言,它可以帮助用户操作关系数据库. SQL的特点: SQL不是某个特定数 ...
- 第五章 动态SQL 批量操作
用于实现动态SQL的元素主要有 if trim where set choose(when.otherwise) foreach MyBatis 缓存 一级缓存 在test类中 调用相同的方法 第二 ...
- 第8章 动态SQL
8.1动态SQL中的元素 8.2<if>元素 举例,在映射文件中: <select id="findCustomerByNameAndJobs" paramete ...
- MyBatis入门(四)---动态SQL
一.创建数据库表 1.1.创建表 USE `mybatis`; /*Table structure for table `user` */ DROP TABLE IF EXISTS `user`; C ...
- mybatis四(动态sql)
<1><select id="selectUserByConditions" parameterType="user" resultType= ...
随机推荐
- DSAPI显示PNG异形窗体
使用DSAPI实现PNG异形窗体,注意,该窗体为层样式窗体,以PNG或32位带透明通道的图像合成到屏幕,此方法不会触发窗体的重绘,故原窗体(包括其子控件)均不会显示,如果需要更新画面,需要重新用代码等 ...
- TCP的三次握手与四次挥手
TCP的三次握手与四次挥手 一.TCP(Transmission Control Protocol 传输控制协议) TCP是面向对连接,可靠的进程到进程通信的协议 TCP是提供全双工服务,即数据可在同 ...
- WordPress怎样设置菜单栏旋转小图标
最近我在浏览别的博客的文章时,无意间发现了一个很好看的小装饰.那就是在WordPress菜单栏上的小图标.于是我研究了研究,弄到了设置方法之后决定把它分享出来. 菜单栏的小图标 设置步骤: 1, 我们 ...
- SpaceSyntax【空间句法】之DepthMapX学习:第一篇 数据的输入 与 能做哪些分析
两部分,1需要喂什么东西给软件,2它能干什么(输出什么东西在下一篇讲) 博客园/B站/知乎/CSDN @秋意正寒 转载请在头部附上源地址 目录:https://www.cnblogs.com/onsu ...
- DataPipeline丨瓜子二手车基于Kafka的结构化数据流
文 |彭超 瓜子大数据架构师 交流微信 | datapipeline2018 一.为什么选择Kafka 为什么选Kafka?鉴于庞大的数据量,需要将其做成分布式,这时需要将Q里面的数据分到许多机器 ...
- SqlServer中循环给多张表建立聚簇索引
缘由 因为在某个复(bian)杂(tai)需求中用到了170+张表进行查询,而且表中的数据过多,查起来缓慢.只能给这些表添加索引.但是,连表名也是无法确定的(无力吐槽). 解决方法 使用游标遍历查询出 ...
- pod command
pod 基础使用命令 创建Podfile文件 1 pod init 使用命令打开Podfile文件 1 open -a Xcode Podfile 搜索pod 库 1 pod search 库名 更新 ...
- Java Main参数解析(Args4j)
最近实现一个工具,Main函数会有很多参数,而且参数类型不同,为了统一解析,网上找到三方工具类Args4j,轻松搞定. 代码实例如下: 定义解析类: import java.io.File impor ...
- Pytorch实战1:线性回归(Linear Regresion)
GitHub代码练习地址:https://github.com/Neo-ML/MachineLearningPractice/blob/master/Pytorch01_LinearRegressio ...
- 【Git之旅】2.Git对象
1.块(blob)对象 (1)文件的每一个版本表示为一个块 (2)二进制大对象(binary large object)的缩写,是计算机领域的常用术语,用来指代某些可以包含任意数据的变量或文件,同时其 ...