多种MyBatis写法(数据库操作)
MyBatis,这个从iBatis演变而来的Java持久层框架,凭借其强大的功能和性能,早已成为企业级应用的首选。本文展示几种MyBatis写法,保证数据库操作既高效又灵活。
1. 批量操作
批量操作是提升数据库操作效率的重要手段。MyBatis提供了标签,可以轻松实现批量插入、更新或删除操作。
批量插入:
<insert id="batchInsert" parameterType="java.util.List">INSERT INTO user (username, email, create_time)VALUES<foreach collection="list" item="item" separator=",">(#{item.username}, #{item.email}, #{item.createTime})</foreach>
</insert>
批量更新:
<update id="batchUpdate" parameterType="java.util.List"><foreach collection="list" item="item" separator=";">UPDATE userSET username=#{item.username}, email = #{item.email}WHERE id=#{item.id}</foreach>
</update>
批量删除:
<delete id="batchDelete" parameterType="java.util.List">DELETE FROM userWHERE id IN<foreach collection="list" item="id" open="(" separator="," close=")">#{id}</foreach>
</delete>
2. 动态SQL
动态SQL是MyBatis的强大特性之一,它允许你根据不同的条件动态构建SQL语句。标签是实现动态SQL的核心。
动态查询:
<select id="findUsers" resultType="User">SELECT * FROM user WHERE 1=1<if test="username != null and username != ''">AND username LIKE CONCAT('%', #{username}, '%')</if><if test="email != null and email != ''">AND email = #{email}</if><if test="status != null">AND status = #{status}</if>
</select>
多条件分支查询:
<select id="findUsersByCondition" resultType="User">SELECT * FROM user WHERE 1=1<choose><when test="searchType == 'username'">AND username LIKE CONCAT('%', #{keyword}, '%')</when><when test="searchType == 'email'">AND email LIKE CONCAT('%', #{keyword}, '%')</when><otherwise>AND (username LIKE CONCAT('%', #{keyword}, '%') OR email LIKE CONCAT('%', #{keyword}, '%'))</otherwise></choose>
</select>
3. SQL语句优化
标签可以帮助你优化生成的SQL语句,避免多余的AND或OR关键字。
优化示例:
<select id="findUsers" resultType="User">SELECT * FROM user<trim prefix="WHERE" prefixOverrides="AND |OR "><if test="username != null and username != ''">AND username LIKE CONCAT('%', #{username}, '%')</if><if test="email != null and email != ''">AND email = #{email}</if><if test="status != null">AND status = #{status}</if></trim>
</select>
4. 自动生成主键
在插入操作中,我们经常需要获取数据库自动生成的主键。MyBatis提供了标签来实现这一功能。
自动生成主键:
<insert id="insertUser" parameterType="User" useGeneratedKeys="true" keyProperty="id"><selectKey keyProperty="id" order="AFTER" resultType="java.lang.Long">SELECT LAST_INSERT_ID()</selectKey>INSERT INTO user (username, email, create_time) VALUES (#{username}, #{email}, #{createTime})
</insert>
5. 使用注解
除了XML配置,MyBatis还支持使用注解来定义SQL操作,这种方式使代码更加简洁。
使用注解查询用户:
@Mapper
public interface UserMapper {@Select("SELECT * FROM user WHERE id = #{id}")User selectUserById(@Param("id") Integer id);
}
6. 关联查询
MyBatis支持多种关联查询方式,包括嵌套查询和延迟加载。
嵌套查询:
<select id="selectUserWithOrders" resultMap="userOrderResultMap">SELECT * FROM users WHERE id = #{id}
</select>
<resultMap id="userOrderResultMap" type="User"><id property="id" column="id"/><result property="name" column="name"/><collection property="orders" ofType="Order" select="selectOrdersByUserId" column="id"/>
</resultMap>
<select id="selectOrdersByUserId" resultType="Order">SELECT * FROM orders WHERE user_id = #{userId}
</select>
延迟加载: 在MyBatis配置文件中启用延迟加载,可以减少数据库的访问次数。
<settings><setting name="lazyLoadingEnabled" value="true"/><setting name="aggressiveLazyLoading" value="false"/>
</settings>
7. 插件扩展
通过拦截器,MyBatis允许你实现插件,改变其默认行为。插件通过实现Interceptor接口,拦截SQL执行过程中的四个接口:Executor、StatementHandler、ResultSetHandler和ParameterHandler。
自定义插件:
@Intercepts({@Signature(type = StatementHandler.class, method = "parameterize", args = java.sql.Statement.class)})
public class MyPlugin implements Interceptor {@Overridepublic Object intercept(Invocation invocation) throws Throwable {System.out.println("=========MyPlugin========");return invocation.proceed();}@Overridepublic Object plugin(Object target) {return Plugin.wrap(target, this);}@Overridepublic void setProperties(Properties properties) {}
}
在全局配置文件中注册插件:
<plugins><plugin interceptor="com.fly.plugin.MyPlugin"/>
</plugins>
8. 其他常用写法
更新操作:
<update id="updateUser" parameterType="User">UPDATE users <trim prefix="SET" suffixOverrides=","><if test="name != null">name = #{name},</if><if test="age != null">age = #{age},</if></trim> WHERE id=#{id}
</update>
删除操作:
<delete id="deleteUserById" parameterType="int">DELETE FROM user WHERE id = #{id}
</delete>
查询操作:
<select id="selectUserByUsername" parameterType="String" resultType="User">SELECT * FROM user WHERE username = #{username}
</select>
插入操作:
<insert id="insertUser" parameterType="User">INSERT INTO user (username, email, create_time) VALUES (#{username}, #{email}, #{createTime})
</insert>
多表查询(一对一):
<select id="selectOrderWithUser" resultType="Order">SELECT o.*, u.username, u.emailFROM orders oLEFT JOIN users u ON o.user_id = u.idWHERE o.id = #{id}
</select>
多表查询(一对多):
<select id="selectUserWithOrders" resultType="User">SELECT u.*, GROUP_CONCAT(o.order_id) as orderIdsFROM users uLEFT JOIN orders o ON u.id = o.user_idGROUP BY u.id
</select>
多表查询(多对多):
<select id="selectStudentsWithCourses" resultType="Student">SELECT s.*, GROUP_CONCAT(c.course_name) as courseNamesFROM students sLEFT JOIN student_courses sc ON s.id = sc.student_idLEFT JOIN courses c ON sc.course_id = c.idGROUP BY s.id
</select>
相关文章:
多种MyBatis写法(数据库操作)
MyBatis,这个从iBatis演变而来的Java持久层框架,凭借其强大的功能和性能,早已成为企业级应用的首选。本文展示几种MyBatis写法,保证数据库操作既高效又灵活。 1. 批量操作 批量操作是提升数据库操作效率的重要手段。MyBatis提供…...
centos 手动安装libcurl4-openssl-dev库
下载源代码 curl downloadshttps://curl.se/download/ 选择需要下载的版本,我下载的是8.11.0 解压 tar -zxvf curl-8.11.0 查看安装命令 查找INSTALL.md,一般在docs文件夹下 –prefix :指定安装路径(默认安装在/usr/local&…...
C#中的模拟服务器与客户端建立连接
创建一个控制台项目,命名为Server,模拟服务器端。在同一个解决方案下,添加新项目,命名为Client,模拟客户端。在服务器端与客户端之间建立TCP连接,并在客户端发送消息,在服务器端输出。 Server项目具体要求: 1.在Server项目中,用本机端点建立TcpListener对象,进行监…...
论文阅读——Supervised Learning With Quantum-Inspired Tensor Networks
张量网络是高维张量的有效表示,在物理和数学应用中非常成功。我们展示了如何通过使用矩阵乘积状态(张量训练)来参数化用于对图像进行分类的模型,将优化此类网络的算法应用于监督学习任务。对于 MNIST 数据集,我们获得的…...
HTML5系列(11)-- Web 无障碍开发指南
前端技术探索系列:HTML5 Web 无障碍开发指南 ♿ 致读者:构建人人可用的网络 👋 前端开发者们, 今天我们将深入探讨 Web 无障碍开发,学习如何创建一个真正包容、人人可用的网站。让我们一起为更多用户提供更好的网络…...
信号和槽思维脑图+相关练习
将登录框中的取消按钮使用信号和槽的机制,关闭界面。 将登录按钮使用信号和槽连接到自定义的槽函数中,在槽函数中判断ui界面上输入的账号是否为"admin",密码是否为"123456",如果账号密码匹配成功,当前界面关…...
Scala编程基础:模式匹配、解构赋值与正则表达式
在Scala编程语言中,模式匹配、解构赋值和正则表达式是三个非常强大的特性,它们可以让我们以更简洁、更直观的方式处理数据。本文将通过三个示例,详细解释这些特性的使用方法和背后的原理。 1. 模式匹配与case class 模式匹配是Scala中处理数…...
【大数据技术基础】 课程 第1章 大数据技术概述 大数据基础编程、实验和案例教程(第2版)
第1章 大数据技术概述 1.1 大数据时代 这本书的标题是《大数据时代》,副标题为“生活、工作与思维的大变革”。这本书由维克托迈尔-舍恩伯格(Viktor Mayer-Schnberger)和肯尼斯库克耶(Kenneth Cukier)合著,…...
【基础分析】——宏参数连接
示例1: #include<stdio.h>#define STR1(s) #s#define FUN1(a,b) (int)(a##e##b)int main(int argv, char* agrc[]) {printf(STR1(king...));printf("\n");printf("%d\n", FUN1(2, 3));return 0; } 结果: (注&…...
算法3--二分查找
二分查找 原理经典例题[704. 二分查找](https://leetcode.cn/problems/binary-search/)[34. 在排序数组中查找元素的第一个和最后一个位置](https://leetcode.cn/problems/find-first-and-last-position-of-element-in-sorted-array/)[35. 搜索插入位置](https://leetcode.cn/p…...
【信息系统项目管理师】第7章:项目立项管理 考点梳理
文章目录 7.1 项目建议与立项申请7.2 项目可行性研究7.2.1 可行性研究的内容7.2.2 初步可行性研究7.2.3 详细可行性研究(重点) 7.3 项目评估与决策 【学习建议】本章大概考选择题2分左右,有可能考案例题。论文早年考过。本章知识点比较集中&a…...
帝可得-策略管理
策略管理 需求说明 策略管理主要涉及到二个功能模块,业务流程如下: 新增策略: 允许管理员定义新的策略,包括策略的具体内容和参数(如折扣率)策略分配: 将策略分配给一个或多个售货机。 #mermaid-svg-PSQOJMLJqVGn3W…...
opencv-android编译遇到的相关问题处理
1、opencv-android sdk下载 下载地址:https://opencv.org/releases/ 下载安卓SDK即可 2、解压下载好的SDK 3、导入opencv的SDK到安卓项目中 导入步骤在/OpenCV-android-sdk/sdk/build.gradle文件的注释中写的非常详细,大家可安装官方给出的步骤导入。…...
汽车IVI中控开发入门及进阶(三十六):QML调用蓝牙sdk的架构
Qt/QML本身在做GUI界面工程时,除了各种界面上的按钮、图片、工具条等元素之外,最方便的就是可以通过C++实现界面各种复杂逻辑,而实现上不可避免就需要一些外部库的支持,不管是静态库.a还是动态库.so,比如蓝牙模块。 而QML/C++启动一个蓝牙协议栈SDK作为一个进程,然后启动…...
C++设计模式之外观模式
动机 下图中左边方案的问题在于组件的客户和组件中各种复杂的子系统有了过多的耦合,随着外部客户程序和各子系统的演化,这种过多的耦合面临很多变化的挑战。 如何简化外部客户程序和系统间的交互接口?如何将外部客户程序的演化和内部子系统…...
前缀和篇——繁星斗斗数字交织中,觅得效率明月辉光(1)
前言 在这片无边无际的数字海洋中,如何从中提取出有价值的讯息,成为了计算机科学中的一项重要课题。前缀和算法,作为一种巧妙的技术,恰如其名——通过计算序列中各个元素的前缀和,能够为我们提供一种高效的查询方式&a…...
【论文复现】隐式神经网络实现低光照图像增强
📝个人主页🌹:Eternity._ 🌹🌹期待您的关注 🌹🌹 ❀ 隐式神经网络实现低光照图像增强 引言那么目前低光照图像增强还面临哪些挑战呢? 挑战1. 不可预测的亮度降低和噪声挑战2.度量友好…...
Secured Finance 推出 TVL 激励计划以及基于 FIL 的稳定币
Secured Finance 是新一代 DeFi 2.0 协议,其正在推出基于 FIL 的稳定币、固定收益市场以及具有吸引力的 TVL 激励计划,以助力 Filecoin 构建更强大的去中心化金融生态体系,并为 2025 年初 Secured Finance 协议代币的推出铺平道路。Secure Fi…...
2024前端框架年度总结报告(二):新生qwik+solid和次新生svelte+Astro对比 -各自盯着前端的哪些个痛点 - 前端的区域发展差异
引言 2024年,前端开发依然是技术领域的热点之一。随着 Web 应用的日益复杂,前端框架的更新换代也加速了。尽管 React、Vue 和 Angular 老牌框架年度总结 等“老牌”框架仍然占据着主流市场,但一些新兴的框架在不断挑战这些“巨头”的地位&am…...
MySQL大小写敏感、MySQL设置字段大小写敏感
文章目录 一、MySQL大小写敏感规则二、设置数据库及表名大小写敏感 2.1、查询库名及表名是否大小写敏感2.2、修改库名及表名大小写敏感 三、MySQL列名大小写不敏感四、lower_case_table_name与校对规则 4.1、验证校对规则影响大小写敏感4.1、验证校对规则影响排序 五、设置字段…...
每日速记10道java面试题13-MySQL篇
其他资料 每日速记10道java面试题01-CSDN博客 每日速记10道java面试题02-CSDN博客 每日速记10道java面试题03-CSDN博客 每日速记10道java面试题04-CSDN博客 每日速记10道java面试题05-CSDN博客 每日速记10道java面试题06-CSDN博客 每日速记10道java面试题07-CSDN博客 每…...
关于Chrome自动同步书签的解决办法
前言 并不一定适用所有用户, 目前我在网上搜集了一些资料,也做了一些尝试。 就我个人总结的经验来讲,分享大家以下几种办法: 1.书签同步插件 点击如下🔗: Chrome书签同步https://bm.famend.cn/ …...
江南大学《2024年807自动控制原理真题》 (完整版)
本文内容,全部选自自动化考研联盟的:《江南大学807自控考研资料》的真题篇。后续会持续更新更多学校,更多年份的真题,记得关注哦~ 目录 2024年真题 Part1:2024年完整版真题 2024年真题...
在VSCode中搭建Python开发环境
在VSCode中搭建Python开发环境 1、安装 首先确保电脑已经安装好Python和VSCode。 2、安装VSCode的Python插件 3、选择python解释器 ctrlshiftP打开VSCode的命令行,输入python: select Interpreter选择合适的python版本。 4、运行代码 在windows下你可以直接使用…...
mac 安装python3和配置环境变量
mac 安装python3和配置环境变量 前言怎样选择python3的版本python3的安装1、去官网下载安装包2、下载完成后直接解压,检查安装是否成功 前言 在学习python的第一步就是安装它和配置他的环境变量,那么选择哪个版本的python你可曾知道,下面就讲解怎样选择…...
微信小程序版小米商城的搭建流程详解!
很多初学微信小程序语法的同学,可能不知道如何布局和搭建一个项目,下面我将讲解初学者如何搭建项目和注意事项。 一、 app.json的配置 {"pages": ["pages/index/index","pages/classification/classification","pag…...
Redis等Spring Cache 框架 实现基于注解的缓存功能
Spring Cache 框架 实现基于注解的缓存功能 底层 基于代理技术 一旦进入方法就进入代理对象 如果redis里有就直接返回 不会走方法 如果缓存没有数据 则通过反射走方法。 概念 缓存 相当于之前的事务处理 同步更改 只是提供了一层抽象 底层可以切换不同的缓存实现 EHCach…...
tcpreplay/tcpdump-重放网络流量/捕获、过滤和分析数据包
tcpdump 是一个网络数据包分析工具,通过捕获并显示网络接口上传输的数据包,帮助用户分析网络流量。 原理:用户态通过 libpcap 库控制数据包捕获,内核态通过网卡驱动获取数据包。 核心功能包括:捕获、过滤和分析数据包…...
【Linux】基础IO_文件系统IO_“一切皆文件”_缓冲区
目录 1. 理解"⽂件" 1-1 狭义理解 1-2 ⼴义理解 1-3 ⽂件操作的归类认知 1-4 系统⻆度 访问文件,需要先打开文件!那么是由谁打开文件??? 操作系统要不要把被打开的文件管理起来? 2. 回顾…...
基于ZYNQ-7000系列的FPGA学习笔记7——按键控制蜂鸣器(模块化编写)
基于ZYNQ-7000系列的FPGA学习笔记7——按键控制蜂鸣器(模块化编写) 1. 实验要求2. 功能分析3. 模块设计4. 波形图4.1 按键消抖模块4.2 按键控制蜂鸣器模块 5.代码编写5.1 rtl代码5.2 测试代码 6. 代码仿真7. 添加约束文件并分析综合 在上期的内容中&…...
Mnesia(三)
在表中保存复杂数据 Mnesia是被设计用来保存Erlang数据结构的。可以把任意类型的Erlang数据结构保存到Mnesia表中。 -export([init_mnesia_schema/0, start/0]). -export([add_plans/0, get_plan/1]). -include_lib("stdlib/include/qlc.hrl"). -record(shop, {ite…...
ELK的Filebeat
目录 传送门前言一、概念1. 主要功能2. 架构3. 使用场景4. 模块5. 监控与管理 二、下载地址三、Linux下7.6.2版本安装filebeat.yml配置文件参考(不要直接拷贝用)多行匹配配置过滤配置最终配置(一、多行匹配、直接读取日志文件、EFK方案&#…...
【WPF中ControlTemplate 与 DataTemplate之间的区别?】
前言 WPF中ControlTemplate 与 DataTemplate之间的区别? 1. 定义: ControlTemplate 是用于定义 WPF 控件的外观和结构的模板。它允许您重新定义控件的视觉表现,而不改变控件的行为。 DataTemplate 是用于定义如何呈现数据对象的模板。它通…...
FFmpeg源码中,计算CRC校验的实现
一、CRC简介 CRC(Cyclic Redundancy Check),即循环冗余校验,是一种根据网络数据包或电脑文件等数据产生简短固定位数校核码的快速算法,主要用来检测或校核数据传输或者保存后可能出现的错误。CRC利用除法及余数的原理,实现错误侦…...
js面试题
面试题:说一下call、apply、bind区别 共同点:功能一致 可以改变this指向 语法:函数.call() 函数.apply() 函数.bind() 区别:1.call、apply可以立即执行。bind不会立即执行,因为bind返回的是一个函数需要加入ÿ…...
Python酷库之旅-第三方库Pandas(255)
目录 一、用法精讲 1206、pandas.tseries.offsets.SemiMonthEnd.is_on_offset方法 1206-1、语法 1206-2、参数 1206-3、功能 1206-4、返回值 1206-5、说明 1206-6、用法 1206-6-1、数据准备 1206-6-2、代码示例 1206-6-3、结果输出 1207、pandas.tseries.offsets.S…...
STM32 进阶 定时器3 通用定时器 案例2:测量PWM的频率/周期
需求分析 上一个案例我们输出了PWM波,这个案例我们使用输入捕获功能,来测试PWM波的频率/周期。 把测到的结果通过串口发送到电脑,检查测试的结果。 如何测量 1、输入捕获功能主要是:测量输入通道的上升沿和下降沿 2、让第一个…...
【计算机网络】实验10:开放最短路径优先OSPF
实验10 开放最短路径优先OSPF 一、实验目的 本实验的主要目的是验证OSPF(开放最短路径优先)协议的作用,深入理解其在动态路由中的重要性。通过实验,我们将观察OSPF如何在网络中高效地传播路由信息,从而实现不同网络之…...
线程信号量 Linux环境 C语言实现
既可以解决多个同类共享资源的互斥问题,也可以解决简易的同步问题 头文件:#include <semaphore.h> 类型:sem_t 初始化:int sem_init(sem_t *sem, int pshared, unsigned int value); //程序中第一次对指定信号量调用p、v操…...
Tree搜索二叉树、map和set_数据结构
数据结构专栏 如烟花般绚烂却又稍纵即逝的个人主页 本章讲述数据结构中搜索二叉树与HashMap的学习,感谢大家的支持!欢迎大家踊跃评论,感谢大佬们的支持! 目录 搜索二叉树的概念二叉树搜索模拟实现搜索二叉树查找搜索二叉树插入搜索二叉树删除…...
Linux-GPIO应用编程
本章介绍应用层如何控制 GPIO,譬如控制 GPIO 输出高电平、或输出低电平。 只要是用到GPIO的外设,都有可能用得到这些操作方法。 照理说,GPIO的操作应该是由驱动层去做的,使用寄存器操作或者GPIO子系统之类的框架。 但是࿰…...
【模板】排序(py)/ 【深基9.例4】求第 k 小的数
题目描述 将读入的 NN 个数从小到大排序后输出。 输入格式 第一行为一个正整数 NN。 第二行包含 NN 个空格隔开的正整数 aiai,为你需要进行排序的数。 输出格式 将给定的 NN 个数从小到大输出,数之间空格隔开,行末换行且无空格。 输…...
Linux获取文件属性
目录 stat函数 获取文件属性 获取文件权限 实现“head -n 文件名”命令的功能 编程实现“ls -l 文件名”功能 stat/fstat/lstat的区别? stat函数 int stat(const char *path, struct stat *buf); 功能:获取文件属性 参数: path&…...
一文说清:Git创建仓库的方法
0 引言 本文介绍如何创建一个 Git 本地仓库,以及与远程仓库的关联。 1 初始化仓库(git init) 1.1 概述 Git 使用 git init 命令来初始化一个 Git 仓库,Git 的很多命令都需要在 Git 的仓库中运行,所以 git init 是使…...
ASP.NET Core 负载/压力测试
文章目录 一、第三方工具二、使用发布版本进行负载测试和压力测试 负载测试和压力测试对于确保 web 应用的性能和可缩放性非常重要。 尽管负载测试和压力测试的某些测试相似,但它们的目标不同。 负载测试:测试应用是否可以在特定情况下处理指定的用户负…...
红日靶场vulnstack (五)
前言 好久没打靶机了,今天有空搞了个玩一下,红日5比前面的都简单。 靶机环境 win7:192.168.80.150(外)、192.168.138.136(内) winserver28(DC):192.168.138.138 环境搭建就不说了,和之前写…...
k8s,声明式API对象理解
命令式API 比如: 先kubectl create,再replace的操作,我们称为命令式配置文件操作 kubectl replace的执行过程,是使用新的YAML文件中的API对象,替换原有的API对象;而kubectl apply,则是执行了一…...
【人工智能】用Python和Scikit-learn构建集成学习模型:提升分类性能
《Python OpenCV从菜鸟到高手》带你进入图像处理与计算机视觉的大门! 集成学习(Ensemble Learning)是通过组合多个弱学习器提升模型性能的机器学习方法,广泛应用于分类、回归及其他复杂任务中。随机森林(Random Forest)和梯度提升(Gradient Boosting)是集成学习的两种…...
MSBUILD : error MSB1009: 项目文件不存在。
环境:win10 vscode1.95.3 clang15.0.4 问题:最近用vscodecmakeclang在windows上编译c项目,用mingw32不报错,用clang报错,错误如下, MSBUILD : error MSB1009: 项目文件不存在。 原因:与其他生成器(如Mak…...
洛谷P1827 [USACO3.4] 美国血统 American Heritage(c嘎嘎)
题目链接:P1827 [USACO3.4] 美国血统 American Heritage - 洛谷 | 计算机科学教育新生态 题目难度:普及 首先介绍下二叉树的遍历: 学过数据结构都知道二叉树有三种遍历: 1.前序遍历:根左右 2.中序遍历:左根…...