MyBatis注解开发详解

MyBatis注解开发详解

一、前言

MyBatis是一个优秀的持久层框架,它支持定制化SQL、存储过程以及高级映射。MyBatis免除了几乎所有的JDBC代码和手动设置参数以及获取结果集。MyBatis可以使用简单的XML或注解来配置和映射原始类型、接口和Java POJO(Plain Old Java Objects,普通的Java对象)为数据库中的记录。

在MyBatis中,注解提供了一种更加简洁和直观的方式来配置SQL语句,而无需编写大量的XML配置文件。本文将详细介绍MyBatis的注解开发方式,并通过Java代码示例来展示其用法。

二、环境准备

在开始之前,请确保你的项目中已经引入了MyBatis的依赖。如果你使用Maven,可以在pom.xml文件中添加以下依赖:

<dependency><groupId>org.mybatis</groupId><artifactId>mybatis</artifactId><version>你的MyBatis版本号</version>
</dependency>

同时,你也需要一个支持MyBatis的数据库环境,并在项目中配置好数据库连接信息。

三、MyBatis注解基础

MyBatis提供了多种注解来简化SQL映射的配置,常用的注解包括:

  • @Select:用于执行查询操作。
  • @Insert:用于执行插入操作。
  • @Update:用于执行更新操作。
  • @Delete:用于执行删除操作。
  • @Results:用于配置结果集的映射。
  • @Result:用于配置单个结果映射。
  • @Param:用于传递参数。

四、使用注解配置Mapper接口

假设我们有一个User实体类和一个对应的user表,现在我们要使用注解来配置一个UserMapper接口。

User实体类

public class User {private Integer id;private String username;private String password;// 省略getter和setter方法
}

UserMapper接口

import org.apache.ibatis.annotations.*;@Mapper
public interface UserMapper {// 查询用户列表@Select("SELECT * FROM user")@Results({@Result(column="id", property="id"),@Result(column="username", property="username"),@Result(column="password", property="password")})List<User> selectAll();// 根据ID查询用户@Select("SELECT * FROM user WHERE id = #{id}")User selectById(@Param("id") Integer id);// 插入用户@Insert("INSERT INTO user(username, password) VALUES(#{username}, #{password})")int insertUser(@Param("username") String username, @Param("password") String password);// 更新用户@Update("UPDATE user SET username=#{username}, password=#{password} WHERE id=#{id}")int updateUser(@Param("id") Integer id, @Param("username") String username, @Param("password") String password);// 删除用户@Delete("DELETE FROM user WHERE id = #{id}")int deleteUser(@Param("id") Integer id);
}

在上面的代码中,我们使用了@Mapper注解来标记UserMapper接口,这样MyBatis就能扫描到这个接口并创建相应的代理实现类。然后,我们在接口的方法上使用了@Select@Insert@Update@Delete注解来分别指定SQL查询、插入、更新和删除语句。

注意,在@Select注解中,我们使用了@Results@Result注解来配置结果集的映射关系。这是因为我们的查询语句返回了多个字段,需要将这些字段映射到User对象的属性上。

在需要传递参数的方法中,我们使用了@Param注解来指定参数的名称,这样在SQL语句中就可以通过#{参数名}的方式来引用这些参数了。

五、在Spring Boot中使用MyBatis注解

如果你使用的是Spring Boot框架,那么集成MyBatis注解开发将变得更加简单。Spring Boot提供了自动配置的功能,你只需要添加相应的依赖和配置,Spring Boot就会为你自动配置好MyBatis。

首先,在pom.xml中添加Spring Boot的MyBatis Starter依赖:

<dependency><groupId>org.mybatis.spring.boot</groupId><artifactId>mybatis-spring-boot-starter</artifactId><version>你的MyBatis Spring Boot Starter版本号</version>
</dependency>

然后,在application.propertiesapplication.yml中配置MyBatis和数据库连接信息:

application.properties 示例

