MyBatis的核心技术掌握,简单易懂(上)
目录
一.MyBatis中的动态SQL
二.MyBatis中的模糊查询
1. # 符号
2. $ 符号
---问题
---所以大家知道 # 和 $ 在MyBatis中的模糊查询中的区别了嘛??
三.MyBatis 中的结果映射
1. resultType:
2. resultMap:
---问题
---所以大家知道 resultType 和 resultMap 在MyBatis中的映射中的区别了嘛???
一.MyBatis中的动态SQL
动态SQL是MyBatis中一个非常有用的功能,可以根据不同的条件来动态生成SQL语句,以实现更灵活的数据操作。在MyBatis中,动态SQL可以通过使用if、choose、when、otherwise等标签来实现。这些标签可以根据条件判断来决定是否包含某部分SQL语句
MyBatis提供了几种方式来实现动态SQL:
1. 使用基于XML的动态SQL:在映射文件(mapper.xml)中使用if、choose、when、otherwise等标签来实现条件判断和SQL片段的动态拼接。例如:
<select id="findUser" parameterType="map" resultType="User">SELECT *FROM userWHERE 1=1<if test="id != null">AND id = #{id}</if><if test="name != null">AND name = #{name}</if>
</select>
在上面的例子中,根据传入的参数map中的id和name是否为空,动态拼接了不同的SQL片段。
2. 使用基于注解的动态SQL:通过在Java方法上使用@SelectProvider、@UpdateProvider等注解,并在对应的Provider类中编写动态SQL逻辑。Provider类可以根据传入参数动态生成SQL语句。例如:
@SelectProvider(type = UserProvider.class, method = "findUser")
User findUser(Map<String, Object> params);public class UserProvider {public String findUser(Map<String, Object> params) {StringBuilder sql = new StringBuilder("SELECT * FROM user WHERE 1=1");if (params.get("id") != null) {sql.append(" AND id = #{id}");}if (params.get("name") != null) {sql.append(" AND name = #{name}");}return sql.toString();}
}
上面的例子中,根据传入的参数params中的id和name是否为空,动态拼接了不同的SQL语句。
使用动态SQL能够根据不同的条件生成不同的SQL语句,提高了查询的灵活性和代码的可维护性。在实际开发中,可以根据具体需求选择适合的动态SQL实现方式。
二.MyBatis中的模糊查询
1. # 符号:这种方式是使用预编译的方式处理参数,即将参数值转义后拼接到SQL语句中。在SQL语句执行前,会使用PreparedStatement进行参数绑定。这种方式可以一定程度上防止SQL注入攻击,因为参数值会被转义处理。
例如:

输出结果:

在上面的例子中,#{bname}会将传入的bname值进行预编译转义处理,然后再拼接到SQL语句中。
2. $ 符号:这种方式是直接将参数值按照原样拼接到SQL语句中。在SQL语句执行前,不会进行预编译处理。这种方式适用于处理列名、表名等无法通过预编译处理的情况。然而,这种方式存在SQL注入的风险,因为参数值是直接拼接到SQL语句中,没有经过转义处理。
例如:

输出结果:

在上面的例子中,${bname}会将传入的bname值直接拼接到SQL语句中。
---问题
---所以大家知道 # 和 $ 在MyBatis中的模糊查询中的区别了嘛???
-
使用 # 可以有效防止SQL注入攻击,因为参数值会进行预编译处理。但是,这样会导致SQL语句无法被缓存,因为每次参数值不同,都会生成一个新的预编译SQL语句。使用的时候不需要带引号
-
使用 $ 符号可以处理那些不能被预编译处理的部分,使用符号可以处理那些不能被预编译处理的部分,但是存在SQL注入的风险。此外,使用符号会将参数值直接拼接到SQL语句中,有一定的性能提升,因为SQL语句可以被缓存和重用。在使用的时候需要带引号。并且 $ 可以用来做动态列,完成动态开发
因此,在使用#和$时需要根据具体场景和需求来选择合适的方式。一般来说,推荐使用#符号,并根据需要在SQL语句中使用动态SQL来处理特殊情况下的参数拼接。
MyBatis的模糊查询有三种查询方式,上面已经介绍了两种,还有最后一种
它输出的方式和 # 的是一样的,在企业中一般采用这种方式
三.MyBatis 中的结果映射
在MyBatis的结果映射中,resultType和resultMap是两种不同的方式来指定结果映射规则。
1. resultType:
resultType是一种简单的结果映射方式,用于指定查询结果应该映射到的Java对 象的类型。可以直接指定Java对象的类名或别名。
例如:
<select id="getUserById" resultType="User">SELECT *FROM userWHERE id = #{id}
</select>
在上面的例子中,resultType="User"指定了查询结果应该映射到User对象。
2. resultMap:
resultMap是一种更灵活和复杂的结果映射方式,用于定义详细的结果映射规则。通过 在映射文件(mapper.xml)或注解中定义<resultMap>标签或@Results注解来指定结 映 射规则。可以通过<id>、<result>和<association>等标签或注解来指定如何将查询结果映 射到Java对象的属性。
例如:
<resultMap id="userResultMap" type="User"><id property="id" column="id"/><result property="name" column="name"/><result property="age" column="age"/><association property="department" javaType="Department"><id property="id" column="dept_id"/><result property="name" column="dept_name"/></association>
</resultMap>
在上面的例子中,定义了一个名为userResultMap的结果映射,详细指定了查询结果的字段与Java对象的属性之间的映射关系。
---问题
---所以大家知道 resultType 和 resultMap 在MyBatis中的映射中的区别了嘛???
区别和使用场景:
-
resultType适用于简单的结果映射,当查询结果只涉及一个Java对象时,可以使用resultType来指定映射的Java对象类型。这种方式简单明了,适用于简单的查询场景。
-
resultMap适用于复杂的结果映射,当查询结果涉及多个Java对象、关联对象或需要自定义映射规则时,可以使用resultMap来定义详细的结果映射规则。这种方式更灵活,适用于复杂的查询场景。
相关文章:
MyBatis的核心技术掌握,简单易懂(上)
目录 一.MyBatis中的动态SQL 二.MyBatis中的模糊查询 1. # 符号 2. $ 符号 ---问题 ---所以大家知道 # 和 $ 在MyBatis中的模糊查询中的区别了嘛?? 三.MyBatis 中的结果映射 1. resultType: 2. resultMap: ---问题 ---…...
Redisson自定义序列化
Redisson自定义序列化_redisson 序列化_yzh_1346983557的博客-CSDN博客 redis存取的数据一定是可序列化的,而可序列化方式可以自定义。如果不同客户端设置的可序列化方式不一样,会导致读取不一致的问题。常见的序列化方式有几下几种...
MongoDB Long 类型 shell 查询
场景 1、某数据ID为Long类型,JAVA 定义实体类 Id Long id 2、查询数据库,此数据存在 3、使用 shell 查询,查不到数据 4、JAVA代码查询Query.query 不受任何影响 分析 尝试解决(一) long 在 mongo中为 int64 类型…...
回归预测 | MATLAB实现GA-APSO-IBP改进遗传-粒子群算法优化双层BP神经网络多输入单输出回归预测
回归预测 | MATLAB实现GA-APSO-IBP改进遗传-粒子群算法优化双层BP神经网络多输入单输出回归预测 目录 回归预测 | MATLAB实现GA-APSO-IBP改进遗传-粒子群算法优化双层BP神经网络多输入单输出回归预测效果一览基本介绍模型描述程序设计参考资料 效果一览 基本介绍 MATLAB实现GA-…...
Spring cache整合Redis使用介绍
🍓 简介:java系列技术分享(👉持续更新中…🔥) 🍓 初衷:一起学习、一起进步、坚持不懈 🍓 如果文章内容有误与您的想法不一致,欢迎大家在评论区指正🙏 🍓 希望这篇文章对你有所帮助,欢…...
Metasploit提权
一、bypassuac 用户账户控制(User Account Control,简写作UAC)是微软公司在其Windows Vista及更高版本操作系统中采用的一种控制机制。其原理是通知用户是否对应用程序使用硬盘驱动器和系统文件授权,以达到帮助阻止恶意程序(有时也…...
TypeScript三种特殊类型
1.any类型 说明:any类型代表着可以赋值任意类型 let nickname:any"王二"nickname15nicknametruenicknameundefinednicknamenullnickname{}2.unknown类型 说明:类似any类型;只是不能赋值到其它类型上;除了any和known。…...
如何使用CSS实现一个响应式轮播图?
聚沙成塔每天进步一点点 ⭐ 专栏简介⭐ 使用CSS实现响应式轮播图的示例⭐ HTML 结构⭐ CSS 样式 (styles.css)⭐ JavaScript 代码 (script.js)⭐ 实现说明⭐ 写在最后 ⭐ 专栏简介 前端入门之旅:探索Web开发的奇妙世界 记得点击上方或者右侧链接订阅本专栏哦 几何带…...
数据生成 | MATLAB实现MCMC马尔科夫蒙特卡洛模拟的数据生成
数据生成 | MATLAB实现MCMC马尔科夫蒙特卡洛模拟的数据生成 目录 数据生成 | MATLAB实现MCMC马尔科夫蒙特卡洛模拟的数据生成生成效果基本描述模型描述程序设计参考资料 生成效果 基本描述 1.MATLAB实现MCMC马尔科夫蒙特卡洛模拟的数据生成; 2.马尔科夫链蒙特卡洛方…...
【从零开始的rust web开发之路 二】axum中间件和共享状态使用
系列文章目录 第一章 axum学习使用 第二章 axum中间件使用 文章目录 系列文章目录前言一、中间件是什么二、中间件使用常用中间件使用中间件使用TraceLayer中间件实现请求日志打印自定义中间件 共享状态 前言 上篇文件讲了路由和参数相应相关的。axum还有个关键的地方是中间件…...
Vue操作时间
一、获取现在时间 const currentTime () > {let date new Date();let year date.getFullYear(); //月份从0~11,所以加一let month date.getMonth();let dateArr [date.getMonth() 1,date.getDate(),date.getHours(),date.getMinutes(),date.getSeconds(),…...
数据库——Redis 常见数据结构以及使用场景分析
文章目录 1. string2. list3. hash4. set5. sorted set 你可以自己本机安装 redis 或者通过 redis 官网提供的在线 redis 环境。 1. string 介绍 :string 数据结构是简单的 key-value 类型。虽然 Redis 是用 C 语言写的,但是 Redis 并没有使用 C 的字符串…...
数学建模-规划工具箱yalmip
官网下载 实例 %% yalmip 求解 yalmip clc;clear;close all; %% %sdpvar实型变量 intvar 整形变量 binvar 0-1型变量 psdpvar(3,1); %定义变量 %目标函数 要把求最大值转化为最小值 Objective-p(1)^2p(2)^2-p(2)*p(3);%约束条件 Constraints[0<p<1,(p(1)^2p…...
[SQL挖掘机] - 窗口函数 - 计算移动平均
介绍: 在窗口函数使用时,计算的是累积到当前行的所有的数据的相关操作。 实际上,还可以指定更加详细的汇总范围。该汇总范围称为 框架 (frame)。 其实这里也可以理解成一个窗口, 这个窗口是我们可以进行设置的. 之前我们介绍的窗口函数是根据partition…...
域名和hostname
最近用git克隆远程仓库时总是超时,报错说是代理的问题,但打开和关闭代理都没能解决问题,后面了解到可以关闭git命令的全局代理: git config --global --unset http.proxy git config --global --unset https.proxy如果下次要用的…...
echarts 甘特图一组显示多组数据
<template><el-button type"primary" click"addlin">添加线</el-button><el-button type"success" click"addArea">添加区域</el-button><div ref"echart" id"echart" class&qu…...
1139. 最大的以 1 为边界的正方形;2087. 网格图中机器人回家的最小代价;1145. 二叉树着色游戏
1139. 最大的以 1 为边界的正方形 核心思想:枚举正方向的右下角坐标(i,j),然后你只需要判断四条边的连续一的最小个数即可,这里是边求连续一的个数同时求解结果。 087. 网格图中机器人回家的最小代价 核心…...
css滚动条的使用
前言: css滚动条的使用。 1、使用案例1:背景不要,只展示一个滚动条 如果是默认整体,::就够用了,如果是某个元素,可以 .abc:: ,如果是scss这种的 &:: ::-webkit-scrollbar {width: 6px; } ::-webkit…...
优化Python代理爬虫的应用
当我们在资源受限的环境中使用Python代理爬虫时,我们需要采取一些优化措施,以确保程序的高效性和稳定性。在本文中,我将分享一些关于如何优化Python代理爬虫在资源受限环境下的应用的实用技巧。 首先我们来了解,哪些情况算是资源…...
[C++] STL_vector使用与常用接口的模拟实现
文章目录 1、vector的介绍2、vector的使用2.1 vector的定义2.2 vector迭代器的使用2.3 vector的空间增长问题 3、vector的增删查改3.1 push_back(重点)3.2 pop_back(重点)3.3 operator[](重点)3.4 insert3.…...
HARMONYOS应用实例247:七巧板拼图
14.七巧板拼图 功能:拖拽旋转七巧板组件拼成指定图形,训练几何直觉和面积守恒观念。 核心功能 七巧板组件:包含2个大三角形、1个中三角形、2个小三角形、1个正方形、1个平行四边形 拖拽操作:支持拖拽七巧板组件到目标位置 旋转功能:支持旋转七巧板组件(每次旋转45度) 目…...
SteamShutdown终极指南:让Steam下载完成后自动关机的完整解决方案
SteamShutdown终极指南:让Steam下载完成后自动关机的完整解决方案 【免费下载链接】SteamShutdown Automatic shutdown after Steam download(s) has finished. 项目地址: https://gitcode.com/gh_mirrors/st/SteamShutdown 还在为Steam大型游戏下载而熬夜等…...
AnimateDiff保姆级教学:负面提示词详解,轻松提升视频画质
AnimateDiff保姆级教学:负面提示词详解,轻松提升视频画质 你是否遇到过这样的困扰:用AnimateDiff生成的视频创意很棒,但画面总有些小瑕疵?比如人物皮肤上不自然的纹理、背景里莫名其妙的噪点,或是某些区域…...
SD 协议
1、SD 协议科普 SD 协议的全称是 Secure Digital (SD) Interface Protocol,它是由 SD 协会(SDA,Secure Digital Association) 制定的一套标准。 eMMC、SD、SDIO 的关系: SD 卡的协议最初是基于 MMC(MultiM…...
【实战指南】彻底解决conda环境变量配置错误:从报错分析到.bashrc修复
1. 遇到conda环境变量报错怎么办? 刚装完Anaconda/Miniconda,满心欢喜准备大展身手,结果终端里输入conda却蹦出一行刺眼的红色报错:"bash: /opt/conda/bin/conda: No such file or directory"。这种场景我见过太多次了&…...
KittenTTS终极指南:如何在CPU上实现25MB轻量级TTS语音合成
KittenTTS终极指南:如何在CPU上实现25MB轻量级TTS语音合成 【免费下载链接】KittenTTS State-of-the-art TTS model under 25MB 😻 项目地址: https://gitcode.com/gh_mirrors/ki/KittenTTS KittenTTS是一款革命性的轻量级文本转语音工具&#…...
Phi-4-reasoning-vision-15B高算力适配:双GPU显存占用监控与低并发稳定性验证
Phi-4-reasoning-vision-15B高算力适配:双GPU显存占用监控与低并发稳定性验证 1. 模型概述与技术背景 Phi-4-reasoning-vision-15B是微软推出的视觉多模态推理模型,专为复杂视觉理解任务设计。作为2026年发布的重要模型,它在图像理解、文档…...
Java函数冷启动优化不是“选配”,而是SLA硬指标!一线大厂SRE团队正在紧急落地的6项Kubernetes调度增强策略
第一章:Java函数冷启动的本质与SLA倒逼机制Java函数冷启动并非单纯“首次加载慢”的表象,而是JVM生命周期、类加载机制、字节码验证、即时编译(JIT)预热及运行时元数据初始化等多层系统行为在无预热上下文下的集中爆发。当Serverl…...
手把手教你用Python搭建IPTV直播源管理系统(DIYP影音定制版)
Python实战:构建高可用IPTV直播源管理系统(DIYP影音深度集成版) 在流媒体技术蓬勃发展的今天,个性化直播解决方案正成为技术爱好者的新宠。本文将带你从零开始,用Python打造一个功能完备的IPTV直播源管理系统…...
OpenClaw夜间任务优化:Qwen3-32B+RTX4090D镜像低负载模式配置
OpenClaw夜间任务优化:Qwen3-32BRTX4090D镜像低负载模式配置 1. 问题背景与优化动机 去年12月,我开始用OpenClawQwen3-32B模型搭建个人自动化工作流。最初配置的定时备份任务每晚11点准时运行,但很快发现两个问题: 电费异常&am…...
