Mybatis SQL注解使用场景
MyBatis 提供了几种常用的注解,主要用于简化 XML 映射文件的编写,使得 SQL 查询和操作可以直接在 Java 接口中定义。下面列出了主要的注解以及它们在被调用时的写法示例:
1. @Select
@Select
注解用于执行查询操作,并将查询结果映射到指定的 Java 对象或基本数据类型。
@Select("SELECT * FROM users WHERE id = #{id}")
User getUserById(Long id);
2. @Insert
@Insert
注解用于执行插入操作,将 Java 对象的数据插入到数据库中。
@Insert("INSERT INTO users (id, username, password) VALUES (#{id}, #{username}, #{password})")
void insertUser(User user);
3. @Update
@Update
注解用于执行更新操作,更新数据库中已有的数据。
@Update("UPDATE users SET username = #{username}, password = #{password} WHERE id = #{id}")
void updateUser(User user);
4. @Delete
@Delete
注解用于执行删除操作,从数据库中删除指定的数据行。
@Delete("DELETE FROM users WHERE id = #{id}")
void deleteUserById(Long id);
5. @ResultMap
@ResultMap
注解用于引用 XML 映射文件中定义的 resultMap
,将查询结果映射到 Java 对象。
@Select("SELECT * FROM users")
@ResultMap("userResultMap")
List<User> getAllUsers();
6. @Results 和 @Result
@Results
和 @Result
注解结合使用,定义查询结果到 Java 对象的映射关系。
@Results({@Result(property = "id", column = "user_id"),@Result(property = "username", column = "user_name"),@Result(property = "password", column = "user_password")
})
@Select("SELECT user_id, user_name, user_password FROM users WHERE id = #{id}")
User getUserById(Long id);
7. @Param
@Param
注解用于给 SQL 查询或操作方法的参数命名,以便在 SQL 语句中引用。
@Select("SELECT * FROM users WHERE username = #{username} AND password = #{password}")
User getUserByUsernameAndPassword(@Param("username") String username, @Param("password") String password);
小结
以上这些注解在 MyBatis 中定义和执行 SQL 操作更加方便和直观,避免了大量 XML 配置文件编写。每种注解的具体写法取决于要执行的 SQL 类型和需要传递的参数。
分析注解用法与原理
例如当使用MyBatis框架中的 @Insert
注解时,主要目的是将一个Java对象插入到数据库中。这个注解允许在Java方法上直接指定插入操作的SQL语句,而不需要显式地在XML映射文件中定义。
@Insert 注解的用法
-
定义Mapper接口方法
首先,你需要定义一个Mapper接口方法,使用
@Insert
注解来标记这个方法执行插入操作。import org.apache.ibatis.annotations.Insert;public interface UserMapper {@Insert("INSERT INTO users (id, username, password) VALUES (#{id}, #{username}, #{password})")void insertUser(User user); }
@Insert
注解中的参数是一个字符串,它包含了实际的SQL插入语句。这个语句使用了MyBatis的动态SQL语法,其中#{}
表示参数占位符,它会被MyBatis动态地替换为Java对象User
中对应的属性值。
-
Java对象
在上述内容中,
User
是一个简单的Java对象,用来映射数据库中的用户表。public class User {private Long id;private String username;private String password;// Getters and setters }
在实际使用中,会创建一个
User
对象,并将其作为参数传递给insertUser
方法。 -
调用方法
最后,调用
insertUser
方法来执行插入操作。MyBatis会根据@Insert
注解中指定的SQL语句生成并执行相应的SQL。public class Main {public static void main(String[] args) {// 获取UserMapper实例UserMapper userMapper = sqlSession.getMapper(UserMapper.class);// 创建一个User对象User user = new User();user.setId(1L);user.setUsername("john_doe");user.setPassword("password123");// 执行插入操作userMapper.insertUser(user);// 提交事务sqlSession.commit();} }
@Insert 注解的具体原理
-
动态SQL解析:MyBatis在运行时会解析
@Insert
注解中的SQL语句,并将其中的#{}
占位符替换为对应的Java对象属性值。这种动态性允许你在不同的场景下使用相同的插入语句,只需传入不同的Java对象即可。 -
SQL执行:当调用标记有
@Insert
注解的方法时,MyBatis会根据注解中的SQL语句生成PreparedStatement,并执行插入操作。执行过程中,MyBatis负责处理数据库连接的获取、事务管理等底层操作。 -
参数映射:MyBatis会将方法的参数(即插入方法中的Java对象)与
@Insert
注解中的SQL语句进行映射,确保每个属性值都被正确地插入到数据库中相应的字段中。
小结
通过理解和使用 @Insert
注解,可以在MyBatis中简化SQL操作的定义和执行过程,提高开发效率和代码可读性。
注解调用写法
当使用 MyBatis 注解时,注解中的内容可以有多种变化形式,主要取决于执行的 SQL 操作和传递的参数。下面详细列出每种注解在被调用时的不同写法:
1. @Select
-
单参数:
@Select("SELECT * FROM users WHERE id = #{id}") User getUserById(Long id);
-
多参数(使用
@Param
注解进行参数命名):@Select("SELECT * FROM users WHERE username = #{username} AND password = #{password}") User getUserByUsernameAndPassword(@Param("username") String username, @Param("password") String password);
2. @Insert
- 单对象参数:
@Insert("INSERT INTO users (id, username, password) VALUES (#{id}, #{username}, #{password})") void insertUser(User user);
3. @Update
- 单对象参数:
@Update("UPDATE users SET username = #{username}, password = #{password} WHERE id = #{id}") void updateUser(User user);
4. @Delete
- 单参数:
@Delete("DELETE FROM users WHERE id = #{id}") void deleteUserById(Long id);
5. @ResultMap
- 单结果集映射:
@Select("SELECT * FROM users") @ResultMap("userResultMap") List<User> getAllUsers();
6. @Results 和 @Result
- 映射定义:
@Results({@Result(property = "id", column = "user_id"),@Result(property = "username", column = "user_name"),@Result(property = "password", column = "user_password") }) @Select("SELECT user_id, user_name, user_password FROM users WHERE id = #{id}") User getUserById(Long id);
在这些例子中,注解括号中的内容具体形式会根据具体需求和 SQL 语句的复杂度而变化。重要的是确保参数名与 SQL 语句中的占位符 (#{...}
) 一致,并正确地映射结果到 Java 对象或基本数据类型。
特殊形式
MyBatis 允许在SQL语句中嵌入动态内容,可以使用<script>
标签来定义一个SQL脚本,使用@Select("script")
、@Insert("script")
、@Update("script")
或@Delete("script")
注解来执行。
@Select("<script>" +"SELECT * FROM users " +"<where>" +" <if test='name != null'>" +" AND name = #{name}" +" </if>" +" <if test='age != null'>" +" AND age = #{age}" +" </if>" +"</where>" +"</script>")
List<User> getUsersWithConditions(@Param("name") String name, @Param("age") Integer age);
在这个例子中,<script>
标签包含了动态生成的SQL语句,根据传入的参数决定是否包含 name
和 age
条件。这种方式能够根据不同的条件动态地构建SQL语句,灵活实用。
除了使用 <script>
标签来编写动态SQL语句外,还有一些其他常见的高级用法比如:
-
动态条件语句:
@Select("<script>" +"SELECT * FROM users " +"<where>" +" <if test='name != null'>" +" AND name = #{name}" +" </if>" +" <if test='age != null'>" +" AND age = #{age}" +" </if>" +"</where>" +"</script>") List<User> getUsersWithConditions(@Param("name") String name, @Param("age") Integer age);
这个例子中,根据传入的参数动态地拼接
WHERE
子句,条件的组合可以根据参数的有无来动态生成。 -
动态更新语句:
@Update("<script>" +"UPDATE users " +"<set>" +" <if test='name != null'>" +" name = #{name}," +" </if>" +" <if test='age != null'>" +" age = #{age}," +" </if>" +"</set>" +"WHERE id = #{id}" +"</script>") void updateUser(User user);
这个例子是如何在更新语句中使用
<set>
标签来动态设置需要更新的字段,同样根据传入的参数决定是否包含相应的字段更新。 -
动态插入语句:
@Insert("<script>" +"INSERT INTO users (name, age)" +"VALUES " +"<foreach item='user' collection='users' separator=','>" +" (#{user.name}, #{user.age})" +"</foreach>" +"</script>") void insertUsers(@Param("users") List<User> users);
这个例子使用
<foreach>
标签来动态地插入多条数据,可以根据传入的列表动态生成插入值的部分。
其他
除了使用脚本之外,MyBatis还提供了一些其他高级功能,允许更灵活地处理SQL语句:
-
使用SQL注释:可以在SQL语句中添加注释,以提高可读性或添加一些额外的说明。例如:
@Select("SELECT * FROM users-- This is a comment\nWHERE id = #{id}") User getUserByIdComment(Long id);
-
存储过程:如果使用的是支持存储过程的数据库(如MySQL或Oracle),可以定义一个存储过程,然后使用MyBatis的注解执行它。例如:
@Select({ "call sp_UserById(:id)", "param.id = #{id}" }) User callUserById(Long id);
-
使用命名参数:可以为参数指定名称,而不是使用位置参数。这在SQL语句中特别有用,因为它增强了可读性并避免了参数顺序问题。
@Select("SELECT * FROM users WHERE id = :id") User getUserByIdNamedParam(Map<String, Object> params);
这些都是MyBatis注解中一些较复杂的用法,它允许更灵活地处理SQL语句,适应不同情况下的需求。
相关文章:
![](https://www.ngui.cc/images/no-images.jpg)
Mybatis SQL注解使用场景
MyBatis 提供了几种常用的注解,主要用于简化 XML 映射文件的编写,使得 SQL 查询和操作可以直接在 Java 接口中定义。下面列出了主要的注解以及它们在被调用时的写法示例: 1. Select Select 注解用于执行查询操作,并将查询结果映…...
![](https://i-blog.csdnimg.cn/direct/b6d8d2ef20ba428dbe66ad02b05f9c1d.png#pic_center)
Dataset for Stable Diffusion
1.Dataset for Stable Diffusion 笔记来源: 1.Flickr8k数据集处理 2.处理Flickr8k数据集 3.Github:pytorch-stable-diffusion 4.Flickr 8k Dataset 5.dataset_flickr8k.json 1.1 Dataset 采用Flicker8k数据集,该数据集有两个文件ÿ…...
![](https://img-blog.csdnimg.cn/6e6eedab00b6492e988e963ff638fd17.png)
近期matlab学习笔记,学习是一个记录,反复的过程
近期matlab学习笔记,学习是一个记录,反复的过程 matlab的mlx文件在运行的时候,不需要在文件夹路径下,也能运行,但是需要调用子函数时,就需要在文件所在路径下运行 那就先运行子函数,把路径换过来…...
![](https://www.ngui.cc/images/no-images.jpg)
Elasticsearch7.5.2 常用rest api与elasticsearch库
目录 一、rest api 1. 新建索引 2. 删除索引 3. 插入单条数据 4. 更新单条数据 5. 删除单条数据 6. 查询数据 二、python elasticsearch库 1. 新建索引 一、rest api 1. 新建索引 请求方式:PUT 请求URL:http://ip/(your_index_nam…...
![](https://i-blog.csdnimg.cn/direct/8e10339dec044e04900ce56f326aa374.png)
Autosar Dcm配置-0x28服务ComControl-基于ETAS软件
文章目录 前言DcmDcmDsdDcmDspBswMBswMModeRequestPortBswMModeConditionBswMLogicalExpressionBswMActionBswMActionListBswMRule总结前言 0x28服务主要用来控制非诊断报文的通讯,一般在刷写预编程过程中,用来禁止APP的通信报文,可以减少总线负载率,提高刷写成功率。本文…...
![](https://www.ngui.cc/images/no-images.jpg)
平安养老险厦门分公司:提升金融服务,发挥金融力量
为向社会公众普及金融保险知识,传递消费者权益保护理念,平安养老保险股份有限公司厦门分公司(以下简称“分公司”)积极开展“78保险公众宣传日”系列教育宣传活动。分公司紧扣“保险,让每一步前行更有底气”主题&#…...
![](https://i-blog.csdnimg.cn/direct/05872ccaee2d4c369525e791ac0722d8.png)
【开源合规】开源许可证风险场景详细解读
文章目录 前言关于BlackDuck许可证风险对比图弱互惠型许可证举个例子具体示例LGPL系列LGPL-2.0-onlyLGPL-2.0-or-laterLGPL-2.1-onlyLGPL-2.1-or-laterLGPL-3.0-onlyLGPL-3.0-or-laterMPL系列MPL-1.0MPL-1.1MPL-2.0EPL系列EPL-1.0EPL-2.0互惠型许可证GPL系列GPL-1.0GPL-2.0GPL-…...
![](https://i-blog.csdnimg.cn/direct/43b599adf9674143b879bf8524d41394.png)
Redis持久化RDB,AOF
目 录 CONFIG动态修改配置 慢查询 持久化 在上一篇主要对redis的了解入门,安装,以及基础配置,多实例的实现:redis的安装看我上一篇: Redis安装部署与使用,多实例 redis是挡在MySQL前面的,运行在内存…...
![](https://i-blog.csdnimg.cn/direct/e900f0cf58ee4b7ca101399ce6e9f1d7.png)
【持续集成_03课_Linux部署Sonar+Gogs+Jenkins】
一、通过虚拟机搭建Linux环境-CnetOS 1、安装virtualbox,和Vmware是一样的,只是box更轻量级 1)需要注意内存选择,4G 2、启动完成后,需要获取服务器IP地址 命令 ip add 服务器IP地址 通过本地的工具,进…...
![](https://www.ngui.cc/images/no-images.jpg)
mvcc 速读
MVCC(Multi-Version Concurrency Control,多版本并发控制)是MySQL中一种用于实现数据库并发控制的方法,尤其在InnoDB存储引擎中得到了广泛应用。它的主要作用是提高数据库在高并发场景下的性能,并确保数据的一致性。 …...
![](https://img-blog.csdnimg.cn/50598b89cf3648d0b97471015e46892b.jpg)
美容仪维修过程记录
近期维修的家用射频美容仪,发一些维修过程的拆机图片...
![](https://i-blog.csdnimg.cn/direct/d680e547c21d4217b1f0f70561e18fc6.png#pic_center)
STM32入门开发操作记录(一)——新建工程
目录 一、课程准备1. 课程资料2. 配件清单3. 根目录 二、环境搭建三、新建工程1. 载入器件支持包2. 添加模块3. ST配置4. 外观设置5. 主函数文件 一、课程准备 1. 课程资料 本记录操作流程参考自b站视频BV1th411z7snSTM32入门教程-2023版 细致讲解 中文字幕,课程资…...
![](https://i-blog.csdnimg.cn/direct/2a3a566b24ec47ad89315736e0fa8914.png)
QT实现自定义带有提示信息的透明环形进度条
1. 概述 做界面开发的童鞋可能都会遇到这样的需求,就是有一些界面点击了之后比较耗时的操作,需要界面给出一个环形进度条的进度反馈信息. 如何来实现这样的需求呢,话不多说,上效果 透明进度条 2. 代码实现 waitfeedbackprogressba…...
![](https://www.ngui.cc/images/no-images.jpg)
金币程序题
昨天,小孩问了我一个python编程竞赛题,我看了一下题目,是一个数列编程的问题,我在想,小学五年级的学生能搞得懂吗?反正我家小孩是没有搞懂,不知道别人家的小孩能不能搞明白。所以我花了一点时间…...
![](https://i-blog.csdnimg.cn/direct/0595404e0cad4f66a7cdbf0b95da5346.png)
《Windows API每日一练》9.13资源-鼠标位图和字符串
鼠标指针位图(Mouse Cursor Bitmap)是用于表示鼠标指针外观的图像。在 Windows 窗口编程中,可以使用自定义的鼠标指针位图来改变鼠标的外观,并提供更加个性化的用户体验。 ■以下是一些与鼠标指针位图相关的要点: ●…...
![](https://i-blog.csdnimg.cn/direct/c43783402e424db38c03f78ac9b98978.png)
【保姆级教程】CenterNet的目标检测、3D检测、关键点检测使用教程
一、代码下载 仓库地址:https://github.com/xingyizhou/CenterNet?tab=readme-ov-file 二、目标检测 2.1 下载预训练权重 下载预训练权重ctdet_coco_dla_2x.pth放到models文件夹下 下载链接:https://drive.google.com/file/d/18Q3fzzAsha_3Qid6mn4jcIFPeOGUaj1d/edit …...
![](https://www.ngui.cc/images/no-images.jpg)
thinkphp:数据库复合查询-OR的使用
完整代码 $data[info] db::table(po_headers_all)->alias(ph) //设置wip_jobs_all的别名->join([vendors > ve], ph.vendor_codeve.vendor_code)->field(ph.po_num,ph.status,ph.vendor_code,ve.vendor_name,ph.po_all_amount,ph.note,ph.order_date,ph.need_dat…...
![](https://www.ngui.cc/images/no-images.jpg)
网络安全那些梗
网络安全领域的梗往往以幽默、讽刺或夸张的方式反映了该领域的某些现象、挑战或误解。以下是一些网络安全相关的梗: 关掉服务器是最有效的安全方法:这个梗源自一个笑话,讲述了一位程序员因误解妻子的话而只买了一个包子回家,随后被…...
![](https://img-blog.csdnimg.cn/img_convert/8eee276818d2b6d424044bb2f69e8ce3.jpeg)
交通气象站:保障道路安全的智慧之眼
随着社会的快速发展,交通运输日益繁忙,道路安全成为公众关注的焦点。在这个背景下,交通气象站作为保障道路安全的重要设施,正发挥着越来越重要的作用。它们不仅为交通管理部门提供及时、准确的气象信息,也为广大驾驶员…...
![](https://i-blog.csdnimg.cn/direct/169a8a151b4a4ab4a1b5d67ec1cd3244.webp)
【分库】分库的核心原则
目录 分库的核心原则 前言 分区透明性与一致性保证 弹性伸缩性与容错性设计 数据安全与访问控制机制 分库的核心原则 前言 在设计和实施分库策略时,遵循一系列核心原则是至关重要的,以确保系统不仅能够在当前规模下高效运行,还能够随着…...
![](https://i-blog.csdnimg.cn/direct/c6c42278c28c45d6b7d82eb263d9fb20.png)
【Linux】软件管理工具 yum
文章目录 概念搜索:yum list安装:yum install卸载:yum remove 概念 在Linux下安装软件,可以下载到程序的源代码,进行编译得到可执行程序,另外这些软件还有依赖其它工具的问题,还得下载编译这些依…...
![](https://www.ngui.cc/images/no-images.jpg)
LangChain —— Prompt Templates
文章目录 一、什么是 Prompt Templates1、String PromptTemplates2、ChatPromptTemplates3、MessagesPlaceholder 留言占位符 二、如何使用 Prompt Templates1、使用几个简短示例2、在 chat model 中使用几个简短示例3、部分格式化提示模板4、一起编写提示 一、什么是 Prompt T…...
![](https://www.ngui.cc/images/no-images.jpg)
Python库 - Scrapy
Scrapy 是一个用于爬取网站数据、提取结构性数据的开源和协作框架。它最初是为网页抓取设计的,但也可以用于获取 API 提供的数据或作为通用的网络爬虫。 文章目录 主要特性主要组件使用流程1. 安装 Scrapy2. 创建 Scrapy 项目3. 定义 Item(数据ÿ…...
![](https://i-blog.csdnimg.cn/direct/df0897273b6348189c8237e7ebc64c8c.png)
函数(实参以及形参)
实际参数(实参) 实际参数就是在调用函数时传递给函数的具体值。这些值可以是常量、变量、表达式或更复杂的数据结构。实参的值在函数被调用时传递给对应的形参,然后函数内部就可以使用这些值来执行相应的操作。 int main() {int a 0;int b …...
![](https://www.ngui.cc/images/no-images.jpg)
ArcGIS Pro SDK (八)地理数据库 8 拓扑
ArcGIS Pro SDK (八)地理数据库 8 拓扑 文章目录 ArcGIS Pro SDK (八)地理数据库 8 拓扑1 开放拓扑和进程定义2 获取拓扑规则3 验证拓扑4 获取拓扑错误5 标记和不标记为错误6 探索拓扑图7 找到最近的元素 环境:Visual …...
![](https://www.ngui.cc/images/no-images.jpg)
uniapp如何发送websocket请求
方法1: onLoad() {uni.connectSocket({url: ws://127.0.0.1:8000/ws/stat/realTimeStat/,success: (res) > {console.log(connect success, res);}});uni.onSocketOpen(function (res) {console.log(WebSocket连接已打开!);uni.sendSocketMessage({d…...
![](https://www.ngui.cc/images/no-images.jpg)
RabbitMQ的工作模式
RabbitMQ的工作模式 Hello World 模式 #mermaid-svg-sbc2QNYZFRQYbEib {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-sbc2QNYZFRQYbEib .error-icon{fill:#552222;}#mermaid-svg-sbc2QNYZFRQYbEib .error-text{fi…...
![](https://i-blog.csdnimg.cn/direct/75de551435da4224ac49d186b5e85201.png)
自建搜索引擎-基于美丽云
Meilisearch 是一个搜索引擎,主程序完全开源,除了使用官方提供的美丽云服务(收费)进行对接之外,还可以通过自建搜索引擎来实现完全独立的搜索服务。 由于成本问题,本博客采用自建的方式,本文就…...
![](https://i-blog.csdnimg.cn/direct/168ecd036bed46959673a6e5324343dc.jpeg)
2024辽宁省大学数学建模竞赛试题思路
A题 (1) 建立模型分析低空顺风风切变对起飞和降落的影响 模型假设 飞机被视为质点,忽略其尺寸和形状对风阻的影响。风切变仅考虑顺风方向的变化,忽略其他方向的风切变。飞机的飞行速度、高度和姿态(如迎角、俯仰角)是变化的&am…...
![](https://img-blog.csdnimg.cn/img_convert/f3749a6c0c9bd5fa12a8de4054056877.gif)
循环结构(一)——for语句【互三互三】
文章目录 🍁 引言 🍁 一、语句格式 🍁 二、语句执行过程 🍁 三、语句格式举例 🍁四、例题 👉【例1】 🚀示例代码: 👉【例2】 【方法1】 🚀示例代码: 【方法2】…...
![](https://img-blog.csdnimg.cn/img_convert/801926e502b057a113f55f37c0154f85.png)
wordpress 钻石 插件/软文营销的本质
本文主要介绍如何手动创建Windows Modern UI 应用程序,要使用 DevExpress 模板库创建应用程序。 获取工具下载 - DevExpress WinForm v21.1 DevExpress技术交流群4:715863792 欢迎一起进群讨论 1. 在 Visual Studio 中,单击 “File |…...
![](/images/no-images.jpg)
上海电信网站备案/深圳抖音seo
环景: ubuntu 16.04 docker Version: 20.10.7 问题描述: 怎么进入Docker 容器查看容器内文件,并复制容器内文件至本机 解决方案: 1.#docker ps 执行结果如下: CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS…...
![](/images/no-images.jpg)
centos7.2 wordpress/北京营销型网站
2022/2/18 今天看到了一个很好的博客:https://wudan.blog.csdn.net/article/details/121909047?spm1001.2014.3001.5502 有关于promise的,我自己去尝试写接口试试 就是说resolve(subList) 那么res就是subList啊。没有res.subList vue 每隔几秒刷新请求…...
![](https://common.cnblogs.com/images/copycode.gif)
网站工程工资一般多少钱/有创意的营销案例
一、使用正则表达式 1 string str "sztq数字提取123sztq数字提取"; 2 string result System.Text.RegularExpressions.Regex.Replace(str, "[^0-9]", ""); 3 Console.WriteLine("使用正则表达式提取"); 4 Console.WriteLine(result)…...
![](https://img-blog.csdnimg.cn/img_convert/6ee5639a40442445944d63b514b2dd02.png)
国外化妆品网站模板/青岛seo网站推广
Oracle创建实例的最少参数需求我们知道,Oracle在启动过程中,需要读取参数文件(pfile/spfile)来创建实例.Oracle在启动过程中,寻找参数文件的顺序为:spfile.ora,spfile.ora,init.ora.而创建实例的过程中,Oracle需要的最少参数为一个,即db_name参数.我们来看一个测试,启动一个任意…...
![](/images/no-images.jpg)
东营seo网站推广费用/百度资源提交
总结自己的调试心得,总结如下: 1、Cisco29系列交换机可以做基于2层的端口安全,即mac地址与端口进行绑定。 2、 Cisco3550以上交换机均可做基于2层和3层的端口安全,即mac地址与端口绑定以及mac地址与ip地址绑定。 3、以…...