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

MyBatis操作数据库(2)

1.#{}和${}使用

Interger类型的参数可以看到这里显示的语句是:select username,password,age,gender,phone from userinfo where id=?   输入的参数并没有在后面进行拼接,,id的值是使用?进行占位,这种sql称之为"预编译sql".这里,把#{}改成${}观察情况:这里可以看到select username,password,age,gender,phone from userinfo where id=5,参数是直接拼接在sql语句中了.接下来是String类型的参数.观察日志,这里还是使用的占位符,进行预编译.将#{}改成${}之后,观察会报下面的错误这里参数还是直接拼接在sql语句中,但是字符串作为参数传递时,需要添加' ',使用${}不会拼接引号,导致程序报错,既然${}是直接拼接的,就直接在${}上面加上' '即可.从这两个例子可以看出,#{}是使用预编译SQL,通过?占位的方式,提前对SQL进行编译,然后把参数填充到SQL语句中.#{}会根据参数类型,自动拼接引号' '. ${}会直接进行字符产替换,一起对SQL进行编译.如果参数为字符串,需要加上引号''.

2.#{}和${}的区别

#{}和${}的区别就是预编译SQL和即时SQL的区别.一个即时SQL的流程:1.解析语法,检验SQL语句是否正确. 2.优化SQL语句,指定执行计划 3.执行并返回结果.                                                                  #{}比${}的性能更高,绝大多数情况下,某一条SQL语句会被反复调用执行,或是每次执行的时候只有个别的值不同,如果每次都要经过语法解析,SQL优化,SQL编译等,则效率就明显不行了.预编译SQL,在编译一次之后会将编译后的SQL语句缓存起来,后面再次执行这条语句时,不会再次编译,省去了解析优化的等过程,以此来提高效率.                                                                                                       #{}比${}更加安全,可以防止SQL注入,SQL注入是指:是通过操作输入的数据来修改事先定义好的SQL语句,以达到执行代码对服务器进行攻击的方法.由于${}是直接进行拼接的,因此会有sql注入的风险,尽量使用#{}与查询的方式.

3.${}的使用场景:排序功能

如果使用#{},由于是预编译,会主动补充"",但是这个不需要"",所以会报错.

4.数据库连接池

数据库连接池负责分配,管理和释放数据库连接,允许应用程序重复使用一个现有的数据库连接,而不是再重新建立一个.没有数据库连接池的情况:每次执行sql语句,都要先创建一个新的连接对象,然后执行SQL语句,SQL语句执行完,再关闭连接对象释放资源,这种重复的创建链接,销毁连接比较消耗资源.使用数据库连接池的情况:程序启动时,会在数据库连接池中创建一定数量的Connection对象,当客户请求数据库连接池,会从数据库连接池中获取Connection对象,然后执行SQL,SQL语句执行完,再把Connection归还给连接池.使用数据库连接池的优点:1.减少了网络开销 2.资源重用 3.提升了系统的性能.SpringBoot默认使用的数据库连接池是HiKari.

5.动态SQL:动态SQL在Mybatis中用于不同条件下的sql拼接.

5.1 if标签,针对前端一些可能为空的字段,可以使用if标签来进行接收.动态sql推荐使用xml配置的写法,使用注释的写法较为不便.下面是性别这一项,可以为空,用动态sql来进行接收.如果这里添加的时候,不设置gender的值,sql语句如下:设置gender的值,sql语句如下:可以看到这里会根据是否设置gender的值,来进行sql语句的设置.这里test中的gender,是传入对象中的属性,不是数据库字段.

5.2这里是只有一个属性的情况下,那如果是有多个gender字段,一般考虑使用标签结合标签,对这多个字段都采用动态生成的方式.这个动态sql的本质,就是对字段是否为空,进行判断,然后把不为空的字段进行拼接,为了使拼接后的sql语句符合语法,<tirm>标签有下面的属性.prefix:表示整个语句块,以prefix的值作为前缀. suffix:表示整个语句块,以suffix的值作为后缀  prefixOverrids:表示整个语句块要去掉的前缀  suffixOverrids:表示整个语句块要去除掉的后缀.如果将上面的五个属性都设置为可选填的,则Mapper.xml的插入语句为:在上面的sql动态解析时,会做下面的处理,基于prefix配置,开始时加上(   基于suffix配置,结束时加上)基于suffixOverrides配置会在语句的最后去掉,(如果有的话).这里还是要注意<if test='username!=null'>中的username是传入对象的属性.                                                                   5.3<where标签>                                                                                                                                 根据年龄,性别,是否删除这属性中的某几项插叙用户信息.这里并没有类似<tirm>标签中,去除前缀和后缀的选项,原因是<where>只会在子元素有内容的情况下才会插入where子句,而且会自动去除子句开头的AND或OR.                                                           5.4<set>标签:这里根据对象属性来更新用户属性

