Mybaties——动态sql
动态 SQL 是 MyBatis 的强大特性之一。如果你使用过 JDBC 或其它类似的框架,你应该能理解根据不同条件拼接 SQL 语句有多痛苦,例如拼接时要确保不能忘记添加必要的空格,还要注意去掉列表最后一个列名的逗号。利用动态 SQL,可以彻底摆脱这种痛苦。
如果你之前用过 JSTL 或任何基于类 XML 语言的文本处理器,你对动态 SQL 元素可能会感觉似曾相识。在 MyBatis 之前的版本中,需要花时间了解大量的元素。借助功能强大的基于 OGNL 的表达式,MyBatis 3 替换了之前的大部分元素,大大精简了元素种类,现在要学习的元素种类比原来的一半还要少。
- if
- choose (when, otherwise)
- trim (where, set)
- foreach
理解:在sql层面执行逻辑代码
if
根据不同的条件(包括无条件)进行查询,大大降低了代码的冗余
<select id="queryByIf" parameterType="map" resultType="userBean">
SELECT * FROM user WHERE 1=1
<if test="UId != null">
AND UId = #{UId}
</if>
<if test="UName != null">
AND UName = #{UName}
</if>
</select>
注:(1).这里resultType写的是集合中的元素类型,并不是集合本身
(2).test中的条件可以通过and连接chose,when,otherwise
我们不想使用所有的条件,而只是想从多个条件中选择一个使用。
<select id="queryByIf" parameterType="map" resultType="userBean">
SELECT * FROM user WHERE
<choose>
<when test="UId != null">
UId = #{UId}
</when>
<when test="UName != null">
UName = #{UName}
</when>
<otherwise>
1=1
</otherwise>
</choose>
</select>
注:这个语句类似swith,choose->switch,when->case,otherwise->default
trim、where、set
where 元素只会在子元素返回任何内容的情况下才插入 “WHERE” 子句。而且,若子句的开头为 “AND” 或 “OR”,where 元素也会将它们去除。
set 元素会动态地在行首插入 SET 关键字,并会删掉额外的逗号(这些逗号是在使用条件语句给列赋值时引入的)。
trim可以完成对两者的实现与优化
where使用:
<select id="queryByIf" parameterType="map" resultType="userBean">
SELECT * FROM user
<where>
<if test="UName != null">
AND UState = #{UState}
</if>
<choose>
<when test="UId != null">
AND UId = #{UId}
</when>
<otherwise>
AND 1=1
</otherwise>
</choose>
</where>
</select>
注:这里的where写了之后,原句中的where就不用写了,在代码运行过程,where标签能够自动补上where,并且去除不需要的AND(不会补上)
set使用:
<update id="updateById" parameterType="map">
UPDATE user
<set>
<if test="UState != null">UState = #{UState},</if>
<choose>
<when test="UName != null">
UName = #{UName},
</when>
<when test="USet != null">
USet = #{USet},
</when>
</choose>
</set>
WHERE UId = #{UId}
</update>
注:这里的set写了之后,原句中的set也会自动补全,并且去除不需要的','(不会补上)
trim的定义格式:
实现where
<trim prefix="WHERE" prefixOverrides="AND |OR ">
...
</trim>
实现set
<trim prefix="SET" suffixOverrides=",">
...
</trim>
foreach使用
动态 SQL 的另一个常见使用场景是对集合进行遍历(尤其是在构建 IN 条件语句的时候)
<select id="queryListByForeach" parameterType="map" resultType="userBean">
SELECT * FROM user
<where>
<foreach collection="USets" item="item" open="(" separator="OR" close=")">
USet = #{item}
</foreach>
</where>
</select>
说明:主要解释一下foreach中的几个参数,这里collection是map中的一个集合,Uset为集合中的一个参数(名字随意),open定义了迭代开始所放置的字符串,separator定义的是迭代时的分隔符,close定义了迭代结束放置的字符串
补充:sql片段
类似于前端组件的概念
通过<sql id="">定义组件,通过<include refid="">引用组件
注意:
(1). 最好基于单表来定义SQL片段
(2). 不要存在where标签
Mybaties——动态sql的更多相关文章
- 小D课堂-SpringBoot 2.x微信支付在线教育网站项目实战_3-4.动态Sql语句Mybaties SqlProvider
笔记 4.动态Sql语句Mybaties SqlProvider 简介:讲解什么是动态sql,及使用 1. @UpdateProvider(type=VideoSqlP ...
- 值得注意的ibatis动态sql语法格式
一.Ibatis常用动态sql语法,简单粗暴用一例子 <select id="iBatisSelectList" parameterClass="java.util ...
- Mysql - 游标/动态sql/事务
游标这个在我目前的项目里面用的还不多, 但是其功能还是很强大的. 动态sql以前都没用过, 是跟着富士康(不是张全蛋的富土康哦)过来的同事学的. 还是挺好用的. 我的数据库方面, 跟他学了不少. 在此 ...
- MyBatis4:动态SQL
什么是动态SQL MyBatis的一个强大特性之一通常是它的动态SQL能力.如果你有使用JDBC或其他相似框架的经验,你就明白条件串联SQL字符串在一起是多么地痛苦,确保不能忘了空格或者在列表的最后的 ...
- 分享公司DAO层动态SQL的一些封装
主题 公司在DAO层使用的框架是Spring Data JPA,这个框架很好用,基本不需要自己写SQL或者HQL就能完成大部分事情,但是偶尔有一些复杂的查询还是需要自己手写原生的Native SQL或 ...
- MySQL存储过程动态SQL语句的生成
用Mysql存储过程来完成动态SQL语句,使用存储过程有很好的执行效率: 现在有要求如下:根据输入的年份.国家.节假日类型查询一个节假日,我们可以使用一般的SQL语句嵌入到Java代码中,但是执行效率 ...
- 【Java EE 学习 79 下】【动态SQL】【mybatis和spring的整合】
一.动态SQL 什么是动态SQL,就是在不同的条件下,sql语句不相同的意思,曾经在“酒店会员管理系统”中写过大量的多条件查询,那是在SSH的环境中,所以只能在代码中进行判断,以下是其中一个多条件查询 ...
- 自定义函数执行动态sql语句
--函数中不能调用动态SQL,使用用存储过程吧.如果还要对函数做其他操作,换成存储过程不方便,可以考虑把其他操作一起封装在存储过程里面.如: create proc [dbo].[FUN_YSCL ...
- mybatis入门基础(五)----动态SQL
一:动态SQL 1.1.定义 mybatis核心对sql语句进行灵活操作,通过表达式进行判断,对sql进行灵活拼接.组装. 1.2.案例需求 用户信息综合查询列表这个statement的定义使用动态s ...
随机推荐
- 痞子衡嵌入式:揭秘i.MXRT1060,1010上串行NOR Flash冗余程序启动设计
大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是i.MXRT1060,1010上串行NOR Flash冗余程序启动设计. 工业产品设计里经常会有冗余程序/备份程序设计的需求,因为在工业 ...
- Java中的equals和==的区别以及几个常用的object中的方法简单的调试方法
一.equals 1.equals:是Object类中的方法,只能判断引用类型 2.默认判断的是地址是否相等(判断两个参数是否是同一个对象),子类中往往重写该方法,用于判断内容(值)是否相等 二.== ...
- CentOS虚拟机关闭防火墙
关闭防火墙 systemctl stop firewalld 关闭防火墙开机自启动 systemctl disable firewalld 关闭安全机制,将selinux设置为disabled vi ...
- ASP.NET Core 6框架揭秘实例演示[02]:基于路由、MVC和gRPC的应用开发
ASP.NET Core可以视为一种底层框架,它为我们构建出了基于管道的请求处理模型,这个管道由一个服务器和多个中间件构成,而与路由相关的EndpointRoutingMiddleware和Endpo ...
- python内置模块之re模块
内容概要 re模块常用方法 findall search match re模块其他方法 split sub subn compile finditer findall 对无名分组优先展示 re实战之爬 ...
- Java 位运算总结
一.Java中支持的位运算 位与(&):二元运算符,两个为1时结果为1,否则为0 位或(|):二元运算符,两个其中有一个为1时结果就为1,否则为0 位异或(^):二元运算符,两个数同时为1或0 ...
- 【流行前沿】联邦学习 Federated Learning with Only Positive Labels
核心问题:如果每个用户只有一类数据,如何进行联邦学习? Felix X. Yu, , Ankit Singh Rawat, Aditya Krishna Menon, and Sanjiv Kumar ...
- [自动化]基于kolla-ceph的自动化部署ceph集群
kolla-ceph来源: 项目中的部分代码来自于kolla和kolla-ansible kolla-ceph的介绍: 1.镜像的构建很方便, 基于容器的方式部署,创建.删除方便 2.kolla-ce ...
- 【计理01组30号】Java 实现日记写作软件
项目分析 代码设计 com.shiyanlou.entity User.java package com.shiyanlou.entity; public class User { private S ...
- 【C# Task】System.Threading.Channels 生产者和消费者模式
前言 今天给大家分享一个微软官方的生产者/消费者方案的特性解决:Channel. Channel在% dotnet add package System.Threading.Channels 而在Co ...