Mybatis学习三(动态sql语句)
动态sql语句主要为以下语句
1、动态SQL:if 语句
2、动态SQL:if+where 语句
3、动态SQL:if+set 语句
4、动态SQL:choose(when,otherwise) 语句
5、动态SQL:trim 语句
6、动态SQL: SQL 片段
7、动态SQL: foreach 语句
之前的几篇学习博客我用mybatis对一张表进行的CRUD操作,但是 SQL 语句都比较简单,如果有比较复杂的 SQL 语句,经常需要拼接,而拼接 SQL稍微不注意就容易出错此时我们可以用mybatis 动态SQL,通过 if, choose, when, otherwise, trim, where, set, foreach等标签来解决这个问题,这几个标签可组合成非常灵活的SQL语句,用起来也是很舒服
1 <?xml version="1.0" encoding="UTF-8" ?>
2 <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
3 "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
4 <!-- namespace:表示名称空间。现在的目的是区分id的. -->
5 <mapper namespace="com.zhiyou100.zhl.dao.UsersDao">
6 <sql id="detail">
7 id,name,age,sex,day
8 </sql>
9
10 <select id="selByWhere" resultType="com.zhiyou100.zhl.bean.Users">
11 select * from users
12 <where>
13 <if test="name!=null">
14 and name=#{name}
15 </if>
16 <if test="sex!=null and sex!=''">
17 and sex=#{sex}
18 </if>
19 </where>
20 </select>
21
22 <update id="updateWhere">
23 update users
24 <set>
25 <if test="name!=null">
26 name=#{name},
27 </if>
28 <if test="sex!=null">
29 sex=#{sex},
30 </if>
31 <if test="age>0">
32 age=#{age},
33 </if>
34 <if test="day!=null">
35 day=#{day}
36 </if>
37 </set>
38 where id=#{id}
39 </update>
40
41 <select id="selByWhere2" resultType="com.zhiyou100.zhl.bean.Users">
42 select
43 <include refid="detail"/>
44 from users
45 <where>
46 <choose>
47 <when test="name!=null and name!=''">
48 name like concat('%',#{name},'%')
49 </when>
50 <when test="sex!=null and sex!=''">
51 sex=#{sex}
52 </when>
53 <otherwise>
54 age>=#{age}
55 </otherwise>
56 </choose>
57 </where>
58 </select>
59
60 <select id="selByWhere3" resultType="com.zhiyou100.zhl.bean.Users">
61 select
62 <include refid="detail"/>
63 from users
64 <trim prefix="where" prefixOverrides="and | or">
65 <if test="name!=null and name!=''">
66 and name=#{name}
67 </if>
68 <if test="sex!=null and sex!=''">
69 and sex=#{sex}
70 </if>
71 <if test="age>0">
72 and age=#{age}
73 </if>
74 <if test="day!=null and day!=''">
75 and day=#{day}
76 </if>
77 </trim>
78 </select>
79
80 <update id="updateWhere2">
81 update users
82 <trim prefix="set" suffixOverrides=",">
83 <if test="name!=null">
84 name=#{name},
85 </if>
86 <if test="sex!=null">
87 sex=#{sex},
88 </if>
89 <if test="age>0">
90 age=#{age},
91 </if>
92 <if test="day!=null">
93 day=#{day}
94 </if>
95 </trim>
96 where id=#{id}
97 </update>
98
99 <delete id="deleteByIds">
100 delete from users
101 <where>
102 <foreach collection="ids" open="id in(" close=")" separator="," item="id">
103 #{id}
104 </foreach>
105 </where>
106 </delete>
107
108
109 <delete id="deleteByIds2">
110 delete from users where id in
111 <foreach collection="ids" open="(" close=")" separator="," item="id">
112 #{id}
113 </foreach>
114 </delete>
115
116
117 </mapper>
Mybatis学习三(动态sql语句)的更多相关文章
- mybatis 学习五 动态SQL语句
3.1 selectKey 标签 在insert语句中,在Oracle经常使用序列.在MySQL中使用函数来自动生成插入表的主键,而且需要方法能返回这个生成主键.使用myBatis的selectKey ...
- Mybatis映射文件动态SQL语句-01
因为在很多业务逻辑复杂的项目中,往往不是简单的sql语句就能查询出来自己想要的数据,所有mybatis引入了动态sql语句, UserMapper.xml <?xml version=" ...
- mybatis学习之动态sql
mybatis的动态sql语句很强大,在mapper映射文件中使用简单的标签即可实现该效果,下面一个个记录: 1.select查询 简单的select类似如下: <select id=" ...
- mybatis中的动态SQL语句
有时候,静态的SQL语句并不能满足应用程序的需求.我们可以根据一些条件,来动态地构建 SQL语句. 例如,在Web应用程序中,有可能有一些搜索界面,需要输入一个或多个选项,然后根据这些已选择的条件去执 ...
- MyBatis之五:动态sql语句
在mybatis 3 或以上的版本提供了4类标签,分别是:if,choose(when,otherwise),rim(where,set),foreach.接下来将分别介绍这几种标签的具体用法,映射x ...
- mybatis学习 十 动态 SQL
1. 根据方法传入的参数不同执行不同的 SQL 命令.称为动态 SQL, MyBatis 中动态 SQL 就是在 mapper.xml 中添加逻辑判断等. 2. <if>标签 <s ...
- Mybatis学习笔记-动态SQL
概念 根据不同环境生成不同SQL语句,摆脱SQL语句拼接的烦恼[doge] 本质:SQL语句的拼接 环境搭建 搭建数据库 CREATE TABLE `blog`( `id` VARCHAR(50) N ...
- 阶段3 1.Mybatis_08.动态SQL_01.mybatis中的动态sql语句-if标签
创建新的工程 复制到新建的项目里面 pom.xml依赖部分复制过来 dao中整理代码 只保留四个查询 映射文件也只保留四个查询方法 增加一个根据条件查询的方法. 由于用了别名,所以parpameter ...
- Mybatis映射文件动态SQL语句-02
foreach UserMapper.xml <?xml version="1.0" encoding="UTF-8" ?> <!DOCTYP ...
- MyBatis学习 之 三、动态SQL语句
目录(?)[-] 三动态SQL语句 selectKey 标签 if标签 if where 的条件判断 if set 的更新语句 if trim代替whereset标签 trim代替set choose ...
随机推荐
- KGIS支持的扩展介绍
1.postgis postgis的基本核心功能,仅支持地理图形(矢量要素),在其他Extension前启用. 2.postgis_raster 对栅格数据的支持. 3.postgis_topolog ...
- FineReport 自定义工具栏样式
虽然FR界面的工具栏已经很商业化,很好看了,但是总会有那么些需求希望你可以修改工具栏的样式. 修改工具栏样式的主要思路是: 通过JQ选择器选中需要调整的元素,然后修改他们的样式 接下来,我们尝试着对工 ...
- 【Learning eBPF-2】eBPF 的“Hello world”
前一章讲了 eBPF 为什么这么吊,不理解没关系,现在开始,我们通过一个 "Hello world" 例子,来真正入门一下. BCC Python 框架是上手 eBPF 的最友好方 ...
- #原根,BSGS,扩欧,矩阵乘法#CF1106F Lunar New Year and a Recursive Sequence
题目 已知数列 \(f\) 满足 \(f_{1\sim k-1}=1\) 且 \(f_n=m\), 并且知道 \(f_i=(\prod_{j=1}^kf_{i-j}b_j)\bmod{99824435 ...
- #点分树#洛谷 6626 [省选联考 2020 B 卷] 消息传递
题目 多组数据多组询问,对于一个点 \(x\) 和 树上的距离 \(k\),问 \(\sum_{i=1}^n[Dis(x,i)==k]\) 分析 卡了一页的常,发现两个 \(\log\) 过不去,有一 ...
- #Kruskal,可撤销并查集#CF891C Envy
题目 给出一个 \(n\) 个点 \(m\) 条边的无向图,每条边有边权,共 \(Q\) 次询问, 每次给出 \(k_i\) 条边,问这些边能否同时在一棵最小生成树上. 分析 考虑最小生成树选择的边权 ...
- #交互,栈#LOJ 3005 「JOISC 2015 Day 4」Limited Memory
题目 分析 一开始想的是栈的匹配,但是位数不够,而且还忘记写memory.h, 考虑它询问次数不超过一万五千次,\(O(n^2)\)的询问是绰绰有余的, 如果每一个符号都能被匹配那整个串也能被匹配,而 ...
- vue3 快速入门系列 —— vue3 路由
vue3 快速入门系列 - vue3 路由 在vue3 基础上加入路由. vue3 需要使用 vue-router V4,相对于 v3,大部分的 Vue Router API 都没有变化. Tip:不 ...
- linux 性能自我学习 ———— cpu 切换带来的性能损耗 [二]
前言 我们知道现在操作系统,都是多进程和多线程,那么会有一个操作系统帮助我们去切换进程和线程,这个是要消耗cpu资源的,那么就来了解一下cpu资源消耗情况. 正文 一般是下面几个场景切换: 进程上下文 ...
- 重学c#系列——缓存[盛派源码分析cache](九)
前言 以前整理过缓存的东西在: https://www.cnblogs.com/aoximin/p/12727659.html 只是粗略的例子,因为真的要去介绍缓存这个东西,要从内存开始,是一个有时间 ...