5.5<foreach>标签:对集合进行遍历时可以使用该标签,属性如下:                                                        collection:绑定方法参数中的集合,如:List,set,map或数组对象. item:遍历时的每一个对象                  open:语句块开头的字符串  close:语句块结束时的字符串   separator:每次遍历之间间隔的字符串5.6<include>标签:在xml映射文件中的SQL,有时可能会存在很多的重复片段,此时就会存在很多的冗余代码.,我们可以对重复的代码片段进行抽取,将<sql>标签封装到一个SLQ片段,然后可以通过<include>标签进行引用.<sql>:定义可重用的SQL片段  <include>:通过属性refid,指定包含的SQL片段.

相关文章:

MyBatis操作数据库(2)

1.#{}和${}使用 Interger类型的参数可以看到这里显示的语句是:select username,password,age,gender,phone from userinfo where id? 输入的参数并没有在后面进行拼接,,id的值是使用?进行占位,这种sql称之为"预编译sql".这里,把#{}改成${}观察情况:这里可以看到…...

C++面向对象(二)

面向对象基础内容参考&#xff1a; C面向对象&#xff08;一&#xff09;-CSDN博客 友元函数 类的友元函数是定义在类外部&#xff0c;但有权访问类的所有私有&#xff08;private&#xff09;成员和保护&#xff08;protected&#xff09;成员。尽管友元函数的原型有在类的定…...

【C语言入门级教学】冒泡排序和指针数组

文章目录 1.冒泡排序2.⼆级指针3.指针数组4.指针数组模拟⼆维数组 1.冒泡排序 冒泡排序的核⼼思想&#xff1a;两两相邻的元素进⾏⽐较。 //⽅法1 void bubble_sort(int arr[], int sz)//参数接收数组元素个数 { int i 0;for(i0; i-1; i) { int j 0; for(j0; j-1; j) { …...

shell脚本中常用的命令

一、设置主机名称 通过文件的方式修改通过命令修改 二、nmcli 查看网卡 ip a s ens160 (网卡名称) ifconfig ens160 nmcli device show ens160 nmcli device status nmcli connection show ens160 2.设置网卡 a)当网卡没有被设置时 b)网卡被设定&#xff0c;需要修改 三…...

Nuxt3部署

最近接了一个项目&#xff0c;需要用到 nuxt3 技术来满足甲方所要求的需求&#xff0c;在部署的时候遇到了很多问题&#xff0c;这里我一一给大家讲述部署流程&#xff0c;以及所遇到的坑 打包部署 部署分为俩种方式&#xff1a; 静态(spa)部署 和 ssr部署 静态部署 静态部…...

网络攻防技术一:绪论

文章目录 一、网络空间CyberSpace1、定义2、基本四要素 二、网络空间安全1、定义2、保护对象3、安全属性4、作用空间 三、网络攻击1、攻击分类2、攻击过程 四、网络防护1、定义2、安全模型3、安全服务5类4、特定安全机制8种5、普遍性安全机制5种 五、网络安全技术发展简史1、第…...

【人工智能】deepseek七篇论文阅读笔记大纲

七篇文章看了整整五天&#xff0c;加上整理笔记和问ds优化&#xff0c;大致的框架是有了。具体的公式细节比较多&#xff0c;截图也比较麻烦&#xff0c;就不列入大纲去做笔记了。 DeepSeek-LLM&#xff1a;一切的起点&#xff0c;所以探索的东西比较多&#xff0c;包括&#x…...

unix/linux source 命令,在当前的 Shell 会话中读取并执行指定文件中的命令

source 命令 (或者它的POSIX等效命令 .):在当前 Shell 环境中执行脚本 简单来说,source 命令的作用是:在当前的 Shell 会话中读取并执行指定文件中的命令。 这意味着,被 source 执行的脚本中的所有命令,就好像是你直接在当前的命令行提示符下逐行输入并执行的一样。 核…...

[leetcode] 二分算法

