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

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}", "待处理字符串");

使用提示:

  1. 通过使用 MyBatis-Plus 的 Wrapper 条件构造器,开发者可以更加高效地构建复杂的数据库查询条件,同时保持代码的简洁性和安全性。以下是一些注意事项与推荐做法:

  2. 在使用 Wrapper 时,尽量使用 Lambda 表达式来避免硬编码字段名,这样可以提高代码的可读性和可维护性。

  3. Wrapper 支持链式调用,可以组合多个条件,如 and、or 等逻辑操作符。

  4. 在更新操作中使用 UpdateWrapper 或 LambdaUpdateWrapper 时,可以省略实体对象,直接在 Wrapper 中设置更新字段。

  5. 注意 Wrapper 的线程安全性,通常在每次使用时创建新的 Wrapper 实例。

  6. 在使用 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。
注意事项:

  1. 版本要求:确保你的项目中使用的 mybatis-plus 版本至少为 3.0.7,以支持自定义 SQL 功能。
  2. 参数命名:在自定义 SQL 时,传递 Wrapper 对象作为参数时,参数名必须为 ew,或者使用注解 @Param(Constants.WRAPPER) 明确指定参数为 Wrapper 对象。
  3. 使用 ${ew.customSqlSegment}:在 SQL 语句中,使用 ${ew.customSqlSegment} 来引用 Wrapper 对象生成的 SQL 片段。
  4. 不支持基于 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示例&#xff1a; 线程安全性示例&#xff1a; 使用 Wrapper 自定义 SQL示例&#xff1a;使用方法 使用注解查询使用XML配置查询链式调用与Lambda式调用 条件构造器补充知识 TypeHandler 在 wrapper 中使用 typeHandler 需要特…...

交通标志识别系统Python+卷积神经网络算法+深度学习人工智能+TensorFlow模型训练+计算机课设项目+Django网页界面

一、介绍 交通标志识别系统。本系统使用Python作为主要编程语言&#xff0c;在交通标志图像识别功能实现中&#xff0c;基于TensorFlow搭建卷积神经网络算法模型&#xff0c;通过对收集到的58种常见的交通标志图像作为数据集&#xff0c;进行迭代训练最后得到一个识别精度较高…...

【QT】定时器使用

文章目录 关于 Qt 定时器使用的注意细节总结实例-检查工具使用周期时间是否合理UI设计头文件 remind.h源文件 remind.cpp实现效果 关于 Qt 定时器使用的注意细节总结 一、创建与初始化 使用 QTimer 类来创建定时器。可以在构造函数中指定父对象&#xff0c;确保定时器在正确的…...

虚拟机:3、(待更)WSL2安装Ubuntu系统+实现GPU直通

WSL2实现linux子系统GPU直通 安装WSL2和Ubuntu 见https://blog.csdn.net/bule_shake/article/details/135992375 问题&#xff1a;wsl --update进度卡住 如果命令wsl --update进度一直为0&#xff0c;可以先运行wsl --shutdown&#xff0c;然后再次升级。 微软商店打不开、…...

CSP-J2024年全真模拟题 阅读程序篇2

因为明天考试&#xff0c;这回给大家准备了超详细的解析~ 22.程序中 n 和 m 只有输入正整数&#xff0c;程序的输出值才可能是 YES A.对B.错 23.程序中用到了递归函数 bool fun&#xff08;int n&#xff09; A.对B.错 24.若输入 n 和 m 都是素数&#xff0c;程序的输出值…...

几种手段mfc140u.dll丢失的解决方法,了解mfc140u.dll

在使用Windows操作系统时&#xff0c;许多用户可能会遇到“找不到mfc140u.dll”或“mfc140u.dll未找到”的错误提示。这个错误通常是由于该文件丢失或损坏所致。本文将详细介绍mfc140u.dll文件的作用、丢失的原因及其解决方法&#xff0c;帮助您快速恢复系统的正常运行。 一、m…...

Scrapy爬虫框架 Spider Middleware 爬虫页中间件

在当今的互联网时代,数据的收集和分析变得越来越重要,爬虫技术作为数据获取的重要手段,受到广泛关注。Scrapy 是一个广受欢迎的 Python 爬虫框架,它以其高效、灵活和易于扩展的特点,成为了开发者的首选工具之一。Scrapy 框架中的中间件(Spider Middlewares)是扩展和定制…...

localectl 命令:系统语言、键盘布局和区域设置

