目录


什么是动态 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的更多相关文章

  1. MyBatis基础入门《十八》动态SQL(if-where)

    MyBatis基础入门<十八>动态SQL(if-where) 描述: 代码是在<MyBatis基础入门<十七>动态SQL>基础上进行改造的,不再贴所有代码,仅贴改动 ...

  2. Mybatis系列全解(八):Mybatis的9大动态SQL标签你知道几个?提前致女神!

    封面:洛小汐 作者:潘潘 2021年,仰望天空,脚踏实地. 这算是春节后首篇 Mybatis 文了~ 跨了个年感觉写了有半个世纪 ... 借着女神节 ヾ(◍°∇°◍)ノ゙ 提前祝男神女神们越靓越富越嗨 ...

  3. Java SSM框架之MyBatis3(八)MyBatis之动态SQL

    前言: mybatis框架中最具特色的便是sql语句中的自定义,而动态sql的使用又使整个框架更加灵活. 创建User表 /*Table structure for table `user` */ D ...

  4. 深入浅出Mybatis系列(九)---强大的动态SQL

    上篇文章<深入浅出Mybatis系列(八)---mapper映射文件配置之select.resultMap>简单介绍了mybatis的查询,至此,CRUD都已讲完.本文将介绍mybatis ...

  5. Mybatis.net与MVC入门配置及联合查询动态SQL拼接和简单事务

    第一次学习Mybatis.net,在博客园也找到好多资料,但是在配置成功之后也遇到了一些问题,尤其是在动态SQl拼接时候,这里把遇到的问题还有自己写的一个Demo贴出来,希望能帮到新手,有不适合的地方 ...

  6. MyBatis_动态SQL

    一.动态SQL 动态SQL,主要用于解决查询条件不确定的情况:在程序运行期间,根据提交的查询条件进行查询. 动态SQL,即通过MyBatis提供的各种标签对条件作出判断以实现动态拼接SQL语句. 二. ...

  7. Mybatis之旅第五篇-动态SQL

    一.引言 在之前的CRUD例子中,都是一些很简单的SQL,然而实际的业务开发中会有一些复杂的SQL,我们经常需要拼接SQL,拼接的时候要确保不能忘了必要的空格,还要注意省掉列名列表最后的逗号.Myba ...

  8. MyBatis-DynamicSQL 动态SQL

    MyBatis 的动态 SQL 使用 OGNL 表达式 http://commons.apache.org/proper/commons-ognl/language-guide.html 在 XML ...

  9. 深入浅出Mybatis系列(九)---强大的动态SQL(转载)

    原文出处:http://www.cnblogs.com/dongying/p/4092662.html 上篇文章<深入浅出Mybatis系列(八)---mapper映射文件配置之select.r ...

随机推荐

  1. 【原创】go语言学习(一)

    一.go发展历史 1.1诞生历史 1.诞生于2006年1月下午15点4分5秒 2.2009发布并正式开园 3.2012年第一个正式版本Go1.0发布 4.截止2019年10月8日,Go1.13.1 1 ...

  2. python ros 设置机器人的位置

    #!/usr/bin/env python import rospy import math from tf import transformations from geometry_msgs.msg ...

  3. 关于在eclipse中Undefined attribute name (role).解决办法

    方案一: 只需要在jsp表头添加一句: <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c&q ...

  4. HTTP之持久连接

    HTTP/1.1 允许 HTTP 设备在事务处理结束之后将 TCP 连接保持在打开状态,以便为未来的 HTTP 请求重用现存的连接.在事务处理结束后仍然保持在打开状态的 TCP 连接被称为持久连接.非 ...

  5. tomcat单机多实例

    catalina.home指向公用信息的位置,就是bin和lib的父目录. catalina.base指向每个Tomcat目录私有信息的位置,就是conf.logs.temp.webapps和work ...

  6. Jquery.Data()和HTML标签的data-*属性

    Jquery.Data()和HTML标签的data-*属性 一.总结 一句话总结: 在页面中用到要用标签存数据还是用HTML标签的data-*属性,这样 不会破坏html本身的结构 1.使用HTML标 ...

  7. TNetHttpClient的用法

    TNetHttpClient的用法 TNetHttpClient是DELPHI XE8新增加的控件. 在之前,我们一般都是使用IDHTTP控件,但在安卓.IOS等非WINDOWS平台,IDHTTP访问 ...

  8. Mybatis generator配置

    <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE generatorConfiguration ...

  9. [Oracle]关于回滚段的一些转贴摘录

    ORACLE 回滚段 回滚段概述 回滚段用于存放数据修改之前的值(包括数据修改之前的位置和值).回滚段的头部包含正在使用的该回滚段事务的信息.一个事务只能使用一个回滚段来存放它的回滚信息,而一个回滚段 ...

  10. Java synchronized和Lock

    Synchronized 1. 将synchronized加在方法上, 即可实现对此方法的同步 public synchronized void deposit(float amt) { float ...