当前位置: 首页 > news >正文

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 注解的用法

  1. 定义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 中对应的属性值。
  2. Java对象

    在上述内容中,User 是一个简单的Java对象,用来映射数据库中的用户表。

    public class User {private Long id;private String username;private String password;// Getters and setters
    }
    

    在实际使用中,会创建一个 User 对象,并将其作为参数传递给 insertUser 方法。

  3. 调用方法

    最后,调用 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语句,根据传入的参数决定是否包含 nameage 条件。这种方式能够根据不同的条件动态地构建SQL语句,灵活实用。

除了使用 <script> 标签来编写动态SQL语句外,还有一些其他常见的高级用法比如:

  1. 动态条件语句

    @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 子句,条件的组合可以根据参数的有无来动态生成。

  2. 动态更新语句

    @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> 标签来动态设置需要更新的字段,同样根据传入的参数决定是否包含相应的字段更新。

  3. 动态插入语句

    @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语句:

  1. 使用SQL注释:可以在SQL语句中添加注释,以提高可读性或添加一些额外的说明。例如:

    @Select("SELECT * FROM users-- This is a comment\nWHERE id = #{id}")
    User getUserByIdComment(Long id);
    
  2. 存储过程:如果使用的是支持存储过程的数据库(如MySQL或Oracle),可以定义一个存储过程,然后使用MyBatis的注解执行它。例如:

    @Select({ "call sp_UserById(:id)", "param.id = #{id}" })
    User callUserById(Long id);
    
  3. 使用命名参数:可以为参数指定名称,而不是使用位置参数。这在SQL语句中特别有用,因为它增强了可读性并避免了参数顺序问题。

    @Select("SELECT * FROM users WHERE id = :id")
    User getUserByIdNamedParam(Map<String, Object> params);
    

这些都是MyBatis注解中一些较复杂的用法,它允许更灵活地处理SQL语句,适应不同情况下的需求。

相关文章:

Mybatis SQL注解使用场景

MyBatis 提供了几种常用的注解&#xff0c;主要用于简化 XML 映射文件的编写&#xff0c;使得 SQL 查询和操作可以直接在 Java 接口中定义。下面列出了主要的注解以及它们在被调用时的写法示例&#xff1a; 1. Select Select 注解用于执行查询操作&#xff0c;并将查询结果映…...

Dataset for Stable Diffusion

1.Dataset for Stable Diffusion 笔记来源&#xff1a; 1.Flickr8k数据集处理 2.处理Flickr8k数据集 3.Github&#xff1a;pytorch-stable-diffusion 4.Flickr 8k Dataset 5.dataset_flickr8k.json 1.1 Dataset 采用Flicker8k数据集&#xff0c;该数据集有两个文件&#xff…...

近期matlab学习笔记,学习是一个记录,反复的过程

近期matlab学习笔记&#xff0c;学习是一个记录&#xff0c;反复的过程 matlab的mlx文件在运行的时候&#xff0c;不需要在文件夹路径下&#xff0c;也能运行&#xff0c;但是需要调用子函数时&#xff0c;就需要在文件所在路径下运行 那就先运行子函数&#xff0c;把路径换过来…...

Elasticsearch7.5.2 常用rest api与elasticsearch库

目录 一、rest api 1. 新建索引 2. 删除索引 3. 插入单条数据 4. 更新单条数据 5. 删除单条数据 6. 查询数据 二、python elasticsearch库 1. 新建索引 一、rest api 1. 新建索引 请求方式&#xff1a;PUT 请求URL&#xff1a;http://ip/&#xff08;your_index_nam…...

Autosar Dcm配置-0x28服务ComControl-基于ETAS软件

文章目录 前言DcmDcmDsdDcmDspBswMBswMModeRequestPortBswMModeConditionBswMLogicalExpressionBswMActionBswMActionListBswMRule总结前言 0x28服务主要用来控制非诊断报文的通讯,一般在刷写预编程过程中,用来禁止APP的通信报文,可以减少总线负载率,提高刷写成功率。本文…...

平安养老险厦门分公司:提升金融服务,发挥金融力量