一、命令简介 ​localectl​ 是 Linux 系统中用于查询和配置系统语言、键盘布局和区域设置的命令。它属于 systemd​ 系统和服务管理器的一部分&#xff0c;允许用户通过简单的命令行接口更改与本地化相关的配置。 ‍ 相关命令&#xff1a; 如果是时间相关的设置&#xff0…...

《微信小程序实战(3) · 推广海报制作》

&#x1f4e2; 大家好&#xff0c;我是 【战神刘玉栋】&#xff0c;有10多年的研发经验&#xff0c;致力于前后端技术栈的知识沉淀和传播。 &#x1f497; &#x1f33b; CSDN入驻不久&#xff0c;希望大家多多支持&#xff0c;后续会继续提升文章质量&#xff0c;绝不滥竽充数…...

SS-MUSIC

SS-MUSIC 相干信号源带来的缺秩问题什么是中心对称阵列什么是前后向平均技术什么是 SS-MUSIC 算法SS-MUSIC 能解相干的原因SS-MUSIC 改进算法总结参考文献 本文讨论针对一维均匀线阵&#xff08;ULA&#xff0c;Uniform Linear Array&#xff09;的空间平滑 MUSIC&#xff08;S…...

Spring Cloud Gateway组件

Spring Cloud Gateway是Spring Cloud生态系统中的一个关键组件&#xff0c;它基于Spring Framework 5、Spring Boot 2和Project Reactor等技 术构建&#xff0c;为微服务架构提供了强大且灵活的网关服务。以下是对Spring Cloud Gateway的详细介绍&#xff1a;一、概述 Spring …...

激发AI创造力:掌握Prompt提示词的高效提问方法

AI内容创作的核心&#xff1a;提示词Prompt 在AI内容创作中&#xff0c;提示词&#xff08;Prompt&#xff09;是关键因素&#xff0c;能有效引导AI生成高质量、符合预期的内容。通过合理组织提示词&#xff0c;创作者可以大幅提升AI输出的准确性和专业度。掌握提示词的编写技…...

江科大笔记—STM32课程简介

课程简介...

使用 nvm 管理 node 版本:如何在 macOS 和 Windows 上安装使用nvm

&#x1f525; 个人主页&#xff1a;空白诗 文章目录 一、引言二、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 工具提高开发效率;使用文生图工具实现图片设计等工作。 文章目录 项目背景项目介绍+项目展示游戏逻辑概述主界面游戏界面获胜界面失败界面附加功能项目细节项目测试测试样…...

云服务器使用

最近搭建一个内网穿透工具&#xff0c;推荐一个云服务器&#xff1a; 三丰台&#xff1a;https://www.sanfengyun.com/ 作为学生党这个服务器是免费的可以体验使用&#xff01;可以使用免费虚拟主机和云服务器&#xff0c;写一个申请的基本步骤方便大家构建 申请步骤&#x…...

sqli-lab靶场学习(四)——Less11-14(post方法)

前言 第1-10关都是get方法&#xff0c;本关开始进入post方法。其实post也好get也好&#xff0c;本质都差不多&#xff0c;使用的技巧也基本相同。 Less11 第11关打开是一个输入用户名密码的界面 显然登陆对话框会使用post方式提交&#xff0c;这里我们尝试在Username一栏通过…...

GBDT算法原理及其公式推导过程

GBDT&#xff08;Gradient Boosting Decision Tree&#xff0c;梯度提升决策树&#xff09;是一种集成学习方法&#xff0c;主要用于回归和分类任务。它的基本思想是通过迭代地构建一系列弱学习器&#xff08;通常是决策树&#xff09;&#xff0c;并将这些弱学习器组合成一个强…...

网络:UDP协议

个人主页 &#xff1a; 个人主页 个人专栏 &#xff1a; 《数据结构》 《C语言》《C》《Linux》 文章目录 前言UDP协议报头和有效载荷分离的问题有效载荷向上交付的问题&#xff0c;也就是交给哪个进程&#xff1f;怎么确定把报文收全了&#xff1f;UDP报头是如何封装的呢&…...

linux与unix

不同点 1开源性 linux是开源的&#xff0c;unix是闭源的 2跨平台性 linux具有很好的跨平台性&#xff0c;可以运行在多种硬件平台 unix大多需要与指定硬件配套使用 3相关操作 linux既可以进行命令行操作&#xff0c;也可以进行图形化的操作 unix只是命令行下的操作 4对…...