本文介绍算法题中常见的二分算法。二分算法的模板框架并不复杂&#xff0c;但是初始左右边界的取值以及左右边界如何向中间移动&#xff0c;往往让我们头疼。本文根据博主自己的刷题经验&#xff0c;总结出四类题型&#xff0c;熟记这四套模板&#xff0c;可以应付大部分二分算…...

imgsz参数设置

在YOLOv8中,imgsz参数控制输入图像的尺寸,它直接影响模型的精度、速度和显存占用。对于1280720像素的原始图片,选择合适的imgsz需要平衡以下因素: 一、推荐设置 1. 兼顾精度与速度(推荐) model<...

【算法】分支限界

一、基本思想 &#xff08;分支限界&#xff0c; 分枝限界&#xff0c; 分支界限 文献不同说法但都是一样的&#xff09; 分支限界法类似于回溯法&#xff0c;也是一种在问题的解空间树上搜索问题解的算法。 但一般情况下&#xff0c;分支限界法与回溯法的求解目标不同。回溯…...

使用 C/C++ 和 OpenCV 调用摄像头

使用 C/C 和 OpenCV 调用摄像头 &#x1f4f8; OpenCV 是一个强大的计算机视觉库&#xff0c;它使得从摄像头捕获和处理视频流变得非常简单。本文将指导你如何使用 C/C 和 OpenCV 来调用摄像头、读取视频帧并进行显示。 准备工作 在开始之前&#xff0c;请确保你已经正确安装…...

历史数据分析——广州港

个股简介 公司简介: 华南地区最大的综合性主枢纽港。 本公司是由广州港集团、国投交通、广州发展作为发起人,共同出资以发起方式设立的股份有限公司。 经营分析: 一般经营项目:企业管理服务(涉及许可经营项目的除外);港务船舶调度服务;船舶通信服务;企业自有资金…...

数据库管理与高可用-MySQL全量,增量备份与恢复

目录 #1.1MySQL数据库备份概述 1.1.1数据备份的重要性 1.1.2数据库备份类型 1.1.3常见的备份方法 #2.1数据库完全备份操作 2.1.1物理冷备份与恢复 2.1.2mysqldump备份与恢复 2.1.3MySQL增量备份与恢复 #3.1制定企业备份策略的思路 #4.1扩展&#xff1a;MySQL的GTID 4.1.1My…...

从gitee仓库中恢复IDEA项目某一版本

神奇的功能&#xff01;&#xff01;&#xff01;代码改乱了&#xff0c;但是还有救&#xff01; 打开终端&#xff0c;输入git log 复制想要恢复版本的提交哈希值&#xff0c;打开终端输入git reset --hard <哈希值> &#xff0c;就能修复到那时的提交版本了...

用dayjs解析时间戳,我被提了bug

引言 前几天开发中突然接到测试提的一个 Bug&#xff0c;说我的时间组件显示异常。 我很诧异&#xff0c;这里初始化数据是后端返回的&#xff0c;我什么也没改&#xff0c;这bug提给我干啥。我去问后端&#xff1a;“这数据是不是有问题&#xff1f;”。后端答&#xff1a;“…...

[git每日一句]Changes not staged for commit

在 Git 中&#xff0c;"Changes not staged for commit" 的意思是&#xff1a; 你有已修改的文件&#xff0c;但尚未使用 git add 将它们添加到暂存区&#xff08;Staging Area&#xff09;&#xff0c;因此这些更改不会被包含在下次提交中。 具体含义 已修改但未暂…...

架构师面试题整理

以下是从提供的HTML代码中提取的所有class"title-txt"的文本内容&#xff0c;已排除重复项并按顺序整理&#xff1a; 缓存专题 实战解决大规模缓存击穿导致线上数据库压力暴增面试常问的缓存穿透是怎么回事基于DCL机制解决突发性热点缓存并发重建问题实战Redis分布…...

类和对象:实现日期类

目录 概述 一.实现日期类的基本框架 二.实现比较的运算符重载 1.>的运算符重载 2.的运算符重载 3.其余的比较运算符重载 三.加减天数的运算符重载 1.,的运算符重载 2.-&#xff0c;-的运算符重载 3.对1和2的小优化 四.两个日期类相减的重载 1.&#xff0c;--的重…...

基于springboot的运动员健康管理系统

博主介绍&#xff1a;java高级开发&#xff0c;从事互联网行业六年&#xff0c;熟悉各种主流语言&#xff0c;精通java、python、php、爬虫、web开发&#xff0c;已经做了六年的毕业设计程序开发&#xff0c;开发过上千套毕业设计程序&#xff0c;没有什么华丽的语言&#xff0…...