为向社会公众普及金融保险知识&#xff0c;传递消费者权益保护理念&#xff0c;平安养老保险股份有限公司厦门分公司&#xff08;以下简称“分公司”&#xff09;积极开展“78保险公众宣传日”系列教育宣传活动。分公司紧扣“保险&#xff0c;让每一步前行更有底气”主题&#…...

【开源合规】开源许可证风险场景详细解读

文章目录 前言关于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-…...

Redis持久化RDB,AOF

目 录 CONFIG动态修改配置 慢查询 持久化 在上一篇主要对redis的了解入门&#xff0c;安装&#xff0c;以及基础配置&#xff0c;多实例的实现&#xff1a;redis的安装看我上一篇&#xff1a; Redis安装部署与使用,多实例 redis是挡在MySQL前面的&#xff0c;运行在内存…...

【持续集成_03课_Linux部署Sonar+Gogs+Jenkins】

一、通过虚拟机搭建Linux环境-CnetOS 1、安装virtualbox&#xff0c;和Vmware是一样的&#xff0c;只是box更轻量级 1&#xff09;需要注意内存选择&#xff0c;4G 2、启动完成后&#xff0c;需要获取服务器IP地址 命令 ip add 服务器IP地址 通过本地的工具&#xff0c;进…...

mvcc 速读

MVCC&#xff08;Multi-Version Concurrency Control&#xff0c;多版本并发控制&#xff09;是MySQL中一种用于实现数据库并发控制的方法&#xff0c;尤其在InnoDB存储引擎中得到了广泛应用。它的主要作用是提高数据库在高并发场景下的性能&#xff0c;并确保数据的一致性。 …...

美容仪维修过程记录

近期维修的家用射频美容仪&#xff0c;发一些维修过程的拆机图片...

STM32入门开发操作记录(一)——新建工程

目录 一、课程准备1. 课程资料2. 配件清单3. 根目录 二、环境搭建三、新建工程1. 载入器件支持包2. 添加模块3. ST配置4. 外观设置5. 主函数文件 一、课程准备 1. 课程资料 本记录操作流程参考自b站视频BV1th411z7snSTM32入门教程-2023版 细致讲解 中文字幕&#xff0c;课程资…...

QT实现自定义带有提示信息的透明环形进度条

1. 概述 做界面开发的童鞋可能都会遇到这样的需求&#xff0c;就是有一些界面点击了之后比较耗时的操作&#xff0c;需要界面给出一个环形进度条的进度反馈信息. 如何来实现这样的需求呢&#xff0c;话不多说&#xff0c;上效果 透明进度条 2. 代码实现 waitfeedbackprogressba…...

金币程序题

昨天&#xff0c;小孩问了我一个python编程竞赛题&#xff0c;我看了一下题目&#xff0c;是一个数列编程的问题&#xff0c;我在想&#xff0c;小学五年级的学生能搞得懂吗&#xff1f;反正我家小孩是没有搞懂&#xff0c;不知道别人家的小孩能不能搞明白。所以我花了一点时间…...

《Windows API每日一练》9.13资源-鼠标位图和字符串

鼠标指针位图&#xff08;Mouse Cursor Bitmap&#xff09;是用于表示鼠标指针外观的图像。在 Windows 窗口编程中&#xff0c;可以使用自定义的鼠标指针位图来改变鼠标的外观&#xff0c;并提供更加个性化的用户体验。 ■以下是一些与鼠标指针位图相关的要点&#xff1a; ●…...

【保姆级教程】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 …...

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…...

网络安全那些梗

网络安全领域的梗往往以幽默、讽刺或夸张的方式反映了该领域的某些现象、挑战或误解。以下是一些网络安全相关的梗&#xff1a; 关掉服务器是最有效的安全方法&#xff1a;这个梗源自一个笑话&#xff0c;讲述了一位程序员因误解妻子的话而只买了一个包子回家&#xff0c;随后被…...

交通气象站:保障道路安全的智慧之眼

随着社会的快速发展&#xff0c;交通运输日益繁忙&#xff0c;道路安全成为公众关注的焦点。在这个背景下&#xff0c;交通气象站作为保障道路安全的重要设施&#xff0c;正发挥着越来越重要的作用。它们不仅为交通管理部门提供及时、准确的气象信息&#xff0c;也为广大驾驶员…...

【分库】分库的核心原则

