Mybatis-plus进阶篇(五)
文章目录
- 条件构造器补充知识
- TypeHandler
- Wrappers
- 示例:
- 线程安全性
- 示例:
- 使用 Wrapper 自定义 SQL
- 示例:
- 使用方法
- 使用注解查询
- 使用XML配置查询
- 链式调用与Lambda式调用
条件构造器补充知识
TypeHandler
在 wrapper 中使用 typeHandler 需要特殊处理利用 formatSqlMaybeWithParam 方法
// 查询
queryWrapper.apply("type={0,typeHandler="+ MyTypeHandler.class.getCanonicalName()+ "}", "待处理字符串");// 更新
updateWrapper.setSql("type={0,javaType=string,jdbcType=VARCHAR,typeHandler=xxx.xxx.MyTypeHandler}", "待处理字符串");
使用提示:
-
通过使用 MyBatis-Plus 的 Wrapper 条件构造器,开发者可以更加高效地构建复杂的数据库查询条件,同时保持代码的简洁性和安全性。以下是一些注意事项与推荐做法:
-
在使用 Wrapper 时,尽量使用 Lambda 表达式来避免硬编码字段名,这样可以提高代码的可读性和可维护性。
-
Wrapper 支持链式调用,可以组合多个条件,如 and、or 等逻辑操作符。
-
在更新操作中使用 UpdateWrapper 或 LambdaUpdateWrapper 时,可以省略实体对象,直接在 Wrapper 中设置更新字段。
-
注意 Wrapper 的线程安全性,通常在每次使用时创建新的 Wrapper 实例。
-
在使用 MyBatis-Plus 的 Wrapper 时,应避免将前端动态参数直接拼接到 SQL 片段中,以防止 SQL 注入攻击。MyBatis-Plus 提供了安全的参数绑定方式,如使用 eq、apply 等方法,它们会自动处理参数绑定,避免 SQL 注入风险。
Wrappers
MyBatis-Plus 提供了 Wrappers 类,它是一个静态工厂类,用于快速创建 QueryWrapper、UpdateWrapper、LambdaQueryWrapper 和 LambdaUpdateWrapper 的实例。使用 Wrappers 可以减少代码量,提高开发效率。
示例:
// 创建 QueryWrapper
QueryWrapper<User> queryWrapper = Wrappers.query();
queryWrapper.eq("name", "张三");// 创建 LambdaQueryWrapper
LambdaQueryWrapper<User> lambdaQueryWrapper = Wrappers.lambdaQuery();
lambdaQueryWrapper.eq(User::getName, "张三");// 创建 UpdateWrapper
UpdateWrapper<User> updateWrapper = Wrappers.update();
updateWrapper.set("name", "李四");// 创建 LambdaUpdateWrapper
LambdaUpdateWrapper<User> lambdaUpdateWrapper = Wrappers.lambdaUpdate();
lambdaUpdateWrapper.set(User::getName, "李四");
线程安全性
Wrapper 实例不是线程安全的,因此建议在每次使用时创建新的 Wrapper 实例。这样可以避免多线程环境下的数据竞争和潜在的错误。
示例:
// 在每个方法或请求中创建新的 Wrapper 实例
public List<User> getUsersByName(String name) {QueryWrapper<User> queryWrapper = Wrappers.query();queryWrapper.eq("name", name);return userMapper.selectList(queryWrapper);
}
通过遵循这些最佳实践,开发者可以更加安全、高效地使用 MyBatis-Plus 的 Wrapper 条件构造器,构建出既安全又易于维护的数据库操作代码。
使用 Wrapper 自定义 SQL
MyBatis-Plus 提供了强大的 Wrapper 条件构造器,允许开发者自定义 SQL 语句,以满足更复杂的数据库查询需求。为了使用这一功能,请确保你的 mybatis-plus 版本不低于 3.0.7。
注意事项:
- 版本要求:确保你的项目中使用的 mybatis-plus 版本至少为 3.0.7,以支持自定义 SQL 功能。
- 参数命名:在自定义 SQL 时,传递 Wrapper 对象作为参数时,参数名必须为 ew,或者使用注解 @Param(Constants.WRAPPER) 明确指定参数为 Wrapper 对象。
- 使用 ${ew.customSqlSegment}:在 SQL 语句中,使用 ${ew.customSqlSegment} 来引用 Wrapper 对象生成的 SQL 片段。
- 不支持基于 entity 的 where 语句:自定义 SQL 时,Wrapper 对象不会基于实体类自动生成 where 子句,你需要手动编写完整的 SQL 语句。
示例:
import com.baomidou.mybatisplus.core.conditions.Wrapper;
import com.baomidou.mybatisplus.core.toolkit.Constants;
import org.apache.ibatis.annotations.Param;public interface UserMapper extends BaseMapper<User> {@Select("SELECT * FROM user ${ew.customSqlSegment}")List<User> selectByCustomSql(@Param(Constants.WRAPPER) Wrapper<User> wrapper);
}
在上述示例中,我们定义了一个 selectByCustomSql 方法,它使用了一个自定义的 SQL 语句,并通过 ${ew.customSqlSegment} 引入了 Wrapper 对象生成的 SQL 片段。
使用方法
要使用自定义 SQL,只需调用上述方法并传入一个 Wrapper 对象:
QueryWrapper<User> queryWrapper = new QueryWrapper<>();
queryWrapper.eq("name", "张三");List<User> userList = userMapper.selectByCustomSql(queryWrapper);
在这个例子中,selectByCustomSql 方法将执行一个带有 where 条件的查询,该条件由传入的 queryWrapper 对象生成。
通过这种方式,你可以灵活地结合 MyBatis-Plus 的 Wrapper 功能和自定义 SQL,以满足各种复杂的数据库操作需求。
使用注解查询
@Select("select * from mysql_data ${ew.customSqlSegment}")
List<MysqlData> getAll(@Param(Constants.WRAPPER) Wrapper wrapper);
使用XML配置查询
List<MysqlData> getAll(Wrapper ew);
<select id="getAll" resultType="MysqlData">SELECT * FROM mysql_data ${ew.customSqlSegment}
</select>
链式调用与Lambda式调用
MyBatis-Plus提供了两种风格的链式调用:普通链式调用和Lambda式链式调用。需要注意的是,Lambda式链式调用不支持Kotlin。
// 普通链式调用
UpdateChainWrapper<T> update();
// Lambda式链式调用(不支持Kotlin)
LambdaUpdateChainWrapper<T> lambdaUpdate();// 等价示例:
query().eq("id", value).one();
lambdaQuery().eq(Entity::getId, value).one();// 等价示例:
update().eq("id", value).remove();
lambdaUpdate().eq(Entity::getId, value).remove();
通过遵循这些最佳实践,我们可以确保Kotlin中的持久化对象定义既清晰又易于维护,同时充分利用MyBatis-Plus提供的功能。
相关文章:
Mybatis-plus进阶篇(五)
文章目录 条件构造器补充知识TypeHandlerWrappers示例: 线程安全性示例: 使用 Wrapper 自定义 SQL示例:使用方法 使用注解查询使用XML配置查询链式调用与Lambda式调用 条件构造器补充知识 TypeHandler 在 wrapper 中使用 typeHandler 需要特…...
交通标志识别系统Python+卷积神经网络算法+深度学习人工智能+TensorFlow模型训练+计算机课设项目+Django网页界面
一、介绍 交通标志识别系统。本系统使用Python作为主要编程语言,在交通标志图像识别功能实现中,基于TensorFlow搭建卷积神经网络算法模型,通过对收集到的58种常见的交通标志图像作为数据集,进行迭代训练最后得到一个识别精度较高…...
【QT】定时器使用
文章目录 关于 Qt 定时器使用的注意细节总结实例-检查工具使用周期时间是否合理UI设计头文件 remind.h源文件 remind.cpp实现效果 关于 Qt 定时器使用的注意细节总结 一、创建与初始化 使用 QTimer 类来创建定时器。可以在构造函数中指定父对象,确保定时器在正确的…...
虚拟机:3、(待更)WSL2安装Ubuntu系统+实现GPU直通
WSL2实现linux子系统GPU直通 安装WSL2和Ubuntu 见https://blog.csdn.net/bule_shake/article/details/135992375 问题:wsl --update进度卡住 如果命令wsl --update进度一直为0,可以先运行wsl --shutdown,然后再次升级。 微软商店打不开、…...
CSP-J2024年全真模拟题 阅读程序篇2
因为明天考试,这回给大家准备了超详细的解析~ 22.程序中 n 和 m 只有输入正整数,程序的输出值才可能是 YES A.对B.错 23.程序中用到了递归函数 bool fun(int n) A.对B.错 24.若输入 n 和 m 都是素数,程序的输出值…...
几种手段mfc140u.dll丢失的解决方法,了解mfc140u.dll
在使用Windows操作系统时,许多用户可能会遇到“找不到mfc140u.dll”或“mfc140u.dll未找到”的错误提示。这个错误通常是由于该文件丢失或损坏所致。本文将详细介绍mfc140u.dll文件的作用、丢失的原因及其解决方法,帮助您快速恢复系统的正常运行。 一、m…...
Scrapy爬虫框架 Spider Middleware 爬虫页中间件
在当今的互联网时代,数据的收集和分析变得越来越重要,爬虫技术作为数据获取的重要手段,受到广泛关注。Scrapy 是一个广受欢迎的 Python 爬虫框架,它以其高效、灵活和易于扩展的特点,成为了开发者的首选工具之一。Scrapy 框架中的中间件(Spider Middlewares)是扩展和定制…...
localectl 命令:系统语言、键盘布局和区域设置
一、命令简介 localectl 是 Linux 系统中用于查询和配置系统语言、键盘布局和区域设置的命令。它属于 systemd 系统和服务管理器的一部分,允许用户通过简单的命令行接口更改与本地化相关的配置。 相关命令: 如果是时间相关的设置࿰…...
《微信小程序实战(3) · 推广海报制作》
📢 大家好,我是 【战神刘玉栋】,有10多年的研发经验,致力于前后端技术栈的知识沉淀和传播。 💗 🌻 CSDN入驻不久,希望大家多多支持,后续会继续提升文章质量,绝不滥竽充数…...
SS-MUSIC
SS-MUSIC 相干信号源带来的缺秩问题什么是中心对称阵列什么是前后向平均技术什么是 SS-MUSIC 算法SS-MUSIC 能解相干的原因SS-MUSIC 改进算法总结参考文献 本文讨论针对一维均匀线阵(ULA,Uniform Linear Array)的空间平滑 MUSIC(S…...
Spring Cloud Gateway组件
Spring Cloud Gateway是Spring Cloud生态系统中的一个关键组件,它基于Spring Framework 5、Spring Boot 2和Project Reactor等技 术构建,为微服务架构提供了强大且灵活的网关服务。以下是对Spring Cloud Gateway的详细介绍:一、概述 Spring …...
激发AI创造力:掌握Prompt提示词的高效提问方法
AI内容创作的核心:提示词Prompt 在AI内容创作中,提示词(Prompt)是关键因素,能有效引导AI生成高质量、符合预期的内容。通过合理组织提示词,创作者可以大幅提升AI输出的准确性和专业度。掌握提示词的编写技…...
江科大笔记—STM32课程简介
课程简介...
使用 nvm 管理 node 版本:如何在 macOS 和 Windows 上安装使用nvm
🔥 个人主页:空白诗 文章目录 一、引言二、nvm的安装与基本使用2.1 macOS安装nvm2.1.1 使用 curl 安装2.1.2 使用 Homebrew 安装 2.2 Windows安装nvm2.2.1 下载 nvm-windows2.2.2 安装 nvm-windows 2.3 安装node2.4 切换node版本 三、常见问题及解决方案…...
【项目开发 | Python】基于“羊了个羊“风格的消除类小游戏
原创文章,不得转载。 目标:使用 Python 开发"羊了个羊"风格的消除类小游戏,合理运用 AIGC 工具提高开发效率;使用文生图工具实现图片设计等工作。 文章目录 项目背景项目介绍+项目展示游戏逻辑概述主界面游戏界面获胜界面失败界面附加功能项目细节项目测试测试样…...
云服务器使用
最近搭建一个内网穿透工具,推荐一个云服务器: 三丰台:https://www.sanfengyun.com/ 作为学生党这个服务器是免费的可以体验使用!可以使用免费虚拟主机和云服务器,写一个申请的基本步骤方便大家构建 申请步骤&#x…...
sqli-lab靶场学习(四)——Less11-14(post方法)
前言 第1-10关都是get方法,本关开始进入post方法。其实post也好get也好,本质都差不多,使用的技巧也基本相同。 Less11 第11关打开是一个输入用户名密码的界面 显然登陆对话框会使用post方式提交,这里我们尝试在Username一栏通过…...
GBDT算法原理及其公式推导过程
GBDT(Gradient Boosting Decision Tree,梯度提升决策树)是一种集成学习方法,主要用于回归和分类任务。它的基本思想是通过迭代地构建一系列弱学习器(通常是决策树),并将这些弱学习器组合成一个强…...
网络:UDP协议
个人主页 : 个人主页 个人专栏 : 《数据结构》 《C语言》《C》《Linux》 文章目录 前言UDP协议报头和有效载荷分离的问题有效载荷向上交付的问题,也就是交给哪个进程?怎么确定把报文收全了?UDP报头是如何封装的呢&…...
linux与unix
不同点 1开源性 linux是开源的,unix是闭源的 2跨平台性 linux具有很好的跨平台性,可以运行在多种硬件平台 unix大多需要与指定硬件配套使用 3相关操作 linux既可以进行命令行操作,也可以进行图形化的操作 unix只是命令行下的操作 4对…...
RocketMQ延迟消息机制
两种延迟消息 RocketMQ中提供了两种延迟消息机制 指定固定的延迟级别 通过在Message中设定一个MessageDelayLevel参数,对应18个预设的延迟级别指定时间点的延迟级别 通过在Message中设定一个DeliverTimeMS指定一个Long类型表示的具体时间点。到了时间点后…...
【WiFi帧结构】
文章目录 帧结构MAC头部管理帧 帧结构 Wi-Fi的帧分为三部分组成:MAC头部frame bodyFCS,其中MAC是固定格式的,frame body是可变长度。 MAC头部有frame control,duration,address1,address2,addre…...
Spring Boot 实现流式响应(兼容 2.7.x)
在实际开发中,我们可能会遇到一些流式数据处理的场景,比如接收来自上游接口的 Server-Sent Events(SSE) 或 流式 JSON 内容,并将其原样中转给前端页面或客户端。这种情况下,传统的 RestTemplate 缓存机制会…...
关于iview组件中使用 table , 绑定序号分页后序号从1开始的解决方案
问题描述:iview使用table 中type: "index",分页之后 ,索引还是从1开始,试过绑定后台返回数据的id, 这种方法可行,就是后台返回数据的每个页面id都不完全是按照从1开始的升序,因此百度了下,找到了…...
Linux简单的操作
ls ls 查看当前目录 ll 查看详细内容 ls -a 查看所有的内容 ls --help 查看方法文档 pwd pwd 查看当前路径 cd cd 转路径 cd .. 转上一级路径 cd 名 转换路径 …...
系统设计 --- MongoDB亿级数据查询优化策略
系统设计 --- MongoDB亿级数据查询分表策略 背景Solution --- 分表 背景 使用audit log实现Audi Trail功能 Audit Trail范围: 六个月数据量: 每秒5-7条audi log,共计7千万 – 1亿条数据需要实现全文检索按照时间倒序因为license问题,不能使用ELK只能使用…...
Nuxt.js 中的路由配置详解
Nuxt.js 通过其内置的路由系统简化了应用的路由配置,使得开发者可以轻松地管理页面导航和 URL 结构。路由配置主要涉及页面组件的组织、动态路由的设置以及路由元信息的配置。 自动路由生成 Nuxt.js 会根据 pages 目录下的文件结构自动生成路由配置。每个文件都会对…...
Typeerror: cannot read properties of undefined (reading ‘XXX‘)
最近需要在离线机器上运行软件,所以得把软件用docker打包起来,大部分功能都没问题,出了一个奇怪的事情。同样的代码,在本机上用vscode可以运行起来,但是打包之后在docker里出现了问题。使用的是dialog组件,…...
USB Over IP专用硬件的5个特点
USB over IP技术通过将USB协议数据封装在标准TCP/IP网络数据包中,从根本上改变了USB连接。这允许客户端通过局域网或广域网远程访问和控制物理连接到服务器的USB设备(如专用硬件设备),从而消除了直接物理连接的需要。USB over IP的…...
Fabric V2.5 通用溯源系统——增加图片上传与下载功能
fabric-trace项目在发布一年后,部署量已突破1000次,为支持更多场景,现新增支持图片信息上链,本文对图片上传、下载功能代码进行梳理,包含智能合约、后端、前端部分。 一、智能合约修改 为了增加图片信息上链溯源,需要对底层数据结构进行修改,在此对智能合约中的农产品数…...
