(八)动态 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 ...
 
随机推荐
- 二十七、Linux内核管理
			
内核组成: uname命令 内核:uname,mkinitrd,dracut 模块: lsmod,modinfo,depmod,modprobe,insmod,rmmod /proc,sysctl,/ ...
 - CF1197B
			
CF1197B 题意: 出n个柱子,每个柱子一个圆盘,其半径各不相同,每次只能将柱子上只有一个圆盘的移到相邻位置,问能否全部移到一个柱子上. 解法: 思路题. 如果所有盘子都能移动到同一个柱子上,那么 ...
 - linux系统rwx(421)、777权限详解
			
摘要 linux的常见权限,mark一下 常用的linux文件权限如下: 444 r--r--r-- 600 rw------- 644 rw-r--r-- 666 rw-rw-rw- 700 rwx ...
 - 如何使用纯js实现一个带有灰色半透明背景的弹出框
			
原文如何使用纯js实现一个带有灰色半透明背景的弹出框 // 加入透明背景 var body = document.body;var backgroundDiv = document.createEle ...
 - NMS(非极大值抑制)实现
			
1.IOU计算 设两个边界框分别为A,B.A的坐标为Ax1,Ax2,Ay1,Ay2,且Ax1 < Ax2,Ay1 < Ay2.B和A类似. 则IOU为A∩B除以A∪B. 当两个边界框有重叠 ...
 - Ubuntu JDK环境变量
			
环境变量配置 sudo gedit ~/.bashrc export JAVA_HOME=/usr/local/java/jdk1.8.0_201 export JRE_HOME=${JAVA_HOM ...
 - win10+mysql8.0安装
			
一.下载 mysql8.0 windows zip包下载地址: https://dev.mysql.com/downloads/mysql/ 1540951981(1).png 二.安装 1.解压 ...
 - VUE -- Identifier 'n_type' is not in camel case
			
Identifier 'n_type' is not in camel case 参数名的 `_` 去掉就好了
 - SQL-W3Chool-高级:SQL CREATE DATABASE 语句
			
ylbtech-SQL-W3Chool-高级:SQL CREATE DATABASE 语句 1.返回顶部 1. CREATE DATABASE 语句 CREATE DATABASE 用于创建数据库. ...
 - OS X以及iOS中与硬件环境相关的预定义宏
			
由于现在ARM处理器的飞速发展,从Apple A4到现在的Apple A7,从32位到64位,每一代处理器几乎都增加了不少特性,从而在架构上也有所不同.比如Apple A6引入了ARMv7S架构,增加 ...