目录 分库的核心原则 前言 分区透明性与一致性保证 弹性伸缩性与容错性设计 数据安全与访问控制机制 分库的核心原则 前言 在设计和实施分库策略时&#xff0c;遵循一系列核心原则是至关重要的&#xff0c;以确保系统不仅能够在当前规模下高效运行&#xff0c;还能够随着…...

CVPR 2025 MIMO: 支持视觉指代和像素grounding 的医学视觉语言模型

CVPR 2025 | MIMO&#xff1a;支持视觉指代和像素对齐的医学视觉语言模型 论文信息 标题&#xff1a;MIMO: A medical vision language model with visual referring multimodal input and pixel grounding multimodal output作者&#xff1a;Yanyuan Chen, Dexuan Xu, Yu Hu…...

FFmpeg 低延迟同屏方案

引言 在实时互动需求激增的当下&#xff0c;无论是在线教育中的师生同屏演示、远程办公的屏幕共享协作&#xff0c;还是游戏直播的画面实时传输&#xff0c;低延迟同屏已成为保障用户体验的核心指标。FFmpeg 作为一款功能强大的多媒体框架&#xff0c;凭借其灵活的编解码、数据…...

关于nvm与node.js

1 安装nvm 安装过程中手动修改 nvm的安装路径&#xff0c; 以及修改 通过nvm安装node后正在使用的node的存放目录【这句话可能难以理解&#xff0c;但接着往下看你就了然了】 2 修改nvm中settings.txt文件配置 nvm安装成功后&#xff0c;通常在该文件中会出现以下配置&…...

Golang dig框架与GraphQL的完美结合

将 Go 的 Dig 依赖注入框架与 GraphQL 结合使用&#xff0c;可以显著提升应用程序的可维护性、可测试性以及灵活性。 Dig 是一个强大的依赖注入容器&#xff0c;能够帮助开发者更好地管理复杂的依赖关系&#xff0c;而 GraphQL 则是一种用于 API 的查询语言&#xff0c;能够提…...

ESP32 I2S音频总线学习笔记(四): INMP441采集音频并实时播放

简介 前面两期文章我们介绍了I2S的读取和写入&#xff0c;一个是通过INMP441麦克风模块采集音频&#xff0c;一个是通过PCM5102A模块播放音频&#xff0c;那如果我们将两者结合起来&#xff0c;将麦克风采集到的音频通过PCM5102A播放&#xff0c;是不是就可以做一个扩音器了呢…...

OPenCV CUDA模块图像处理-----对图像执行 均值漂移滤波(Mean Shift Filtering)函数meanShiftFiltering()

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 在 GPU 上对图像执行 均值漂移滤波&#xff08;Mean Shift Filtering&#xff09;&#xff0c;用于图像分割或平滑处理。 该函数将输入图像中的…...

laravel8+vue3.0+element-plus搭建方法

创建 laravel8 项目 composer create-project --prefer-dist laravel/laravel laravel8 8.* 安装 laravel/ui composer require laravel/ui 修改 package.json 文件 "devDependencies": {"vue/compiler-sfc": "^3.0.7","axios": …...

Vite中定义@软链接

在webpack中可以直接通过符号表示src路径&#xff0c;但是vite中默认不可以。 如何实现&#xff1a; vite中提供了resolve.alias&#xff1a;通过别名在指向一个具体的路径 在vite.config.js中 import { join } from pathexport default defineConfig({plugins: [vue()],//…...

LCTF液晶可调谐滤波器在多光谱相机捕捉无人机目标检测中的作用

中达瑞和自2005年成立以来&#xff0c;一直在光谱成像领域深度钻研和发展&#xff0c;始终致力于研发高性能、高可靠性的光谱成像相机&#xff0c;为科研院校提供更优的产品和服务。在《低空背景下无人机目标的光谱特征研究及目标检测应用》这篇论文中提到中达瑞和 LCTF 作为多…...

若依登录用户名和密码加密

/*** 获取公钥&#xff1a;前端用来密码加密* return*/GetMapping("/getPublicKey")public RSAUtil.RSAKeyPair getPublicKey() {return RSAUtil.rsaKeyPair();}新建RSAUti.Java package com.ruoyi.common.utils;import org.apache.commons.codec.binary.Base64; im…...