【Mybatis】xml常用总结(持续更新)

目录

一、常用增删改查

查询(SELECT)操作

插入(INSERT)操作

更新(UPDATE)操作

删除(DELETE)操作

批量插入(INSERT)操作

批量删除(DELETE)操作

批量更新(UPDATE)操作

参数传递

结果映射

动态SQL

二、常用关键词总结

关键字表格总结

SQL举例

三、其他一些总结

处理数据转数据

生成指定表的insert语句


一、常用增删改查

下面是关于MyBatis XML配置中增删改查以及批量操作的常用写法总结:

查询(SELECT)操作

<select id="getUserById" resultType="com.example.User">SELECT * FROM users WHERE id = #{id}
</select><select id="queruByIds" parameterType="com.example.User" resultType="com.example.User">SELECT *where id in<foreach collection="list" item="item" open="(" close=")" separator=",">#{item}</foreach>;
</select>

这个示例中,`getUserById`是查询操作的唯一标识符,`resultType`指定了返回结果的类型。

插入(INSERT)操作

<insert id="insertUser" parameterType="com.example.User">INSERT INTO users (id, name, email) VALUES (#{id}, #{name}, #{email})
</insert>

这个示例中,`insertUser`是插入操作的唯一标识符,`parameterType`指定了传入参数的类型。

更新(UPDATE)操作

<update id="updateUser" parameterType="com.example.User">UPDATE users SET name = #{name}, email = #{email} WHERE id = #{id}
</update>

这个示例中,`updateUser`是更新操作的唯一标识符,`parameterType`指定了传入参数的类型。

删除(DELETE)操作

<delete id="deleteUserById" parameterType="int">DELETE FROM users WHERE id = #{id}
</delete>

这个示例中,`deleteUserById`是删除操作的唯一标识符,`parameterType`指定了传入参数的类型。

批量插入(INSERT)操作

<insert id="batchInsert" parameterType="java.util.List">INSERT INTO users (id, name, email)VALUES<foreach collection="list" item="user" separator=",">(#{user.id}, #{user.name}, #{user.email})</foreach>
</insert>

这个示例中,`insertUsers`是批量插入操作的唯一标识符,`parameterType`指定了传入参数的类型。使用`<foreach>`标签来循环遍历传入的列表进行批量插入。

批量删除(DELETE)操作

<delete id="deleteUsersByIds" parameterType="java.util.List">DELETE FROM users WHERE id IN<foreach collection="list" item="id" open="(" close=")" separator=",">#{id}</foreach>
</delete><update id="batchDel">update table_name set deleted = 1where deleted = 0<if test="list!=null and list.size != 0 ">and id in<foreach collection="list" item="item" open="(" separator="," close=")">#{item}</foreach></if>
</update>

这个示例中,`deleteUsersByIds`是批量删除操作的唯一标识符,`parameterType`指定了传入参数的类型。使用`<foreach>`标签来循环遍历传入的列表进行批量删除。

批量更新(UPDATE)操作

<update id="updateUsers" parameterType="java.util.List"><foreach collection="list" item="user" separator=";">UPDATE users SET name = #{user.name}, email = #{user.email} WHERE id = #{user.id}</foreach>
</update>

这个示例中,`updateUsers`是批量更新操作的唯一标识符,`parameterType`指定了传入参数的类型。使用`<foreach>`标签来循环遍历传入的列表进行批量更新。

参数传递

在上述示例中,使用了`#{parameter}`语法来引用传入的参数。例如,`#{id}`引用了传入参数中的`id`字段。

结果映射

使用`resultType`指定查询结果的类型,或者使用`resultMap`来进行更复杂的结果映射。

动态SQL

MyBatis支持动态SQL,可以根据条件生成不同的SQL语句。例如,使用`<if>`、`<choose>`、`<when>`和`<otherwise>`等标签来编写动态SQL。

这些是一些常用的MyBatis XML配置写法总结,涵盖了增删改查等操作。您可以根据具体需求和情况进行相应的配置和使用。

二、常用关键词总结

关键字表格总结

关键字释义简单SQL示例
SELECT从数据库中检索数据SELECT * FROM 表名;
INSERT将数据插入到表中INSERT INTO 表名 (列1, 列2) VALUES (值1, 值2);
UPDATE更新表中的数据UPDATE 表名 SET 列名 = 值 WHERE 条件;
DELETE从表中删除数据DELETE FROM 表名 WHERE 条件;
CREATE创建新的表、视图等CREATE TABLE 表名 (列1 数据类型, 列2 数据类型);
ALTER修改现有表的结构ALTER TABLE 表名 ADD 列名 数据类型;
DROP删除表、视图等DROP TABLE 表名;
TRUNCATE快速删除表中数据TRUNCATE TABLE 表名;
FROM指定数据源表SELECT * FROM 表名;
WHERE指定查询条件SELECT * FROM 表名 WHERE 条件;
GROUP BY对结果进行分组SELECT 列名, COUNT(*) FROM 表名 GROUP BY 列名;
HAVING对分组结果进行条件过滤SELECT 列名, COUNT(*) FROM 表名 GROUP BY 列名 HAVING 条件;
ORDER BY对结果进行排序SELECT * FROM 表名 ORDER BY 列名 ASC/DESC;
JOIN将多个表连接起来查询SELECT * FROM 表1 JOIN 表2 ON 表1.列 = 表2.列;
UNION合并多个查询结果集SELECT 列名 FROM 表1 UNION SELECT 列名 FROM 表2;
DISTINCT返回唯一的查询结果SELECT DISTINCT 列名 FROM 表名;
INDEX创建索引以提高查询性能CREATE INDEX 索引名 ON 表名 (列名);
PRIMARY KEY定义表中的主键CREATE TABLE 表名 (列1 数据类型 PRIMARY KEY, 列2 数据类型);
FOREIGN KEY定义表之间的外键关系CREATE TABLE 表1 (列1 数据类型, 列2 数据类型, FOREIGN KEY (列1) REFERENCES 表2(列2));
CONSTRAINT定义表的约束条件CREATE TABLE 表名 (列1 数据类型, 列2 数据类型, CONSTRAINT 约束名 PRIMARY KEY (列1));
LIMIT限制查询结果的数量SELECT * FROM 表名 LIMIT 数量;
OFFSET偏移查询结果的行数SELECT * FROM 表名 LIMIT 数量 OFFSET 偏移量;
BETWEEN在范围内进行条件判断SELECT * FROM 表名 WHERE 列名 BETWEEN 值1 AND 值2;
IN在一组值中进行条件判断SELECT * FROM 表名 WHERE 列名 IN (值1, 值2, 值3);
LIKE根据模式匹配进行条件判断SELECT * FROM 表名 WHERE 列名 LIKE '模式';
NOT对条件取反SELECT * FROM 表名 WHERE NOT 条件;
IS NULL判断值是否为空SELECT * FROM 表名 WHERE 列名 IS NULL;
EXISTS判断子查询是否返回结果SELECT * FROM 表1 WHERE EXISTS (SELECT * FROM 表2 WHERE 条件);
CASE条件表达式SELECT 列名, CASE WHEN 条件 THEN 值 ELSE 值 END AS 别名 FROM 表名;
WHENCASE语句中的条件SELECT 列名, CASE 列名 WHEN 值1 THEN 值2 WHEN 值3 THEN 值4 ELSE 值5 END AS 别名 FROM 表名;
THENCASE语句中的结果SELECT 列名, CASE WHEN 条件 THEN 值1 ELSE 值2 END AS 别名 FROM 表名;
ELSECASE语句中的默认结果SELECT 列名, CASE WHEN 条件 THEN 值 ELSE 值 END AS 别名 FROM 表名;
ENDCASE语句结束标记SELECT 列名, CASE WHEN 条件 THEN 值1 ELSE 值2 END AS 别名 FROM 表名;
AS为列或表起别名SELECT 列名 AS 别名 FROM 表名;
ON指定连接条件SELECT * FROM 表1 JOIN 表2 ON 表1.列 = 表2.列;
ASC升序排序SELECT * FROM 表名 ORDER BY 列名 ASC;
DESC降序排序SELECT * FROM 表名 ORDER BY 列名 DESC;
AVG计算平均值SELECT AVG(列名) FROM 表名;
SUM计算总和SELECT SUM(列名) FROM 表名;
COUNT计算行数SELECT COUNT(*) FROM 表名;
MAX计算最大值SELECT MAX(列名) FROM 表名;
MIN计算最小值SELECT MIN(列名) FROM 表名;
IFNULL判断并返回非空值SELECT IFNULL(列名, 替代值) FROM 表名;
COALESCE返回第一个非空值SELECT COALESCE(列1, 列2, 列3) FROM 表名;
DATE提取日期部分SELECT DATE(列名) FROM 表名;
NOW返回当前日期和时间SELECT NOW();
CURDATE返回当前日期SELECT CURDATE();
CURTIME返回当前时间SELECT CURTIME();
YEAR提取年份部分SELECT YEAR(列名) FROM 表名;
MONTH提取月份部分SELECT MONTH(列名) FROM 表名;
DAY提取天数部分SELECT DAY(列名) FROM 表名;
HOUR提取小时部分SELECT HOUR(列名) FROM 表名;
MINUTE提取分钟部分SELECT MINUTE(列名) FROM 表名;
SECOND提取秒数部分SELECT SECOND(列名) FROM 表名;
CONCAT连接字符串SELECT CONCAT(列1, 列2) FROM 表名;
SUBSTRING提取子字符串SELECT SUBSTRING(列名, 开始位置, 长度) FROM 表名;
LENGTH计算字符串长度SELECT LENGTH(列名) FROM 表名;
UPPER转换为大写字母SELECT UPPER(列名) FROM 表名;
LOWER转换为小写字母SELECT LOWER(列名) FROM 表名;
TRIM去除字符串两端的空格SELECT TRIM(列名) FROM 表名;

SQL举例

<select id="select"resultType="com.god.demo.app.entity.vo.DemoVo"parameterType="com.god.demo.app.entity.dto.DemoDTO">SELECT-- 加序号 @i := @i + 1 AS row,( SELECT @i := 0 ) r@i := @i + 1 AS row,ac.`name` companyName,ac.`name` nnn,ad.`name` departmentName,sus.userName creatorName,-- case when then else endCASEWHEN NOW() &lt;= su.effective_start_time THEN "未生效"WHEN NOW() &gt;= su.effective_start_time AND NOW() &lt; su.effective_end_time THEN "生效中"WHEN NOW() &gt;= su.effective_end_time THEN "已过期"ELSE NULLEND effectiveStatus,concat( TRUNCATE ( IFNULL( su.user_integral / su.user_integral, 0 ) * 100, 2 ), '%' ) ratio,-- 想要的时间格式DATE_FORMAT( su.create_time, '%Y-%m-%d %H:%I:%s' ) createTime1,DATE_FORMAT( su.create_time, '%Y-%m-%d %H:%I' ) createTime2,DATE_FORMAT( su.create_time, '%Y-%m-%d %H' ) createTime3,DATE_FORMAT( su.create_time, '%Y-%m-%d' ) createTime4,DATE_FORMAT( su.create_time, '%Y-%m' ) createTime5,DATE_FORMAT( su.create_time, '%Y' ) createTime6,-- 关联俩字段concat_ws( '-', su.create_time, su.create_time ) time,-- 符号转义方法1:<![CDATA[< ]]>CASEWHEN su.user_integral <![CDATA[< ]]> 1000 THEN '普通会员'WHEN su.user_integral <![CDATA[>=  1000 AND su.user_integral <= ]]> 10000 THEN '黄金会员'WHEN su.user_integral <![CDATA[>=  10000 AND su.user_integral <= ]]> 20000 THEN '钻石会员'WHEN su.user_integral <![CDATA[>= ]]> 20000 THEN '星钻会员'ELSE '普通用户' END integralLevel,su.overage amount,su.*FROMsys_user suLEFT JOIN app_company ac ON su.company_id = ac.idLEFT JOIN app_department ad ON su.department_id = ad.idLEFT JOIN (SELECT s.id, s.`name` userName FROM sys_user s WHERE s.del_flag = '0' AND s.`status` = '1' ANDDATE_FORMAT( s.create_time, '%Y' )= '2020' ) sus ON su.creator_id = sus.id,( SELECT @i := 0 ) r<where>su.del_flag='0'<if test="companyId != null and companyId !=''">AND su.company_id=#{companyId}</if><if test="departmentId != null and departmentId !=''">AND su.department_id=#{departmentId}</if><if test="postId != null and postId !=''">AND su.post_id=#{postId}</if><if test="level != null and level !=''">AND su.user_level=#{level}</if>-- 模糊比较<if test="name != null and name !=''">AND su.name like CONCAT('%', #{name,jdbcType=VARCHAR}, '%')</if><if test="email != null and email !=''">AND su.email like CONCAT('%', #{email,jdbcType=VARCHAR}, '%')</if><if test="phone != null and phone !=''">AND su.phone like CONCAT('%', #{phone}, '%')</if>-- 字符转义1: <![CDATA[< ]]><if test="businessStartDate != null">and t.business_date <![CDATA[>= ]]> #{businessStartDate}</if><if test="businessStartDate != null">and t.business_date >= #{businessStartDate}</if><if test="businessEndDate != null">and <![CDATA[ t.business_date <= #{businessEndDate} ]]></if>-- 字符转义2 &lt; &gt;<if test="age != null and age != ''">and age &gt;= #{age}</if>-- 数组判空<if test="phoneArray != null and phoneArray.length > 0">and 1=1</if>-- 集合判空<if test="phoneList != null and phoneList.size() > 0">AND su.phone in<foreach collection="phoneList" index="index" item="item" open="(" separator="," close=")">#{item}</foreach></if><if test="statusList!=null">and status in<foreach collection="statusList" item="item" open="(" separator="," close=")">#{item}</foreach></if>-- 集合模糊匹配<if test="happys != null  and happys.size != 0">and<foreach collection="happys" item="happy" open="(" separator=" or " close=")">happy like concat('%', #{happy}, '%')</foreach></if><include refid="Base_date_param"/></where>ORDER BYsu.create_time</select>

三、其他一些总结

处理数据转数据

<insert id="insertUser">INSERT INTO demo1 ( `id`, `name`, `age`, `company`, `department`, `level`, `deleted` ) SELECT`c_id` id,`first_name` NAME,18 age,"阿凡哒" company,"xx" department,1 LEVEL,'0' deletedFROMdemo2WHEREdeleted = '0'</insert>

生成指定表的insert语句

SELECTCONCAT( 'INSERT INTO table_name (id,name,age,company,department,deleted) VALUES(', id, ', "', NAME, '", "', age, '", "', company, '", "', department, '", ', deleted, ');' ) AS insert_statement 
FROMtable_name 
WHEREdeleted = 0;

欢迎大佬们留言补充!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/131007.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

2024天津理工大学中环信息学院专升本机械设计制造自动化专业考纲

2024年天津理工大学中环信息学院高职升本科《机械设计制造及其自动化》专业课考试大纲《机械设计》《机械制图》 《机械设计》考试大纲 教 材&#xff1a;《机械设计》&#xff08;第十版&#xff09;&#xff0c;高等教育出版社&#xff0c;濮良贵、陈国定、吴立言主编&#…

LeeCode每日一题:208. 实现 Trie (前缀树)

Trie&#xff08;发音类似 "try"&#xff09;或者说 前缀树 是一种树形数据结构&#xff0c;用于高效地存储和检索字符串数据集中的键。这一数据结构有相当多的应用情景&#xff0c;例如自动补完和拼写检查。 请你实现 Trie 类&#xff1a; Trie() 初始化前缀树对象…

1.如何实现统一的API前缀-web组件篇

文章目录 1. 问题的由来2.实现原理3. 总结 1. 问题的由来 系统提供了 2 种类型的用户&#xff0c;分别满足对应的管理后台、用户 App 场景。 两种场景的前缀不同&#xff0c;分别为/admin-api/和/app-api/&#xff0c;都写在一个controller里面&#xff0c;显然比较混乱。分开…

JavaScript模板方法模式

JavaScript模板方法模式 1 什么是模板方法模式2 Coffee or Tea3 钩子方法4 好莱坞原则 1 什么是模板方法模式 模板方法模式是一种只需使用继承就可以实现的模式。 模板方法模式由两部分结构组成&#xff0c;第一部分是抽象父类&#xff0c;第二部分是具体的实现子类。 通常在…

AI:60-基于深度学习的瓜果蔬菜分类识别

🚀 本文选自专栏:AI领域专栏 从基础到实践,深入了解算法、案例和最新趋势。无论你是初学者还是经验丰富的数据科学家,通过案例和项目实践,掌握核心概念和实用技能。每篇案例都包含代码实例,详细讲解供大家学习。 📌📌📌在这个漫长的过程,中途遇到了不少问题,但是…

力扣第139题 单词拆分 c++ 附java代码 动态规划题型

题目 时间复杂度为O(n^2)&#xff0c;其中n为字符串s的长度。这是因为我们需要遍历字符串s的每个位置&#xff0c;对于每个位置i&#xff0c;又需要从0到i-1的位置进行遍历&#xff0c;因此总的时间复杂度为O(n^2)。 空间复杂度为O(n)&#xff0c;其中n为字符串s的长度。这是因…

网络基础扫盲-多路转发

博客内容&#xff1a;多路转发的常见方式select&#xff0c;poll&#xff0c;epoll 文章目录 一、五种IO模型二、多路转发的常见接口1.select2、poll3、epoll 总结 前言 Linux下一切皆文件&#xff0c;是文件就会存在IO的情况&#xff0c;IO的方式决定了效率的高低。 一、五种…

docker的使用以及注意事项

ssh的登录 1.登录ssh ssh 用户名IP地址 2.生成密钥 ssh-keygen生成密钥&#xff0c;在.ssh文件夹中&#xff08;如果没有自己生成一个&#xff09; 如果密钥之前已经生成过&#xff0c;可能在配置git的时候&#xff0c;会报错:这个密钥已经使用过的报错 解决方法是:otherwise[…

基于java+springboot+vue在线选课系统

项目介绍 本系统结合计算机系统的结构、概念、模型、原理、方法&#xff0c;在计算机各种优势的情况下&#xff0c;采用JAVA语言&#xff0c;结合SpringBoot框架与Vue框架以及MYSQL数据库设计并实现的。员工管理系统主要包括个人中心、课程管理、专业管理、院系信息管理、学生…

随机微分方程的分数扩散模型 (score-based diffusion model) 代码示例

随机微分方程的分数扩散模型&#xff08;Score-Based Generative Modeling through Stochastic Differential Equations&#xff09; 基于分数的扩散模型&#xff0c;是估计数据分布梯度的方法&#xff0c;可以在不需要对抗训练的基础上&#xff0c;生成与GAN一样高质量的图片。…

Cube MX 开发高精度电流源跳坑过程/SPI连接ADS1255/1256系列问题总结/STM32 硬件SPI开发过程

文章目录 概要整体架构流程技术名词解释技术细节小结 概要 1.使用STM32F系列开发一款高精度恒流电源&#xff0c;用到了24位高精度采样芯片ADS1255/ADS1256系列。 2.使用时发现很多的坑&#xff0c;详细介绍了每个坑的具体情况和实际的解决办法。 坑1&#xff1a;波特率设置…

如何使用Ruby 多线程爬取数据

现在比较主流的爬虫应该是用python&#xff0c;之前也写了很多关于python的文章。今天在这里我们主要说说ruby。我觉得ruby也是ok的&#xff0c;我试试看写了一个爬虫的小程序&#xff0c;并作出相应的解析。 Ruby中实现网页抓取&#xff0c;一般用的是mechanize&#xff0c;使…

Pytorch从零开始实战08

Pytorch从零开始实战——YOLOv5-C3模块实现 本系列来源于365天深度学习训练营 原作者K同学 文章目录 Pytorch从零开始实战——YOLOv5-C3模块实现环境准备数据集模型选择开始训练可视化模型预测总结 环境准备 本文基于Jupyter notebook&#xff0c;使用Python3.8&#xff0c…

webJS基础-----制作一个时间倒计时

1&#xff0c;可以使用以下两个方式制作 方式1&#xff1a;setTimeout ()定时器是在指定的时间后执行某些代码&#xff0c;代码执行一次就会自动停止&#xff1b; 方式2&#xff1a;setInterval ()定时器是按照指定的周期来重复执行某些代码&#xff0c;该定时器不会自动停止…

DL Homework 6

目录 一、概念 &#xff08;1&#xff09;卷积 &#xff08;2&#xff09;卷积核 &#xff08;3&#xff09;特征图 &#xff08;4&#xff09;特征选择 &#xff08;5&#xff09;步长 &#xff08;6&#xff09;填充 &#xff08;7&#xff09;感受野 二、探究不同卷…

【开题报告】基于uniapp的在线考试小程序的设计与实现

1.研究背景 随着社会的发展和科技的进步&#xff0c;网络技术被广泛应用于教育领域。在线教育已成为当今发展趋势之一&#xff0c;其中在线考试更是具有重要的意义。传统的考试方式不仅耗费大量人力物力&#xff0c;而且存在考试成果的保密问题。而在线考试可以使考试过程更加…

JVM运行时数据区-堆

目录 一、堆的核心概述 &#xff08;一&#xff09;概述 &#xff08;二&#xff09;堆空间细分 &#xff08;三&#xff09;jvisualvm工具 二、设置堆内存的大小与OOM 三、年轻代与老年代 四、图解对象分配一般过程 五、对象分配特殊过程 六、常用调优工具 七、Mino…

手搓一个ubuntu自动安装python3.9的sh脚本

#!/bin/bash# Step 1: 更新系统软件包 sudo apt update sudo apt upgrade -y sudo apt install -y software-properties-common# Step 2: 安装Python 3.9的依赖项 sudo apt install -y build-essential zlib1g-dev libncurses5-dev libgdbm-dev libnss3-dev libssl-dev libread…

leetCode 416.分割等和子集 + 01背包 + 动态规划 + 记忆化搜索 + 递推 + 空间优化

关于此题我的往期文章&#xff1a; LeetCode 416.分割等和子集&#xff08;动态规划【0-1背包问题】采用一维数组dp:滚动数组&#xff09;_呵呵哒(&#xffe3;▽&#xffe3;)"的博客-CSDN博客https://heheda.blog.csdn.net/article/details/133212716看本期文章时&…

使用udevdm查询蓝牙模块的信息

1.首先查询蓝牙设备在系统中的设备路径 udevadm info --querypath -n /dev/ttyS1 2.查询蓝牙设备的所有信息包括父设备信息 EMUELEC:~ # udevadm info -ap /devices/platform/ffd24000.serial/tty/ttyS1 备注&#xff1a;查询设备所有信息 udevadm info --queryall -n /dev…