目录


什么是动态 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. Jmeter Web 性能测试入门 (二):Fiddler 抓取 http/https 请求

    jmeter自带了拦截request的功能,并且也有对应的tool:badboy 可以用.但由于我经常做移动端的项目,个人还是习惯用fiddler来收集request. 官网下载并安装Fiddler ...

  2. asp.net core spa应用(angular) 部署同一网站下

    需求:现在一个应用是前后端开发分离,前端使用angular,后端使用 asp.net core 提供api ,开发完成后,现在需要把两个程序部署在同一个网站下,应该怎么处理? 首先可以参考微软的官方文 ...

  3. lareval重命名created_at和updated_at字段

    lareval重命名created_at和updated_at字段 一.总结 一句话总结: 要改变created_at和updated_at的名称,模型和数据迁移里面都需要改变 在模型中指定数据类型之 ...

  4. based on Greenlets (via Eventlet and Gevent) fork 孙子worker 比较

    Design — Gunicorn 19.9.0 documentationhttp://docs.gunicorn.org/en/stable/design.html#async-workers e ...

  5. java工厂模式的测试

    /** * 工厂模式的测试 * <p> * 工厂方法模式 * 工厂方法模式是简单工厂模式的进一步抽象化和推广,工厂方法模式里不再只由一个工厂类决定那一个产品类应当被实例化,这个决定被交给抽 ...

  6. linux下如何批量替换多个文件中的某个字符串?

    答: sed -i "s/<old_string>/<new_string>/g" `grep "<old_string>" ...

  7. Objective-C如何自己实现一个for-each语法形式

    我们在用Objective-C编写程序时,很多时候会用到NSArray来作为线性列表来使用.我们在枚举这个数组所有元素的使用可以通过下列方法进行: for(id obj in anArray) { } ...

  8. ubuntu 安装百度云客户端

    下载地址:http://pan.baidu.com/download 如果没有安装alien,安装 luo@luo-ThinkPad-W540:~$sudo apt-get install alien ...

  9. VLC-DSS搭建直播系统中链路断开影响测试

    VLC-DSS搭建直播系统中链路断开影响测试 系统环境搭建如图所示.计算机77上运行VLC从摄像机51上取流,推送给一级DSS服务器30:二级DSS服务器78从一级DSS服务器30上取流转发.(其配置 ...

  10. es6 是否包含字符串判断

    字符串查找类 接下来介绍一些可以通过 ES5 PolyFill的方法,但是现在 ES6 原生实现了 Method Param Return Description includes() 需要验证是否被 ...