# 数据库连接信息
spring.datasource.url=jdbc:mysql://localhost:3306/your_database?useSSL=false&serverTimezone=UTC
spring.datasource.username=your_username
spring.datasource.password=your_password
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver# MyBatis配置
mybatis.type-aliases-package=com.example.model # 实体类所在的包路径
mybatis.mapper-locations=classpath:mapper/*.xml # 如果使用XML配置,指定映射文件位置

application.yml 示例

spring:datasource:url: jdbc:mysql://localhost:3306/your_database?useSSL=false&serverTimezone=UTCusername: your_usernamepassword: your_passworddriver-class-name: com.mysql.cj.jdbc.Drivermybatis:type-aliases-package: com.example.model # 实体类所在的包路径mapper-locations: classpath:mapper/*.xml # 如果使用XML配置,指定映射文件位置

在Spring Boot中,你通常不需要显式地配置SqlSessionFactory或SqlSessionTemplate,因为Spring Boot的自动配置会为你处理这些。你只需要在Mapper接口上使用@Mapper注解,Spring Boot就会创建代理实现类并注入到需要的地方。

六、使用MyBatis注解进行CRUD操作

现在,你可以在Service层或者Controller层中直接调用Mapper接口的方法进行CRUD操作了。Spring Boot会自动注入Mapper接口的实例。

UserService 示例

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;@Service
public class UserService {private final UserMapper userMapper;@Autowiredpublic UserService(UserMapper userMapper) {this.userMapper = userMapper;}public List<User> getAllUsers() {return userMapper.selectAll();}public User getUserById(Integer id) {return userMapper.selectById(id);}public int insertUser(User user) {return userMapper.insertUser(user.getUsername(), user.getPassword());}public int updateUser(User user) {return userMapper.updateUser(user.getId(), user.getUsername(), user.getPassword());}public int deleteUser(Integer id) {return userMapper.deleteUser(id);}
}

在上面的UserService中,我们通过构造器注入的方式将UserMapper注入到UserService中,然后就可以在UserService的方法中调用UserMapper的方法来进行数据库操作了。

七、总结

MyBatis的注解开发方式提供了一种简洁、直观的方式来配置SQL语句和映射关系,减少了XML配置文件的编写量。在Spring Boot中,结合自动配置功能,可以更加便捷地使用MyBatis注解进行数据库操作。当然,注解方式并不完全替代XML配置方式,两者可以混合使用,根据项目的实际情况选择最适合的配置方式。

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

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

相关文章

HTTP/2、HTTP/3对HTTP/1.1的性能改进和优化

HTTP/1.1 相比 HTTP/1.0 提高了什么性能&#xff1f; 性能上的改进&#xff1a; 使用长连接的方式改善了 HTTP/1.0 短连接造成的性能开销。 支持管道&#xff08;pipeline&#xff09;网络传输&#xff0c;只要第一个请求发出去了&#xff0c;不必等其回来&#xff0c;就可以…

Purple Pi OH鸿蒙开发板7天入门OpenHarmony开源鸿蒙教程【五】

在完成了Purple Pi OH大部分的接口测试之后&#xff0c;紧接着就是一个充满挑战的任务——利用SDK来编译生成我们自己的镜像文件。通过这一过程&#xff0c;不仅能够让你获得一个可在真实硬件上运行的系统镜像&#xff0c;更重要的是&#xff0c;它让你对OpenHarmony系统的构建…

C++中的内存管理方式

一、C内存管理方式简介 C语言中的内存管理方式在C中可以继续使用&#xff0c;但是在有些地方就无能为力&#xff0c;而且使用起来比较麻烦。因此C中引入了自己的内存管理方式&#xff0c;通过new和delete操作符进行动态内存管理。 二、new语法 new可以申请1个或多个空间&…

Android自定义binder实现进程间通信

通过binder建立进程间通信&#xff0c;主要分为两步&#xff1a; 1. 定义一个binder的服务&#xff08;在androidManifest.xml中声明&#xff09;接受远端请求。 服务中创建一个binder实例&#xff0c; 在接收到客户端的连接时&#xff0c;向请求方返回回binder的引用。重写Bi…

Qt - 信号和槽

目录 一、信号 二、槽 三、信号和槽的使用 (一) 连接信号和槽 (二) 自定义槽 (三) 通过 Qt Creator生成信号槽代码 (四) 自定义信号 四、带参数的信号和槽 五、信号与槽的断开 六、Qt4版本信号与槽的连接 (一) Qt4版本信号与槽连接的优缺点 一、信号 在 Qt 中&…

【简单模拟】第十二届蓝桥杯省赛第二场C++ B组《特殊年份》(C++)

【题目描述】 今年是 2021 年&#xff0c;2021 这个数字非常特殊&#xff0c;它的千位和十位相等&#xff0c;个位比百位大 1&#xff0c;我们称满足这样条件的年份为特殊年份。 输入 5 个年份&#xff0c;请计算这里面有多少个特殊年份。 【输入格式】 输入 5 行&#xff…

​Ubuntu20.04 创建新的用户​

1、了解Linux目录结构 推荐看一下&#xff1a;https://www.runoob.com/linux/linux-system-contents.html Linux支持多个用户进行操作的&#xff0c;这样提高了系统的安全性&#xff0c;也可以多人共用一个系统&#xff0c;不过要注意的是系统中安装的软件相关路径&#xff0…

CubeMX使用教程(5)——定时器PWM输出

本篇我们将利用CubeMX产生频率固定、占空比可调的两路PWM信号输出 例如PA6引脚输出100Hz的PWM&#xff1b;PA7引脚输出500Hz的PWM&#xff0c;双路同时输出 我们还是利用上一章定时器中断的工程进行学习&#xff0c;这样比较方便 首先打开CubeMX对PA6、PA7进行GPIO配置 注&a…

Mixamo动画素材导入UE5的最简单方法

一、Mixamo素材 官网&#xff1a;https://www.mixamo.com/ Mixamo是Adobe公司出品的免费动画库&#xff0c;可商用。软件分为characters(角色&#xff09;、Animations&#xff08;动画)两个部分。 二、辅助工具MIXAMO CONVERTER 官网&#xff1a;https://terribilisstudio…

Android中MultiDex优化

MultiDex基本思路 当一个Dex文件太肥的时候(方法数目太多、文件太大)&#xff0c;在打包或在安装或运行apk也会出问题。 解决方法就是将这个硕大的Dex文件拆分成若干个小的Dex文件。 刚好一个ClassLoader可以有多个DexFile。 MultiDex主要性能瓶颈 解压缩和Dex优化&#xff08;…

架构师面试问与答

你如何评估和选择合适的分布式缓存方案以提高系统性能&#xff1f; 我会考虑使用分布式缓存系统&#xff0c;如Redis、Memcached等&#xff0c;并根据系统需求和负载情况选择合适的缓存方案。 请简要描述一下你对服务发现和服务注册的理解以及在软件架构中的应用。 服务发现和…

SplitFunctions (BOLT) - 优化阅读笔记

将函数拆分成更小的代码片段&#xff0c;从而执行更激进的代码段重排的优化 在文件 bolt/lib/Passes/SplitFunctions.cpp 相关选项释义默认-split-all-cold尽可能多的分离冷的基本块false-split-align-threshold对齐参数2-split-functions主要功能选项, 分离函数到代码片段fa…

Codeql复现CVE-2018-11776学习笔记

基本使用 1、首先下载struts2漏洞版本源码&#xff1a; https://codeload.github.com/apache/struts/zip/refs/tags/STRUTS_2_3_20 2、构建codeql数据库&#xff08;构建失败文末有解决办法&#xff09;&#xff1a; codeql database create ~/CodeQL/databases/struts2-2.3.…

C#与WPF通用类库

个人集成封装&#xff0c;仓库已公开 NetHelper 集成了一些常用的方法&#xff1b; 如通用的缓存静态操作类、常用的Wpf的ValueConverters、内置的委托类型、通用的反射加载dll操作类、Wpf的ViewModel、Command、Navigation、Messenger、部分常用UserControls(可绑定的Passwo…

通信总线协议之CAN-FD协议详解

文章目录 通信总线之CAN-FD总线协议详解1. CAN-FD 简介1.1 什么是CAN FD1.2 CAN FD的特点 2. CAN-FD总线协议2.1 帧起始2.2 仲裁段2.3 控制段2.4 数据段2.5 CRC段2.6 ACK段2.7 帧结束 3. 如何从传统的CAN升级到CAN FD 通信总线之CAN-FD总线协议详解 1. CAN-FD 简介 1.1 什么是…

selenium高级应用

常见控件应用 复杂的控件操作1.操作Ajax选项2.滑动滑块操作 WebDriver的特殊操作元素class值包含空格property、attribute、text的区别定位动态id 截图功能页面截图页面截图&#xff0c;返回截图的二进制数据页面截图&#xff0c;返回base64的字符串截取指定元素。先定位元素&a…

Vue3:toRef和toRefs的用法

一、情景说明 我们知道&#xff0c;Vue3中想要定义对象类型的响应式数据 可以通过reactive函数实现 如果&#xff0c;后端返回的对象&#xff0c;有很多的字段&#xff0c;我们想进行结构化赋值 但是&#xff0c;又想保证赋值后的变量也是响应式数据 那么&#xff0c;这个时候…

算法进阶之路:十大经典排序算法详解与实践

算法进阶之路&#xff1a;十大经典排序算法详解与实践 在计算机科学的世界里&#xff0c;排序算法是基础且至关重要的一环。无论是数据库查询、数据分析还是日常的编程任务&#xff0c;高效的排序算法都能显著提升程序的性能。本文将带你深入了解十大经典排序算法&#xff0c;…

BeyondCompared4提示“缺少评估信息或损坏”修复

BeyondCompared4提示“缺少评估信息或损坏”修复 使用 beyond compare4&#xff0c;在安装的30天后&#xff0c;出现“缺少评估信息”、“评估信息损坏”的提示 解决方法如下&#xff08;Win11下亲测可行&#xff09; 按 WinR 进入 打开Windows命令运行框&#xff0c;输入cmd …

Redis常见数据类型下

目录 Hash 哈希 常用指令 HSET HGET HEXISTS HDEL HKEYS HVALS HGETALL HMGET 内部编码 Hash类型和关系型数据库 缓存方式对比 List 列表 特点 常用命令 LPUSH LPUSHX RPUSH RPUSHX LRANGE LPOP / RPOP LINDEX LINSERT 阻塞(BLOCK)版…