mybatis精讲(七)--动态sql
在我们传统的开发中我们会通过拼接sql达到数据库的操作。java中的拼接不仅效率低下而且代码很长不易维护。而Mybatis通过代理模式实现SQL语句的组装。简洁易懂。
常用标签
元素 | 作用 | 备注 |
---|---|---|
if | 判断语句 | 条件分支 |
choose | switch | 多条件分支 |
trim | 去除空字符 | 特殊处理 |
foreach | 集合循环 | 遍历 |
if元素
- if元素是常用的语句,常常在where内部和test结合使用。
- 在大部分if使用简单。比如我们在查询的时候就可以动态添加name字段。
<select id="selectUser">
select id,name,user_sex from User
<where>
<if test="name!=null and name!=''">
and name like concat('%',concat(#{name},'%'))
</if>
</where>
</select>
- 上面的sql实现的效果就是如果方法中传递了name参数则以name为条件查询数据。如果没有传递name 则是全表查询数据
choose元素
- choose类似于java中的switch。类似的标签还有when 、 otherwise元素
<select id="selectUser">
select id , name , user_sex from User
<where>
<choose>
<when test="name!=null and name!=''">
and name like concat('%',concat(#{name},'%'))
</when>
<when test="id!=null and id!=''">
and id=#{id}
</when>
<otherwise>
and user_sex=#{userSex}
</otherwise>
</choose>
</where>
</select>
trim元素
- 上面我们已经使用了一个特殊标签 where . 这个标签加上就是产生条件语句的。如果没有条件语句name这个where 就没有。
- 关于trim 标签也可以实现类似where的作用。
<select id="selectUser">
select id , name , user_sex from User
<trim prefix="where" prefixOverrides="and">
<if test="name!=null and name!=''">
and name like concat('%',concat(#{name},'%'))
</if>
</trim>
</select>
- trim元素就意味着我们需要去掉一些特殊字符串。prefix代表的语句的前缀。而prefexOverrides代表的是你需要去掉的字符串。上面的写法基本与where是等效的。update中使用set也是和trim是等效的。
forearch
- forearch元素就是一个集合遍历。在我们开发中也是常用的一种数据
<select id="selectUser">
select * from User where user_sex in
<forearch item="sex" index="index" collection="sexList" open="(" close="}" separator=",">
#{sex}
</forearch>
</select>
- collection 配置的sexList是传递过来的集合
- item配置的是循环中当前元素
- index 配置的当前元素在集合中下标
- open 和 close 配置的是已什么符号将这些元素包装起来
- separator 是各个元素的间隔符
bind元素
- bind元素的作用是通过OGNL表达式自定义一个上下文变量。这样更方便我们使用。在我们进行模糊查询的时候,如果是Mysql数据库,我们常常用到的是一个concat用"%"和参数连接。然而Oracle数据库则是用连接符号"||",这样SQL就需要提供两种形式实现。但是有了bind元素,我们就完全不必使用数据库语言。只需要使用Mybaits语法了。
<select id="selectUser">
<bind name="pattern" value="'%'+_parameter+'%'"/>
select id , name , user_sex from User
where name like #{pattern}
</select>
- 上面的_parameter代表的就是传递进来的参数,他和通配符连接后,赋给了pattern。我们就可以在select语句中使用这个变量进行模糊查询了。不管是Mysql还是Oracle数据库都可以使用这样进行查询。
mybatis精讲(七)--动态sql的更多相关文章
- MyBatis学习总结_11_MyBatis动态Sql语句
MyBatis中对数据库的操作,有时要带一些条件,因此动态SQL语句非常有必要,下面就主要来讲讲几个常用的动态SQL语句的语法 MyBatis中用于实现动态SQL的元素主要有: if choose(w ...
- MyBatis:学习笔记(4)——动态SQL
MyBatis:学习笔记(4)——动态SQL
- SSM框架之Mybatis(6)动态SQL
Mybatis(6)动态SQL 1.动态SQL 出现原因:有些时候业务逻辑复杂时,我们的 SQL 是动态变化的,此时在前面的学习中我们的 SQL 就不能满足要求了 1.1.if标签 我们根据实体类的不 ...
- Spring mybatis源码篇章-动态SQL节点源码深入
通过阅读源码对实现机制进行了解有利于陶冶情操,承接前文Spring mybatis源码篇章-动态SQL基础语法以及原理 前话 前文描述到通过mybatis默认的解析驱动类org.apache.ibat ...
- Mybatis系列全解(八):Mybatis的9大动态SQL标签你知道几个?提前致女神!
封面:洛小汐 作者:潘潘 2021年,仰望天空,脚踏实地. 这算是春节后首篇 Mybatis 文了~ 跨了个年感觉写了有半个世纪 ... 借着女神节 ヾ(◍°∇°◍)ノ゙ 提前祝男神女神们越靓越富越嗨 ...
- MyBatis 源码分析——动态SQL语句
有几年开发经验的程序员应该都有暗骂过原生的SQL语句吧.因为他们不能一句就搞定一个业务,往往还要通过代码来拼接相关的SQL语句.相信大家会理解SQL里面的永真(1=1),永假(1=2)的意义吧.所以m ...
- 持久层之 MyBatis: 第二篇 :动态SQL And多表查询
MyBatis入门到精通 完整CRUD UserDaoImpl 编写UserDao对应的UserDaoMapper.xml 添加UserDao的测试用例 编写UserDao的测试用例 解决数据库字段名 ...
- 深入浅出Mybatis系列 强大的动态SQL
上篇文章<深入浅出Mybatis系列(八)---mapper映射文件配置之select.resultMap>简单介绍了mybatis的查询,至此,CRUD都已讲完.本文将介绍mybatis ...
- mybatis入门基础(五)----动态SQL
一:动态SQL 1.1.定义 mybatis核心对sql语句进行灵活操作,通过表达式进行判断,对sql进行灵活拼接.组装. 1.2.案例需求 用户信息综合查询列表这个statement的定义使用动态s ...
随机推荐
- 软件——IDEA主题美化
前言 IntelliJ IDEA主要用于支持 Java.Scala.Groovy 等语言的开发工具,同时具备支持目前主流的技术和框架,擅长于企业应用.移动应用和 Web 应用的开发. IntelliJ ...
- Spring Cloud学习 之 Spring Cloud Ribbon(负载均衡策略)
文章目录 AbstractLoadBalancerRule: RandomRule: RoundRobinRule: RetryRule: WeightedResponseTimeRule: 定时任务 ...
- 【Hadoop离线基础总结】Hive的安装部署以及使用方式
Hive的安装部署以及使用方式 安装部署 Derby版hive直接使用 cd /export/softwares 将上传的hive软件包解压:tar -zxvf hive-1.1.0-cdh5.14. ...
- pthon-安装新版PyQt5、PyQT5-tool后打不开并Designer.exe提示“This application failed to start because no Qt platform plugin could be initialized.Reinstalling the application the application may fix this program”
最近学习python,安装网上教程一步一步的安装,网上很多帖子都写的非常详细,不由深深感慨多谢各位不辞辛苦的记录,指导着来自新入门的同学. 但是实际安装中,最理想莫过于一次性安装成功,但自己安装就出现 ...
- python --分隔符split()
描述: python split()是通过指定分隔符对字符串进行切片,且可以指定分隔n+1个字符串. 语法: str.split(str="",num=string.count(s ...
- tomcat 8.5 及其 9.0 response写cookie 设置damain为 [.test.com] 出错 An invalid domain [.test.com] was specified for this cookie
抛出异常: java.lang.IllegalArgumentException: An invalid domain [.test.com] was specified for this cooki ...
- python--字典基本操作
字典 格式 key :value # string list dict# 1.取数据方便# 2.速度快, 定义一个空字典: d = dict() 或者 d = { } infos = {'n ...
- Linux之cat的使用介绍
cat选项分析 ...
- Springboot 上传CSV文件并将数据存入数据库
.xml文件依赖配置 <!--csv依赖 --> <dependency> <groupId>org.apache.commons</groupId> ...
- PAT 1006 Sign In and Sign Out (25分) 字符串比较
题目 At the beginning of every day, the first person who signs in the computer room will unlock the do ...