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.…...
conda相比python好处
Conda 作为 Python 的环境和包管理工具,相比原生 Python 生态(如 pip 虚拟环境)有许多独特优势,尤其在多项目管理、依赖处理和跨平台兼容性等方面表现更优。以下是 Conda 的核心好处: 一、一站式环境管理:…...
基础测试工具使用经验
背景 vtune,perf, nsight system等基础测试工具,都是用过的,但是没有记录,都逐渐忘了。所以写这篇博客总结记录一下,只要以后发现新的用法,就记得来编辑补充一下 perf 比较基础的用法: 先改这…...
如何为服务器生成TLS证书
TLS(Transport Layer Security)证书是确保网络通信安全的重要手段,它通过加密技术保护传输的数据不被窃听和篡改。在服务器上配置TLS证书,可以使用户通过HTTPS协议安全地访问您的网站。本文将详细介绍如何在服务器上生成一个TLS证…...
ABAP设计模式之---“简单设计原则(Simple Design)”
“Simple Design”(简单设计)是软件开发中的一个重要理念,倡导以最简单的方式实现软件功能,以确保代码清晰易懂、易维护,并在项目需求变化时能够快速适应。 其核心目标是避免复杂和过度设计,遵循“让事情保…...
#Uniapp篇:chrome调试unapp适配
chrome调试设备----使用Android模拟机开发调试移动端页面 Chrome://inspect/#devices MuMu模拟器Edge浏览器:Android原生APP嵌入的H5页面元素定位 chrome://inspect/#devices uniapp单位适配 根路径下 postcss.config.js 需要装这些插件 “postcss”: “^8.5.…...
嵌入式常见 CPU 架构
架构类型架构厂商芯片厂商典型芯片特点与应用场景PICRISC (8/16 位)MicrochipMicrochipPIC16F877A、PIC18F4550简化指令集,单周期执行;低功耗、CIP 独立外设;用于家电、小电机控制、安防面板等嵌入式场景8051CISC (8 位)Intel(原始…...
热烈祝贺埃文科技正式加入可信数据空间发展联盟
2025年4月29日,在福州举办的第八届数字中国建设峰会“可信数据空间分论坛”上,可信数据空间发展联盟正式宣告成立。国家数据局党组书记、局长刘烈宏出席并致辞,强调该联盟是推进全国一体化数据市场建设的关键抓手。 郑州埃文科技有限公司&am…...
Vue 3 + WebSocket 实战:公司通知实时推送功能详解
📢 Vue 3 WebSocket 实战:公司通知实时推送功能详解 📌 收藏 点赞 关注,项目中要用到推送功能时就不怕找不到了! 实时通知是企业系统中常见的功能,比如:管理员发布通知后,所有用户…...
Python 高级应用10:在python 大型项目中 FastAPI 和 Django 的相互配合
无论是python,或者java 的大型项目中,都会涉及到 自身平台微服务之间的相互调用,以及和第三发平台的 接口对接,那在python 中是怎么实现的呢? 在 Python Web 开发中,FastAPI 和 Django 是两个重要但定位不…...
echarts使用graphic强行给图增加一个边框(边框根据自己的图形大小设置)- 适用于无法使用dom的样式
pdf-lib https://blog.csdn.net/Shi_haoliu/article/details/148157624?spm1001.2014.3001.5501 为了完成在pdf中导出echarts图,如果边框加在dom上面,pdf-lib导出svg的时候并不会导出边框,所以只能在echarts图上面加边框 grid的边框是在图里…...