华为云Flexus+DeepSeek征文 | 初探华为云ModelArts Studio:部署DeepSeek-V3/R1商用服务的详细步骤

华为云FlexusDeepSeek征文 | 初探华为云ModelArts Studio&#xff1a;部署DeepSeek-V3/R1商用服务的详细步骤 前言一、华为云ModelArts Studio平台介绍1.1 ModelArts Studio介绍1.2 ModelArts Studio主要特点1.3 ModelArts Studio使用场景1.4 ModelArts Studio产品架构 二、访问…...

下载即转化的商业密码:解析华为应用商店CPD广告的智能投放逻辑

在移动互联网流量红利见顶的背景下&#xff0c;华为应用市场凭借其终端生态优势正成为开发者获客的新蓝海。数据显示&#xff0c;2025年Q1华为应用商店全球分发量同比增长27%&#xff0c;其中CPD广告因其"下载才付费"的精准特性&#xff0c;已成为金融、游戏、工具类…...

分布式锁和数据库锁完成接口幂等性

1、分布式锁 唯一主键与乐观锁的本质是使用了数据库的锁&#xff0c;但由于数据库锁的性能不太好&#xff0c;所以我们可使用Redis、Zookeeper等中间件来实现分布式锁的功能&#xff0c;以Redis为例实现幂等&#xff1a;当用户通过浏览器发起请求&#xff0c;服务端接收到请求…...

浅谈JMeter之常见问题Address already in use: connect

浅谈JMeter之常见问题Address already in use: connect 在JMeter高并发测试中出现“address already in use”错误&#xff0c;主要源于Windows系统的TCP端口资源耗尽及连接配置问题&#xff0c;在执行JMeter中查看结果树 原因分析 GET请求默认采用短连接&#xff08;Conne…...

【机器学习基础】机器学习入门核心算法:随机森林(Random Forest)

机器学习入门核心算法&#xff1a;随机森林&#xff08;Random Forest&#xff09; 1. 算法逻辑2. 算法原理与数学推导2.1 核心组件2.2 数学推导2.3 OOB&#xff08;Out-of-Bag&#xff09;误差 3. 模型评估评估指标特征重要性可视化 4. 应用案例4.1 医疗诊断4.2 金融风控4.3 遥…...

【深度学习】12. VIT与GPT 模型与语言生成:从 GPT-1 到 GPT4

VIT与GPT 模型与语言生成&#xff1a;从 GPT-1 到 GPT4 本教程将介绍 GPT 系列模型的发展历程、结构原理、训练方式以及人类反馈强化学习&#xff08;RLHF&#xff09;对生成对齐的改进。内容涵盖 GPT-1、GPT-2、GPT-3、GPT-3.5&#xff08;InstructGPT&#xff09;、ChatGPT …...

常规算法学习

算法 1. 排序算法1. 归并排序1.1 普通归并排序1.2 优化后的归并排序&#xff08;TimSort&#xff09; 2. 插入排序2.1 直接插入排序2.2 二分插入排序2.3 成对插入排序 3. 快速排序3.1 单轴快速排序3.2 双轴快排 4. 计数排序 2. 树1. 红黑树&#xff08;Red Black Tree&#xff…...

Google 发布的全新导航库:Jetpack Navigation 3

前言 多年来&#xff0c;Jetpack Navigation 库一直是开发者的重要工具&#xff0c;但随着 Android 用户界面领域的发展&#xff0c;特别是大屏设备的出现和 Jetpack Compose 的兴起&#xff0c;Navigation 的功能也需要与时俱进。 今年的 Google I/O 上重点介绍了 Jetpack Na…...

Arbitrum Stylus 合约实战 :Rust 实现 ERC20

在《Arbitrum Stylus 深入解析与 Rust 合约部署实战》篇中&#xff0c;我们深入探讨了 Arbitrum Stylus 的核心技术架构&#xff0c;包括其 MultiVM 机制、Rust 合约开发环境搭建&#xff0c;以及通过 cargo stylus 实现简单计数器合约的部署与测试。Stylus 作为 Arbitrum Nitr…...

电脑故障基础知识

1.1 了解电脑故障 分类&#xff1a;分为软件故障&#xff08;系统感染病毒、程序错误&#xff09;和硬件故障&#xff08;硬件物理损坏、接触不良&#xff09;。 原因&#xff1a;人为操作失误、病毒破坏、工作环境恶劣&#xff08;高温 / 灰尘&#xff09;、硬件老化。 准备工…...