**发散创新:服务端渲染(SSR)的深度实践与性能优化实战**在现代前端架构

发散创新&#xff1a;服务端渲染&#xff08;SSR&#xff09;的深度实践与性能优化实战 在现代前端架构中&#xff0c;服务端渲染&#xff08;Server-Side Rendering, SSR&#xff09; 已不再是“可选特性”&#xff0c;而是提升首屏加载速度、SEO友好度和用户体验的核心手段之…...

告别CNN!用Mask2Former+Swin Transformer实战图像分割,保姆级代码解析

从CNN到Transformer&#xff1a;Mask2Former与Swin Transformer在图像分割中的实战指南 图像分割技术正在经历一场静默的革命。传统卷积神经网络&#xff08;CNN&#xff09;主导的时代逐渐让位于基于Transformer的新型架构&#xff0c;这种转变不仅仅是技术栈的更新&#xff…...

保姆级教程:用AutoDL租4090显卡,在PyCharm里远程复现具身智能论文PAI0(附完整避坑清单)

零基础实战&#xff1a;AutoDLPyCharm复现PAI0具身智能论文全流程指南 第一次接触云端GPU服务器和远程开发&#xff1f;别担心&#xff0c;这篇教程会手把手带你用AutoDL租用4090显卡&#xff0c;并通过PyCharm实现无缝远程开发&#xff0c;完整复现具身智能领域的前沿论文PAI0…...

OriginPro 2023保姆级教程:三步搞定柱状图+点线图组合,让你的科研图表颜值飙升

OriginPro 2023科研图表优化实战&#xff1a;从基础绘图到期刊级组合图表 科研图表是学术论文的"门面"&#xff0c;一张精心设计的图表往往能让审稿人和读者眼前一亮。OriginPro作为科研绘图领域的标杆工具&#xff0c;其2023版本在图表组合和视觉优化方面带来了诸多…...

联络中心支付软件市场最新数据披露:规模达41.37亿元,行业格局加速显现

在全球企业数字化转型浪潮汹涌以及客户对便捷支付体验需求日益增长的背景下&#xff0c;联络中心支付软件市场正迎来前所未有的发展机遇。据恒州诚思调研统计&#xff0c;2025年全球联络中心支付软件市场规模约41.37亿元&#xff0c;预计未来将持续保持平稳增长态势&#xff0c…...

车辆保险笔记

交强险&#xff08;管对方&#xff09;&#xff1a;必须买&#xff0c;如果不出险每年递减10%&#xff0c;管对方财产损失2000元&#xff0c;医疗费用18000元&#xff0c;人员伤残18万&#xff0c;最小是50%三者险&#xff08;管对方&#xff09;&#xff1a;必须买医保外用药&…...

量化交易开发实战指南:从入门到部署

量化交易开发实战指南&#xff1a;从入门到部署 【免费下载链接】StockSharp Algorithmic trading and quantitative trading open source platform to develop trading robots (stock markets, forex, crypto, bitcoins, and options). 项目地址: https://gitcode.com/gh_mi…...

快速构建tomcat配置可视化原型:用快马一键生成配置向导界面

今天想和大家分享一个快速验证Tomcat配置方案的小技巧。作为一个Java开发者&#xff0c;经常需要折腾Tomcat的安装配置&#xff0c;每次都要重复下载、配环境变量、改server.xml这些步骤&#xff0c;特别耗时。最近发现用InsCode(快马)平台可以快速生成一个可视化配置向导&…...

基于高通跃龙IQ-9100的边端协同智能客服系统(2): 边缘端ASR/TTS模型部署实战

&#x1f4cc; 前文回顾&#xff1a;在第一篇文章中&#xff0c;我们介绍了边端协同架构的优势、高通跃龙IQ-9100平台的硬件特性以及系统整体架构设计。接下来&#xff0c;我们将进入实战环节&#xff0c;在IQ-9100平台上完成ASR和TTS模型的部署。1. 边缘端模型部署实战 1.1 环…...

FLUX.1-dev保姆级教程:5分钟在ComfyUI中一键生成惊艳图片

FLUX.1-dev保姆级教程&#xff1a;5分钟在ComfyUI中一键生成惊艳图片 1. 为什么选择FLUX.1-dev&#xff1f; FLUX.1-dev是当前AI图像生成领域的明星模型&#xff0c;由Black Forest Labs开发。它最大的特点是能够生成具有照片级真实感的图像&#xff0c;同时保持了惊人的效率…...