(八)动态 sql
目录
什么是动态 sql
我们之前在映射文件中,配置 sql
的时候,其实都是静态的 ;
<!--复杂查询-->
<select id="findUsersByVo" parameterType="userQueryVo" resultType="userStrengthen" >
SELECT * from user where sex = #{userStrengthen.sex} and name like '%${userStrengthen.name}%'
</select>
比如这样的 sql
,我们只能根据条件进行查询了;
但是有时候,我们总要查询满足其中 部分条件
的结果,这时候,难道需要我们再次配置新的 sql
吗?
mybatis
没有那么傻,它有个 动态sql
技术 ;(动态sql
用法跟我们之前学的 jstl
差不多);
我们使用 动态sql
改写上面的映射关系文件 :
<select id="findUsersByVo" parameterType="userQueryVo" resultType="userStrengthen" >
SELECT * from user
<!-- where 标签会自动的删除第一个条件前面的 and -->
<where>
<if test="userStrengthen != null">
<if test="userStrengthen.sex != null and userStrengthen.sex != '' ">
AND sex = #{userStrengthen.sex}
</if>
<if test="userStrengthen.name != null and userStrengthen.name != '' ">
and name like '%${userStrengthen.name}%'
</if>
</if>
</where>
</select>
sql 片段
向上面的查询条件,我们可能会在其他地方也使用,我们总不能每次都复制粘贴一次吧,那样重复代码太多了,mybatis
有一个 sql片段
技术 ;
就是为一段 sql
一句,起个名字,放在那,在使用的时候,直接进行引用 ;
创建 sql片段
代码
<!--定义 sql片段 -->
<!--
一点经验:
1、在定义sql片段的时候,不要将 where 标签定义进来,不然 就无法做到条件的拼接了
2、定义 sql片段,只在单表中进行定义,这样复用性更强
-->
<sql id="query_user_name_sex">
<if test="userStrengthen != null">
<if test="userStrengthen.sex != null and userStrengthen.sex != '' ">
AND sex = #{userStrengthen.sex}
</if>
<if test="userStrengthen.name != null and userStrengthen.name != '' ">
and name like '%${userStrengthen.name}%'
</if>
</if>
</sql>
在需要的地方,引用我们定义的 sql片段
:
<select id="findUsersByVo" parameterType="userQueryVo" resultType="userStrengthen">
SELECT * from user
<!-- where 标签会自动的删除第一个条件前面的 and -->
<where>
<!-- 引用 sql 片段-->
<include refid="query_user_name_sex"></include>
</where>
</select>
foreach 标签
有些时候,我们传入的条件是一个集合,这样,我们就可以用 foreach
标签进行迭代 ;
比如,拼接下面一个 sql
and id in(1,11,22)
使用 foreach
遍历 :
<sql id="query_user_ids">
<if test="ids != null">
<!--
collection : 集合引用的名字
item : 为每次从集合中迭代出来的对象,取个名字
open :sql 条件语句开始的部分
close : sql 条件语句结束的部分
separator : 迭代对象进行拼接中间的部分
-->
<foreach collection="ids" item="id" open="and id in(" close=")" separator=",">
#{id}
</foreach>
</if>
</sql>
(八)动态 sql的更多相关文章
- MyBatis基础入门《十八》动态SQL(if-where)
MyBatis基础入门<十八>动态SQL(if-where) 描述: 代码是在<MyBatis基础入门<十七>动态SQL>基础上进行改造的,不再贴所有代码,仅贴改动 ...
- Mybatis系列全解(八):Mybatis的9大动态SQL标签你知道几个?提前致女神!
封面:洛小汐 作者:潘潘 2021年,仰望天空,脚踏实地. 这算是春节后首篇 Mybatis 文了~ 跨了个年感觉写了有半个世纪 ... 借着女神节 ヾ(◍°∇°◍)ノ゙ 提前祝男神女神们越靓越富越嗨 ...
- Java SSM框架之MyBatis3(八)MyBatis之动态SQL
前言: mybatis框架中最具特色的便是sql语句中的自定义,而动态sql的使用又使整个框架更加灵活. 创建User表 /*Table structure for table `user` */ D ...
- 深入浅出Mybatis系列(九)---强大的动态SQL
上篇文章<深入浅出Mybatis系列(八)---mapper映射文件配置之select.resultMap>简单介绍了mybatis的查询,至此,CRUD都已讲完.本文将介绍mybatis ...
- Mybatis.net与MVC入门配置及联合查询动态SQL拼接和简单事务
第一次学习Mybatis.net,在博客园也找到好多资料,但是在配置成功之后也遇到了一些问题,尤其是在动态SQl拼接时候,这里把遇到的问题还有自己写的一个Demo贴出来,希望能帮到新手,有不适合的地方 ...
- MyBatis_动态SQL
一.动态SQL 动态SQL,主要用于解决查询条件不确定的情况:在程序运行期间,根据提交的查询条件进行查询. 动态SQL,即通过MyBatis提供的各种标签对条件作出判断以实现动态拼接SQL语句. 二. ...
- Mybatis之旅第五篇-动态SQL
一.引言 在之前的CRUD例子中,都是一些很简单的SQL,然而实际的业务开发中会有一些复杂的SQL,我们经常需要拼接SQL,拼接的时候要确保不能忘了必要的空格,还要注意省掉列名列表最后的逗号.Myba ...
- MyBatis-DynamicSQL 动态SQL
MyBatis 的动态 SQL 使用 OGNL 表达式 http://commons.apache.org/proper/commons-ognl/language-guide.html 在 XML ...
- 深入浅出Mybatis系列(九)---强大的动态SQL(转载)
原文出处:http://www.cnblogs.com/dongying/p/4092662.html 上篇文章<深入浅出Mybatis系列(八)---mapper映射文件配置之select.r ...
随机推荐
- 树莓派打造mini广播(FM)系统
树莓派打造mini广播(FM)系统 注意相关法律限制功率大小和频段.,以下只能用于测试目的 github项目: https://github.com/miegl/PiFmAdv 安装: apt-get ...
- WPF中,Grid与Table的区别(英文)-转载
原文地址:http://blog.csdn.net/johnsuna/article/details/1742799 How is Grid Different from Table?Table an ...
- uiautomator2 wifi连接手机
[实施方法] 手机和电脑同时连接到同一个wifi上 1.开启远程adb #开启远端adb,这一步需要手机通过USB连接到电脑 adb tcpip 5555 #结果如下:restarting in TC ...
- Linux:sed
[参考文章]:shell中sed命令的用法 [参考文章]:SED 简明教程 1. 简述 sed是一种流编辑器,它是文本处理中非常重要的工具,能够完美的配合正则表达式使用. 执行命令时,一次处理一行内容 ...
- 飞行姿态角度表示: heading pitch roll
//创建初始化摄像机视图 var initialPosition=new Cesium.Cartesian3.fromDegrees(-73.998114468289017509, 40.674512 ...
- vue实现穿梭框效果
vue实现穿梭框效果 一.总结 一句话总结: 用两个数组分别记录左右框框里面的值,用两个数组绑定checkbox,用来记录选中的checkbox值,根据选中的checkbox的值实现删除增加即可 1. ...
- ArcGIS超级工具SPTOOLS-线封闭,点集转面
一.线封闭 操作视频:https://weibo.com/tv/v/HvyvbAxKh?fid=1034:4375207666991674 将末端不闭合线,自动生成闭合的线,效果如下 原始线:末端不闭 ...
- 转载:OutOfMemoryError系列(2): GC overhead limit exceeded
这是本系列的第二篇文章, 相关文章列表: OutOfMemoryError系列(1): Java heap space OutOfMemoryError系列(2): GC overhead limit ...
- Kombu is a messaging library for Python.
https://kombu.readthedocs.io/en/stable/introduction.html
- Mac 平台安装MySQL
Mac 平台安装MySQL 一.下载MySQL MySQL官网上https://dev.mysql.com/downloads/mysql/,下载Community Server版 出现如下界面, ...