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语句,适应不同情况下的需求。

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

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

相关文章

LruCache、Glide和SmartRefreshLayout使用总结

&#xff08;一&#xff09;Android智能下拉刷新框架-SmartRefreshLayout https://github.com/scwang90/SmartRefreshLayout?tabreadme-ov-file &#xff08;二&#xff09;LruCache使用 使用它可以进行图片的内存缓存 public class ImageLoaderUtil {private LruCache<St…

three.js官方案例(animation / skinning / ik)webgl_animation_skinning_ik.html学习记录

目录 1 WebGLCubeRenderTarget 2 TransformControls 3 CCDIKSolver 4 CCDIKHelper 4 全部脚本 1 WebGLCubeRenderTarget 球体亮 //WebGLCubeRenderTarget(size : Number, options : Object) //size - the size, in pixels. Default is 1. //options - (可选)一个保存…

软件设计之Java入门视频(15)

软件设计之Java入门视频(15) 视频教程来自B站尚硅谷&#xff1a; 尚硅谷Java入门视频教程&#xff0c;宋红康java基础视频 相关文件资料&#xff08;百度网盘&#xff09; 提取密码&#xff1a;8op3 idea 下载可以关注 软件管家 公众号 学习内容&#xff1a; 该视频共分为1-7…

Java中的CountDownLatch详解

Java中的CountDownLatch详解 大家好&#xff0c;我是微赚淘客系统3.0的小编&#xff0c;是个冬天不穿秋裤&#xff0c;天冷也要风度的程序猿&#xff01; 一、什么是CountDownLatch&#xff1f; CountDownLatch 是Java并发包中的一个工具类&#xff0c;用于实现线程间的等待…

Linux桌面溯源

X窗口系统(X Window System) Linux起源于X窗口系统&#xff08;X Window System&#xff09;&#xff0c;亦即常说的X11&#xff0c;因其版本止于11之故。 X窗口系统&#xff08;X Window System&#xff0c;也常称为X11或X&#xff09;是一种以位图方式显示的软件窗口系统。…

zabbix 7.0 SNMP Hex数据预处理新功能

一、简介 zabbix7.0新特性是监控项新增支持SNMP Hex数据预处理。其中内置了对snmp请求结果Hex转换处理&#xff0c;不再需要使用繁琐的方式&#xff0c;如javascript脚本、替换、修整等方式处理将监控项取值做可视化处理&#xff0c;大福提升SNMP采集获取到Hex数据的处理效率。…

windows安全加固

window安全加固-账号与口令管理 1、账号分配检查 名称 账号分配检查&#xff0c;避免共享账号与无用账号存在 实施目的 根据系统的要求&#xff0c;设定不同的账户和账户组&#xff0c;管理员用户&#xff0c;数据库用户&#xff0c;审计用户&#xff0c;来宾用户等&#xf…

浅析 VO、DTO、DO、PO 的概念

文章目录 I 浅析 VO、DTO、DO、PO1.1 概念1.2 模型1.3 VO与DTO的区别I 浅析 VO、DTO、DO、PO 1.1 概念 VO(View Object) 视图对象,用于展示层,它的作用是把某个指定页面(或组件)的所有数据封装起来。DTO(Data Transfer Object): 数据传输对象,这个概念来源于J2EE的设…

C++《日期》实现

