9.动态SQL
动态 SQL,主要用于解决查询条件不确定的情况:在程序运行期间,根据用户提交的查 询条件进行查询。
提交的查询条件不同,执行的 SQL 语句不同。若将每种可能的情况均逐一 列出,对所有条件进行排列组合,
将会出现大量的 SQL 语句。此时,可使用动态 SQL 来解 决这样的问题。
动态 SQL,即通过 MyBatis 提供的各种标签对条件作出判断以实现动态拼接 SQL 语句。
这里的条件判断使用的表达式为 OGNL 表达式。常用的动态 SQL 标签有<if>、<where>、<choose/>、<foreach>等。
有一个有意思的发现是,MyBatis 的动态 SQL 语句,与 JSTL 中的语句非常相似
<mapper namespace="com.mybatis.dao.StudentDAO">
<!-- parameterType 可以省略 --> <!-- if标签 传入的是Student 对象,可以直接对它的属性进行判断 -->
<select id="selectStudentsIf" resultType="com.mybatis.model.Student">
select * from student where 1 = 1
<if test="name != null and name != ''">
and name like '%' #{name} '%'
</if>
<if test="age>0">
and age > #{age}
</if>
</select> <!-- where 标签 ,会帮你去掉 and, 但是不会帮你加上and-->
<select id="selectStudentsWhere" resultType="com.mybatis.model.Student">
select * from student
<where>
<if test="name != null and name != ''">
and name like '%' #{name} '%'
</if>
<if test="age>0">
and age > #{age}
</if>
</where>
</select> <!-- choose 标签 (switch) -->
<select id="selectStudentsChoose" resultType="com.mybatis.model.Student">
select * from student
<where>
<!-- choose标签 类似于 switch,多个when,就是多个case,只会执行一个when otherwise 相当于 default -->
<choose>
<when test="name != null and name != ''">
and name like '%' #{name} '%'
</when> <when test="age>0">
and age > #{age}
</when> <otherwise>
1 = 2
</otherwise>
</choose>
</where>
</select> <!-- 遍历Object[] ,Array 的 别名是 array ,所以 传入的参数是数组类型时,需使用别名 来指向 这个参数对象 -->
<select id="selectStudentsForeachArray" resultType="com.mybatis.model.Student">
select * from student
<if test="array != null and array.length > 0">
where id in
<foreach collection="array" item="id" open="(" separator="," close=")">
#{id}
</foreach>
</if>
</select> <!-- 遍历 List<Integer> List的别名 是 list,-->
<select id="selectStudentsForeachList" resultType="com.mybatis.model.Student">
select * from student
<if test="list != null and list.size > 0">
where id in
<foreach collection="list" item="id" open="(" separator="," close=")">
#{id}
</foreach>
</if>
</select> <!-- 遍历 List<Student> 遍历出来的一个一个Student ,#{} 可以读到对象的属性 -->
<select id="selectStudentsForeachList2" resultType="com.mybatis.model.Student">
select <include refid="selectColumns"></include> from student
<if test="list != null and list.size > 0">
where id in
<foreach collection="list" item="student" open="(" separator="," close=")">
#{student.id}
</foreach>
</if>
</select> <!-- 定义SQL 片段,以便其他SQL标签复用 好处:修改时可以统一修改,但是 可读性很差 -->
<sql id="selectColumns">
*
</sql> </mapper>
注意:在 mapper 的动态 SQL 中若出现大于号(>)、小于号(<)、大于等于号(>=),小于等 于号(<=)等符号,
最好将其转换为实体符号。否则,XML 可能会出现解析出错问题。
特别是对于小于号(<),在 XML 中是绝对不能出现的。否则,一定出错。(其他只是可能出错)

