目录


什么是动态 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. docker容器中查看容器linux版本

    root@dae5aecea3dd:~# cat /etc/issue Ubuntu LTS \n \l

  2. Liunx之MySQL安装与主从复制

    MYSQL安装(mariadb) MariaDB数据库管理系统是MySQL的一个分支,主要由开源社区在维护,采用GPL授权许可. 开发这个分支的原因之一是:甲骨文公司收购了MySQL后,有将MySQL ...

  3. Linux监控工具介绍系列——iostat

    文章转自:https://www.cnblogs.com/ghj1976/p/5691857.html Linux系统中的 iostat是I/O statistics(输入/输出统计)的缩写,iost ...

  4. codeforces#1217D. Coloring Edges(图上染色)

    题目链接: https://codeforces.com/contest/1217/problem/D 题意: 给图染上$k$种颜色,相同颜色不能形成一个环 数据范围: $1\leq n \leq 5 ...

  5. [BJOI2019]光线——递推

    题目链接: [BJOI2019]光线 设$F_{i}$表示从第$1$面玻璃上面向下射入一单位光线,穿过前$i$面玻璃的透光率. 设$G_{i}$表示从第$i$面玻璃下面向上射入一单位光线,穿过前$i$ ...

  6. Memcached与Memcache区别

    在写这篇文章之前一直对memcache .memcached模糊,相差一个字母,特此总结下: Memcache是什么? Memcache是一个自由和开放源代码.高性能.分配的内存对象缓存系统.用于加速 ...

  7. 执行git pull时提示Connection reset by 13.229.188.59 port 22

    问题如下图: 解决办法: 1. 2. 3. 4. 5. 6.

  8. 设计一个支持 push,pop,top 操作,并能在常数时间内检索到最小元素的栈 绝对值?相对值

    小结: 1. 常数时间内检索到最小元素 2.存储 存储绝对值?相对值 存储差异 3. java-ide-debug 最小栈 - 力扣(LeetCode)https://leetcode-cn.com/ ...

  9. css3实现jQuery的slideUp和slideDown效果

    最近打算做一些交互优化方面的轮子.虽然轮子别人都弄过,但是自己没弄过.重复造轮子对知识理解还是有好处的.本次轮子如题目.直接代码. <!DOCTYPE html> <html lan ...

  10. asp.net MVC AngularJS

    http://www.cnblogs.com/powertoolsteam/category/834105.html