MyBatis总结七:动态sql和sql片段
开发中,sql拼接很常见,所以说一下动态sql:
| 1 | if |
| 2 | chose,when,otherwise |
| 3 | where,set |
| 4 | foreach |
用法解析(现有一张users表 内有id username age 三个字段):
<!--查询所有用户,传递参数type,如果值为0,按照年龄升序排序,如果为1则按照年龄降序排序,否则按照ID排序-->
<!--choose when otherwise的用法 大致相当于case when default-->
<select id="getUserListByType" resultType="User">
select * from users
<choose>
<when test="type==0">order by age asc</when>
<when test="type==1">order by age desc</when>
<otherwise>order by id asc</otherwise>
</choose>
</select> <!--根据多个id查询用户 if where foreach的用法-->
<select id="getUserListByIds" resultMap="User">
select * from users
<where>
-- if判断 如果传进去的参数ids不为空
<if test="ids!=null and ids==''">
and id in
-- foreach循环ids 以逗号为分隔符 以ids这个字符串中的'('为开始 ')'为结果
<foreach collection="ids" item="id" open="(" close=")" separator=",">
#{id}
</foreach>
</if>
</where>
</select> <!--修改用户信息,如果某字段为null,则不修改这个字段 set的用法-->
<select id="updateUser">
update users
<set>
<if test="username!=null and username!=''">
username = #{username}
</if>
<if test="age!=null">
age = #{age}
</if>
</set>
</select>
我们还可以把重复的sql抽取出来,作为公用的sql片段:
定义sql片段:
<!-- sql片段
建议:对单表进行sql片段的抽取,方便重用
抽取时不包含where
-->
<sql id="findUserSql">
<if test="userCustomer!=null">
<if test="userCustomer.age!=null">
and user.age=#{userCustomer.age}
</if>
<if test="userCustomer.username!=null and userCustomer.username!=''">
and user.username like '$%{userCustomer.username}%'
</if>
</if>
</sql>
使用sql片段:
<!-- 动态sql -->
<select id="findUserCount" parameterType="com.zy.domain.User" resultType="int">
select count(*) from users
-- where 可自动去除条件中的第一个and
<where>
<include refid="findUserSql"></include>
</where>
</select>
MyBatis总结七:动态sql和sql片段的更多相关文章
- 6.Mybatis中的动态Sql和Sql片段(Mybatis的一个核心)
动态Sql是Mybatis的核心,就是对我们的sql语句进行灵活的操作,他可以通过表达式,对sql语句进行判断,然后对其进行灵活的拼接和组装.可以简单的说成Mybatis中可以动态去的判断需不需要某些 ...
- 【mybatis深度历险系列】mybatis中的动态sql
最近一直做项目,博文很长时间没有更新了,今天抽空,学习了一下mybatis,并且总结一下.在前面的博文中,小编主要简单的介绍了mybatis中的输入和输出映射,并且通过demo简单的介绍了输入映射和输 ...
- Mybatis入门之动态sql
Mybatis入门之动态sql 通过mybatis提供的各种标签方法实现动态拼接sql. 1.if.where.sql.include标签(条件.sql片段) <sql id="sel ...
- mybatis 详解------动态SQL
mybatis 详解------动态SQL 目录 1.动态SQL:if 语句 2.动态SQL:if+where 语句 3.动态SQL:if+set 语句 4.动态SQL:choose(when,o ...
- mybatis教程4(动态SQL)
动态SQL语句 MyBatis 的强大特性之一便是它的动态 SQL.如果你有使用 JDBC 或其它类似框架的经验,你就能体会到根据不同条件拼接 SQL 语句的痛苦.例如拼接时要确保不能忘记添加必要的空 ...
- mybatis学习 十 动态 SQL
1. 根据方法传入的参数不同执行不同的 SQL 命令.称为动态 SQL, MyBatis 中动态 SQL 就是在 mapper.xml 中添加逻辑判断等. 2. <if>标签 <s ...
- mybatis第二天——动态SQL与关联查询
大纲摘要: 1.输入映射和输出映射 a) 输入参数映射 b) 返回值映射 2.动态sql a) If b) Where c) Foreach d) Sql片段 3.关联查询 a) 一对一关联 b) 一 ...
- mybatis入门基础----动态SQL
原文:http://www.cnblogs.com/selene/p/4613035.html 阅读目录 一:动态SQL 二:SQL片段 三:foreach 回到顶部 一:动态SQL 1.1.定义 m ...
- mybatis中的动态SQL语句
有时候,静态的SQL语句并不能满足应用程序的需求.我们可以根据一些条件,来动态地构建 SQL语句. 例如,在Web应用程序中,有可能有一些搜索界面,需要输入一个或多个选项,然后根据这些已选择的条件去执 ...
随机推荐
- 怎么用API网关构建微服务
选择将应用程序构建为微服务时,需要确定应用程序客户端如何与微服务交互.在单体应用程序中,只有一组端点.而在微服务架构中,每个微服务都会暴露一组通常是细粒度的端点.在本文中,我们将讨论一下这对客户端与应 ...
- 字典:dict.c/dict.h
Redis 源码分析(1):字典和哈希表(dict.c 和 dict.h)http://huangz.iteye.com/blog/1455808两个点:字典结构的运作流程哈希表的渐进式 rehash ...
- jsp:forEach标签
该标签使用来对一个 Collection 集合中的一系列对象进行迭代输出,并且可以指定迭代次数.一般使用格式如下: <c:forEach items=”collection” var=”varN ...
- C语言基础三
C--数组 一维数组的定义和引用 定义:类型说明符 数组名[常量表达式] int a[ 10 ];他表示定义了一个整形数组,数组名为a,有10个元素. 注意:C语言不允许对数组的大小做动态定义. 一维 ...
- javascript给输入框赋值的一个误区
一. 错误的示范 如下代码所示,如果需要用javascript获取id为username1, password1的输入框的值,将其写入id为username2, password2的输入框,那么红线区 ...
- svg札记
1.人老了,有些事情太容易忘记了,这里做下笔记,供参考,for self for you. 2.源于地图监控,建筑级别各大地图商的api(高德.百度.腾讯等)已经足够使用,唯独室内图这块还差点. 3. ...
- 线程存储(Thread Specific Data)
线程中特有的线程存储, Thread Specific Data .线程存储有什么用了?他是什么意思了? 大家都知道,在多线程程序中,所有线程共享程序中的变量.现在有一全局变量,所有线程都可以使用它, ...
- uuid 学习
#include <vector> #include <iostream> #include <boost/uuid/uuid.hpp> #include < ...
- 小组项目需求——NABCD
关于项目微食堂的NABCD: N(need): 就我自己而言,每天在上午三四节课时就会想中午吃什么.而且大部分的课在二教,离食堂较远.可能会面临“抢不到饭”的问题.首先不知道去哪吃.吃什么,尤其在时间 ...
- LeetCode Target Sum
原题链接在这里:https://leetcode.com/problems/target-sum/description/ 题目: You are given a list of non-negati ...