9.动态SQL的更多相关文章
- 值得注意的ibatis动态sql语法格式
一.Ibatis常用动态sql语法,简单粗暴用一例子 <select id="iBatisSelectList" parameterClass="java.util ...
- Mysql - 游标/动态sql/事务
游标这个在我目前的项目里面用的还不多, 但是其功能还是很强大的. 动态sql以前都没用过, 是跟着富士康(不是张全蛋的富土康哦)过来的同事学的. 还是挺好用的. 我的数据库方面, 跟他学了不少. 在此 ...
- MyBatis4:动态SQL
什么是动态SQL MyBatis的一个强大特性之一通常是它的动态SQL能力.如果你有使用JDBC或其他相似框架的经验,你就明白条件串联SQL字符串在一起是多么地痛苦,确保不能忘了空格或者在列表的最后的 ...
- 分享公司DAO层动态SQL的一些封装
主题 公司在DAO层使用的框架是Spring Data JPA,这个框架很好用,基本不需要自己写SQL或者HQL就能完成大部分事情,但是偶尔有一些复杂的查询还是需要自己手写原生的Native SQL或 ...
- MySQL存储过程动态SQL语句的生成
用Mysql存储过程来完成动态SQL语句,使用存储过程有很好的执行效率: 现在有要求如下:根据输入的年份.国家.节假日类型查询一个节假日,我们可以使用一般的SQL语句嵌入到Java代码中,但是执行效率 ...
- 【Java EE 学习 79 下】【动态SQL】【mybatis和spring的整合】
一.动态SQL 什么是动态SQL,就是在不同的条件下,sql语句不相同的意思,曾经在“酒店会员管理系统”中写过大量的多条件查询,那是在SSH的环境中,所以只能在代码中进行判断,以下是其中一个多条件查询 ...
- 自定义函数执行动态sql语句
--函数中不能调用动态SQL,使用用存储过程吧.如果还要对函数做其他操作,换成存储过程不方便,可以考虑把其他操作一起封装在存储过程里面.如: create proc [dbo].[FUN_YSCL ...
- mybatis入门基础(五)----动态SQL
一:动态SQL 1.1.定义 mybatis核心对sql语句进行灵活操作,通过表达式进行判断,对sql进行灵活拼接.组装. 1.2.案例需求 用户信息综合查询列表这个statement的定义使用动态s ...
- mybatis 动态sql表达式相关应用
一.mybatis 表达式简介 对于mybatis3 ,提供了一种动态sql的方式.通过动态sql我们可以直接在mybatis 的xm映射文件中直接通过条件判断的方式进行查询添加的拼接.mybatis ...
- (转)Mybatis高级映射、动态SQL及获得自增主键
原文:http://www.cnblogs.com/edwinchen/p/4105278.html?utm_source=tuicool&utm_medium=referral 一.动态SQ ...
随机推荐
- 增加github访问速度
转自:https://blog.csdn.net/qq_38977097/article/details/80770987 原因 为什么慢?github的CDN被某墙屏了. 解决方法 绕过dns解析, ...
- Qt编写自定义控件35-GIF录屏控件
一.前言 在平时的写作过程中,经常需要将一些操作动作和效果图截图成gif格式,使得涵盖的信息更全面更生动,有时候可以将整个操作过程和运行效果录制成MP4,但是文件体积比较大,而且很多网站不便于上传,基 ...
- Python描述性统计numpy
import numpy as np import pandas as pd import matplotlib.pyplot as plt from sklearn import datasets, ...
- 类型TTreeView.items.add 与 TTreeView.items.addchild有何区别?(10分)
我看了书上例子,好象两者都可以实现treeview中的node 的构建. addchild是给当前的node建一个子node,它比当前node要向右缩进几格add建立同级的node,不缩进 aNode ...
- [C++]数据结构:栈之顺序栈
0 栈的基本概念 栈,根据存储结构的不同,可分为:链栈和顺序栈. 1 顺序栈的知识概览 2 编程复现 2.1 定义基本数据结构 typedef char DataType; // 基本数据类型 enu ...
- 总是访问到tomcat首页解决
部署代码后总是访问到tomcat首页解决 没有把路径写全 访问:养成带上绝对路径的习惯,否则总是访问到tomcat的首页 http://114.116.65.232:8085/ssoserver/
- JQ也要面向对象~在JQ中扩展静态方法和实例方法(jq扩展方法)
JQ也要面向对象,事实上,无论哪种开发语言,在开发功能时,都要把面向对象拿出来,用它的思想去干事,去理解事,面向对象会使问题简单化,清晰化,今天说两个概念“静态方法”与“实现方法”,这个在面向对象的语 ...
- CF1187D Subarray Sorting
思路: 线段树好题.对a数组中的每个元素从左到右依次操作,判断最终是否能够转化成b数组.在此过程中使用线段树维护区间最小值判断是否能够进行合法操作. 实现: #include <bits/std ...
- 软件测试工具LoadRunner常见问题二
1.一些Web虚拟用户脚本录制后立刻回放没有任何问题,但是当设置迭代次数大于1时,如果进行回放则只能成功迭代一次.为什么从第二次迭代开始发生错误? 这种现象多是由于在"Run-time Se ...
- spring中的BeanDefinitionRegistryPostProcessor
spring中的BeanDefinitionRegistryPostProcessor是BeanFactoryPostProcessor的子接口,BeanFactoryPostProcessor的作用 ...