C《日期》实现 头文件实现文件 头文件 在该文件中是为了声明函数和定义类成员 using namespace std; class Date {friend ostream& operator<<(ostream& out, const Date& d);//友元friend istream& operator>>(istream& cin, Date& d);//…

利率上升,利率债价格下跌但信用债价格上涨的理论分析

利率上升&#xff0c;利率债价格下跌但信用债价格上涨的理论分析 在利率上升的环境下&#xff0c;通常会观察到利率债价格下跌&#xff0c;而有时信用债价格却可能上涨。以下是对这种现象的详细理论分析。 利率债和信用债的价格机制 利率债价格下跌 利率债定义&#xff1a;…

flask+mysql入门案例

在 Flask 中集成 MySQL 数据库进行用户管理是一个常见的项目需求。下面将提供一个基础的步骤和代码示例来理解如何从零开始搭建这样一个系统。 1. 环境准备 首先确保你已经安装了 Python 和必要的包。你需要安装 Flask 和用于连接 MySQL 的包 Flask-SQLAlchemy 或者 Flask-My…

【C++】优先级队列(底层代码解释)

一. 定义 优先级队列是一个容器适配器&#xff0c;他可以根据不同的需求采用不同的容器来实现这个数据结构&#xff0c;优先级队列采用了堆的数据结构&#xff0c;默认使用vector作为容器&#xff0c;且采用大堆的结构进行存储数据。 &#xff08;1&#xff09;在第一个构造函数…

Qt之元对象系统

Qt的元对象系统提供了信号和槽机制&#xff08;用于对象间的通信&#xff09;、运行时类型信息和动态属性系统。 元对象系统基于三个要素&#xff1a; 1、QObject类为那些可以利用元对象系统的对象提供了一个基类。 2、在类声明中使用Q_OBJECT宏用于启用元对象特性&#xff0c…

项目收获总结--本地缓存方案选型及使用缓存的坑

本地缓存方案选型及使用缓存的坑 一、摘要二、本地缓存三、本地缓存实现方案3.1 自己编程实现一个缓存3.2 基于 Guava Cache 实现本地缓存3.3 基于 Caffeine 实现本地缓存3.4 基于 Encache 实现本地缓存3.5 小结 四、使用缓存的坑4.1 缓存穿透4.2 缓存击穿4.3 缓存雪崩4.4 数据…

如何管理好【管理层】?

如何管理好管理层? 现在流行“找客户痛点,不如找领导G点” 管理好管理层比管理好员工更重要,不要让管理层成为传话筒。你是抱着很大期望提供优厚的待遇聘用管理层,对于所有人来说,你需要一个这样的职位,对于他需要一分工作而已。出色的管理层就像出色的员工一样非常难寻…

leetcode日记(38)字母异位词分组

最开始的想法是创建vector<vector<string>> result&#xff0c;然后遍历strs中字符串&#xff0c;遍历result中vector&#xff0c;比较vector中第一个string和strs中string&#xff0c;若为字母异位词&#xff0c;则加入vector&#xff0c;若无&#xff0c;则创建新…

新手-前端生态

文章目录 新手的前端生态一、概念的理解1、脚手架2、组件 二、基础知识1、HTML2、css3、JavaScript 三、主流框架vue3框架 四、 工具&#xff08;特定框架&#xff09;1、uinapp 五、组件库&#xff08;&#xff09;1、uView如何在哪项目中导入uView 六、应用&#xff08;各种应…

Vulnhub靶场 | DC系列 - DC2

目录 环境搭建渗透测试 环境搭建 靶机镜像下载地址&#xff1a;https://vulnhub.com/entry/dc-2,311/需要将靶机和 kali 攻击机放在同一个局域网里&#xff1b;本实验kali 的 IP 地址&#xff1a;192.168.10.146。 渗透测试 使用 nmap 扫描 192.168.10.0/24 网段存活主机 …

2024年辽宁省数学建模竞赛C题超详细解题思路+问题一案代码分享

本文将为大家带来2024年C题超详细解题思路&#xff0c;本次竞赛6000人参加&#xff0c;共计2400队伍。C题作为本次竞赛中最简单的一道题目&#xff0c;意味着选题人数也将是最多的。因此&#xff0c;本文将对C题的解题思路以及将要面对的问题&#xff0c;进行详细的说明。希望我…

Perl基础入门指南:从零开始掌握Perl编程

Perl是一种功能强大且灵活的编程语言&#xff0c;广泛应用于系统管理、Web开发、网络编程和文本处理等领域。如果你是编程新手或者想学习一种新的编程语言&#xff0c;Perl是一个不错的选择。本文将带你了解Perl的基础知识&#xff0c;并通过简单的示例代码帮助你快速入门。 什…