在 MyBatis 以及 MyBatis - Plus 的开发过程中,注解的使用是提升开发效率和实现特定功能的关键。今天我们就来聊聊 @Options 注解,以及在 MyBatis - Plus 中它的使用场景和替代方案。

一、MyBatis 中的 @Options 注解

在 MyBatis 框架中,@Options 注解是一个非常实用的注解,它主要用于配置 mapper 接口方法的一些执行选项,像缓存、结果集处理、主键生成等方面都能用到它。

1. 新增数据时获取自增主键

在实际开发中,当我们向数据库中插入一条新数据时,常常需要立即获取这条数据的自增主键,以便进行后续的关联操作。在 MyBatis 中,借助 @Options 注解就能轻松实现这一功能。

例如,有一个用户表 user,其 id 是自增主键,对应的实体类 User 和 mapper 接口 UserMapper 如下:

// User实体类public class User {private Long id; // 自增主键private String username;private String email;// 省略getter和setter方法}// UserMapper接口public interface UserMapper {/*** 新增用户并获取自增主键*/@Insert("INSERT INTO user(username, email) VALUES(#{username}, #{email})")@Options(useGeneratedKeys = true, keyProperty = "id", keyColumn = "id")void insertUser(User user);}

在业务层调用时,插入数据后可以直接通过 user.getId () 获取自增的主键:

@Servicepublic class UserService {@Autowiredprivate UserMapper userMapper;public Long addUser(User user) {userMapper.insertUser(user);return user.getId(); // 插入后直接获取自增主键}}

这里,@Options 注解的 useGeneratedKeys 属性设置为 true,表示开启自动生成主键功能;keyProperty 属性指定了主键值要注入到 User 对象的 id 属性中;keyColumn 属性则指定了数据库表中的主键列名,当与实体类的属性名一致时可以省略。通过这样的配置,避免了插入数据后再查询一次主键的额外操作,大大提升了性能。

2. 高频查询配置缓存

对于一些高频访问但不常变更的数据,比如网站首页的热门商品列表,我们可以通过 @Options 注解配置 MyBatis 二级缓存,从而减少数据库的访问压力。

// Product实体类(需要实现Serializable接口,因为缓存要求序列化)public class Product implements Serializable {private Long id;private String name;private BigDecimal price;// 省略getter和setter方法}// ProductMapper接口public interface ProductMapper {/*** 查询热门商品列表,启用缓存*/@Select("SELECT id, name, price FROM product WHERE is_hot = 1 ORDER BY sort DESC LIMIT 10")@Options(useCache = true, flushCache = Options.FlushCachePolicy.FALSE, timeout = 5000)List<Product> getHotProducts();/*** 更新商品信息后刷新缓存,避免缓存脏数据*/@Update("UPDATE product SET name = #{name}, price = #{price} WHERE id = #{id}")@Options(flushCache = Options.FlushCachePolicy.TRUE)void updateProduct(Product product);}

在上面的代码中,getHotProducts 方法通过 @Options 注解配置了 useCache = true,启用了二级缓存,这样后续的请求就可以直接从缓存中获取数据,而不用每次都访问数据库。同时,设置 flushCache = Options.FlushCachePolicy.FALSE,表示查询后不刷新缓存。而 updateProduct 方法设置 flushCache = Options.FlushCachePolicy.TRUE,意味着更新操作后会刷新缓存,避免了缓存中出现脏数据。

3. 大数据量查询优化

当处理大数据量查询,比如导出订单报表时,一次性加载过多数据可能会导致内存溢出。这时,我们可以使用 @Options 注解的 fetchSize 属性来控制 JDBC 每次从数据库读取的行数,进行分批读取,降低内存占用。

// OrderMapper接口public interface OrderMapper {/*** 批量查询订单,用于报表导出*/@Select("SELECT id, order_no, amount, create_time FROM `order` WHERE create_time BETWEEN #{startTime} AND #{endTime}")@Options(fetchSize = 1000, resultSetType = ResultSetType.FORWARD_ONLY)List<Order> queryOrdersByTimeRange(@Param("startTime") LocalDateTime startTime, @Param("endTime") LocalDateTime endTime);}

这里,fetchSize = 1000 表示每次从数据库读取 1000 行数据,resultSetType = ResultSetType.FORWARD_ONLY 设置结果集为只向前滚动,配合 fetchSize 可以达到分批读取数据的效果,有效优化了大数据量查询时的内存占用。

二、MyBatis - Plus 中的情况

MyBatis - Plus 是在 MyBatis 基础上的增强工具,它对很多常见功能进行了更简洁的封装,在很多场景下不需要显式使用 @Options 注解。

1. 主键生成

MyBatis - Plus 提供了 @TableId 注解专门用于主键配置,支持多种主键策略,完全可以替代 @Options 注解在主键生成方面的功能。

例如,对于自增主键,我们可以这样配置:

// 实体类public class User {// 配置主键自增,等价于MyBatis中@Options(useGeneratedKeys = true, keyProperty = "id")@TableId(type = IdType.AUTO)private Long id;private String username;// 省略其他字段和getter、setter方法}// Mapper接口(直接继承BaseMapper,无需编写SQL语句)public interface UserMapper extends BaseMapper<User> {// 插入后可以直接通过user.getId()获取自增主键}// 调用方式User user = new User();user.setUsername("testUser");userMapper.insert(user);Long id = user.getId(); // 直接获取自增主键

MyBatis - Plus 的 IdType.AUTO 会自动处理插入后返回主键的逻辑,非常方便。而且,它还支持其他主键策略,如 UUID、雪花算法等,当使用这些策略时,甚至不需要数据库设置自增,更加灵活。

2. 缓存控制

MyBatis - Plus 并没有改变 MyBatis 的缓存机制,所以如果我们使用 MyBatis 原生的二级缓存,@Options 注解仍然有效。不过,MyBatis - Plus 推荐使用 @CacheNamespace 注解在 Mapper 接口上统一配置缓存,这种方式比在每个方法上分散使用 @Options 注解更简洁。

// 使用@CacheNamespace统一配置缓存(推荐)@CacheNamespace(implementation = MybatisRedisCache.class, eviction = LruCache.class, flushInterval = 60000)public interface ProductMapper extends BaseMapper<Product> {// 所有方法默认使用缓存,无需在每个方法上添加@Options注解}// 个别方法需要特殊配置时,仍可以使用@Options注解覆盖默认配置@Select("SELECT * FROM product WHERE id = #{id}")@Options(useCache = false) // 该方法不使用缓存Product getProductById(Long id);

3. 其他参数配置

对于 fetchSize、timeout 等参数,MyBatis - Plus 没有进行额外的封装,所以在需要这些配置时,仍然需要使用 @Options 注解。

public interface OrderMapper extends BaseMapper<Order> {// 自定义批量查询SQL,设置fetchSize和timeout优化性能@Select("SELECT * FROM `order` WHERE status = #{status}")@Options(fetchSize = 1000, timeout = 10000)List<Order> selectByStatus(@Param("status") Integer status);}

三、总结

@Options 注解在 MyBatis 中有着重要的作用,能帮助我们实现主键获取、缓存控制、大数据量查询优化等功能。而在 MyBatis - Plus 中,由于其对常见功能进行了封装,在主键生成方面,我们可以使用 @TableId 注解替代 @Options;在缓存控制方面,推荐使用 @CacheNamespace 注解进行统一配置;但对于 fetchSize、timeout 等参数,仍然需要使用 @Options 注解来配置。

了解这些知识点,能让我们在使用 MyBatis 和 MyBatis - Plus 进行开发时,更加灵活地处理各种业务场景,提高开发效率和系统性能。

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

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

相关文章

转换图(State Transition Diagram)和时序图(Sequence Diagram)画图流程图工具

针对程序员绘制状态转换图&#xff08;State Transition Diagram&#xff09;和时序图&#xff08;Sequence Diagram&#xff09;的需求&#xff0c;以下是一些好用的工具推荐&#xff0c;涵盖在线工具、桌面软件和基于文本的工具&#xff0c;适合不同场景和偏好。这些工具在易…

基于php的在线酒店管理系统(源代码+文档+PPT+调试+讲解)

课题摘要在旅游住宿行业数字化转型的背景下&#xff0c;传统酒店管理存在房态更新滞后、预订渠道分散等问题。基于 PHP 的在线酒店管理系统&#xff0c;凭借其开发高效、兼容性强的特点&#xff0c;构建集客房管理、预订处理、客户服务于一体的综合性管理平台。 系统核心功能包…

视频质量检测中卡顿识别准确率↑32%:陌讯多模态评估框架实战解析

原创声明本文为原创技术解析&#xff0c;核心技术参数与架构设计引用自《陌讯技术白皮书》&#xff0c;禁止未经授权的转载与改编。一、行业痛点&#xff1a;视频质量检测的现实挑战在实时流媒体、在线教育、安防监控等领域&#xff0c;视频质量直接影响用户体验与业务可信度。…

流式输出阻塞原因及解决办法

流式输出不懂可看这篇文章&#xff1a;流式输出&#xff1a;概念、技巧与常见问题 正常情况&#xff0c;如下代码所示&#xff1a; async def event_generator():# 先输出数字1yield "data: 1\n\n"# 然后每隔2秒输出数字2&#xff0c;共输出10次for i in range(10):…

linux系统----Ansible中的playbook简单应用

目录 Playbooks中tasks语法使用 1、file 创建文件&#xff1a;touch 创建目录&#xff1a;directory 2、lineinfile 修改文件某一行文本 3、replace 根据正则表达式替换文件内容&#xff08;指定换字符串&#xff09; 5、template/copy 模板作用类似于copy&#xff0…

bmcweb工作流程

在openbmc中,bmcweb是一个web服务程序,类似于lighttpd,提供web服务。本文将简单介绍这个服务进程的执行流程。 bmcweb的入口函数main(). main() -> run() run()先注册routes,最后调用app.run(). 第一个注册的route为crow::webassets:requestRoutes(). crow::webasse…

伞状Meta分析重构癌症幸存者照护指南:从矛盾证据到精准决策

还记得你第一次做出Meta分析时的成就感吗&#xff1f;那种从海量文献中抽丝剥茧&#xff0c;最终得出可靠结论的感觉&#xff0c;简直不要太爽&#xff01;但是&#xff0c;时代在进步&#xff0c;科研在卷动&#xff0c;Meta分析也有它的"升级版"——伞状Meta分析&a…

IOMMU Client设备DMA配置过程分析(九)

1.设备树 cp0_pcie0是一个PCIe RC控制器&#xff0c;使用SMMU将PCIe设备的IOVA转换成物理地址&#xff0c;使用iommu-map-mask和iommu-map定义PCIe设备使用的Stream ID。设备树定义如下所示。 [arch/arm64/boot/dts/marvell/armada-ap80x.dtsi] smmu: iommu100000 {compatibl…

使用node-cron实现Node.js定时任务

1. 简介 node-cron 是一个轻量级的Node.js库&#xff0c;用于在指定时间或间隔执行任务。它是Unix系统cron工具的JavaScript实现&#xff0c;适用于需要定时执行脚本的场景&#xff08;如数据备份、定期爬虫等&#xff09;。 2. 安装 npm install node-cron # 或 yarn add node…

前缀和-525.连续数组-力扣(LeetCode)

一、题目解析1、只包含0、1的二进制数组2、找到含有相同数量的0和1&#xff0c;并返回其子数组长度二、算法原理解法1&#xff1a;暴力枚举 时间复杂度O(N^2)解法2&#xff1a;前缀和哈希表对于统计子数组中的0和1的数量有点困难&#xff0c;我们可以将其转化一下转化&#xff…

汽车电子控制系统开发的整体安全理念

1. 摘要在汽车制造商和一级供应商避免责任的背景下&#xff0c;公认的技术规则作为法律要求的标准具有重要的实际意义。道路车辆电子控制单元的安全性目前主要通过 ISO 26262 的要求和流程来保障。特别是随着道路交通自动化程度的不断提高以及现代车辆随之而来的复杂性&#xf…

IDEA重新安装常用设置

IDEA重新安装常用设置 展示固定导航栏 项目构建和运行操作委托给maven 参考&#xff1a;IDEA build委托到Maven build

微服务的编程测评系统9-竞赛新增-竞赛编辑

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录前言1. 竞赛新增1.1 竞赛基本信息增加-后端开发1.2 竞赛新增题目-后端1.3 竞赛基本信息-前端1.4 竞赛新增题目-前端2. 竞赛编辑2.1 竞赛详情-后端2.2 竞赛详情-前端2…

《零基础入门AI:线性回归进阶(梯度下降算法详解)》

在上一篇博客中&#xff0c;我们学习了线性回归的基本概念、损失函数&#xff08;如MSE&#xff09;以及最小二乘法。最小二乘法通过求解解析解&#xff08;直接计算出最优参数&#xff09;的方式得到线性回归模型&#xff0c;但它有一个明显的局限&#xff1a;当特征数量很多时…

基于C语言实现的KV存储引擎(一)

基于C语言实现的KV存储引擎项目简介整体架构网络模块的实现recatorproactorNtyco项目简介 本文主要是基于 C 语言来实现一个简单的 KV 存储架构&#xff0c;目的就是将网络模块跟实际开发结合起来。 首先我们知道对于数据的存储可以分为两种方式&#xff0c;一种是在内存中进…

c++和python联合编程示例

安装 C与 Python 绑定工具 pip install pybind11这其实相当于使用 python 安装了一个 c的库 pybind11,这个库只由头文件构成&#xff0c; 支持基础数据类型传递以及 python 的 numpy 和 c的 eigen 库之间的自动转换。 编写 CMakeList.txt cmake_minimum_required(VERSION 3.14)…

【OD机试题解法笔记】贪心歌手

题目描述 一个歌手准备从A城去B城参加演出。 按照合同&#xff0c;他必须在 T 天内赶到歌手途经 N 座城市歌手不能往回走每两座城市之间需要的天数都可以提前获知。歌手在每座城市都可以在路边卖唱赚钱。 经过调研&#xff0c;歌手提前获知了每座城市卖唱的收入预期&#xff1a…

AI: 告别过时信息, 用RAG和一份PDF 为LLM打造一个随需更新的“外脑”

嘿&#xff0c;各位技术同学&#xff01;今天&#xff0c;我们来聊一个大家在使用大语言模型&#xff08;LLM&#xff09;时都会遇到的痛点&#xff1a;知识过时。 无论是像我一样&#xff0c;用 Gemini Pro 学习日新月异的以太坊&#xff0c;还是希望它能精确掌握某个特定工具…

深度学习(鱼书)day08--误差反向传播(后三节)

深度学习&#xff08;鱼书&#xff09;day08–误差反向传播&#xff08;后三节&#xff09;一、激活函数层的实现 这里&#xff0c;我们把构成神经网络的层实现为一个类。先来实现激活函数的ReLU层和Sigmoid层。ReLU层 激活函数ReLU&#xff08;Rectified Linear Unit&#xff…

C# 中生成随机数的常用方法

1. 使用 Random 类&#xff08;简单场景&#xff09; 2. 使用 RandomNumberGenerator 类&#xff08;安全场景&#xff09; 3. 生成指定精度的随机小数 C# 中生成随机数的常用方法&#xff1a; 随机数类型实现方式示例代码特点与适用场景随机整数&#xff08;无范围&#xf…