(八)动态 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 ...
随机推荐
- vue 使用 echart ,自定义样式案例
1.vue 安装 echart 库 npm install echarts --save 2.vue代码 引入 let echarts = require("echarts/lib/echa ...
- JAVA RPC 生产级高可用RPC框架使用分享
先放出链接,喜欢的给个star:https://gitee.com/a1234567891/koalas-rpc 一:项目介绍 koalas-RPC 个人作品,提供大家交流学习,有意见请私信,欢迎拍砖 ...
- JAVA基础知识|异常
一.基础知识 处理异常,java提供了一个优秀的解决方案:异常处理机制. java把异常当作对象来处理,所有的异常都是由Throwable继承而来,但在下一层立即分解为两个分支:Error和Excep ...
- JAVA基础知识|抽象类与接口类
一.抽象类 抽象类:拥有抽象方法的类就是抽象类,抽象类要使用abstract声明 抽象方法:没有方法体的方法,必须要使用abstract修饰 为什么要使用抽象类,抽象方法? 举例来说,如果你定义了一个 ...
- 利用 force index优化sql语句性能
[转自:https://blog.csdn.net/bruce128/article/details/46777567]并进行总结 今天写了一个统计sql,在一个近亿条数据的表上执行,200s都查不出 ...
- Linux 文件存在程序找不到文件
1. 编码格式 程序运行时的编码格式和传输到程序中参数的编码格式是否一致,可以在程序中打印日志进行验证: 2. 转义符 文件路径中存在转义符 3. 运行程序的用户身份 不同用户运行程序也可能导致编码格 ...
- Java core dump
目录 生成Java core dump core dump分析 生成Java core dump 可以按照下面这个文章的指引来通过jni调用触发Java core dump Generating a ...
- zookeeper源码 — 五、处理写请求过程
目录 处理写请求总体过程 客户端发起写请求 follower和leader交互过程 follower发送请求给客户端 处理写请求总体过程 zk为了保证分布式数据一致性,使用ZAB协议,在客户端发起一次 ...
- Qt pro工程文件介绍
app - 建立一个应用程序的makefile.这是默认值,所以如果模板没有被指定,这个将被使用. lib - 建立一个库的makefile. vcapp - 建立一个应用程序的Visual Stud ...
- DELPHI安卓定位权限申请
DELPHI安卓定位权限申请 安卓8及以后版本的权限分为静态和动态申请2部分,而之前的安卓版本只需要静态申请权限. 1)静态申请定位权限: 2)动态申请定位权限: uses System.Permis ...