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

【Mybatis】预编译/即时sql 数据库连接池

回顾

  •  Mybatis是一个持久层框架.
  • 有两种方式(这两种方式可以共存)

   1.注解

   2.xml

一.传递参数

以使用#{} 来接受参数为例

(以上两种方式一样适用的)

1)传递单个参数

#{} 可以为任意名称

2)多个参数

默认的参数名称就是接口方法声明的形参

3)参数为对象

默认给每个对象的每个属性都有一个参数 , 以对象的属性名为参数名.

重命名

可以用@Param注解给参数重命名  , 引用的时候需要使用#{对象名.属性名}

结果映射

Mybatis会自动把mysql返回的数据和Java对象进行映射(根据名称)
如果mysql字段和Java对象的属性名不一致

注解有三种方式

1.给mysql字段设置别名

2.通过@Results映射

3.通过配置自动将mysql字段转驼峰

xml也有三种方式

1.给mysql字段设置别名

2.通过<resultMap>标签

3.通过配置自动将mysql字段转驼峰

二.多表查询

工作中尽量避免多表查询,尤其是对性能要求非常高的项目.

SQL中直接查询多个表,把查询的结果放在一个对象即可.

Mybaits不分单表还是多表.

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

这是mybatis赋值的两种方式.

3.1Integer类型的参数

1.使用#查询

可以发现sql语句的参数使用的 ? 进行占位.

2.使用$查询

使用$, 会直接拼接.

3.2字符串类型的参数

1.使用#查询

会自动加上' '

2.使用$查询

直接拼接, 不会自动加上' ' ;

因此如果参数是字符串,需要加上单引号 ' '

参数是数字类型,也可以加上,查询结果不变,但是可能会导致索引失效,性能失效.

其实上述#{}和${}的区别也就是预编译sql和即使sql的区别

即使sql

一条sql语句执行的顺序的大致流程如下:

1.解析语法和语义

2.优化sql

3.执行sql

如果一条sql执行了上述流程,就称之为 即时sql

预编译sql

大多数情况下,某一条sql会被反复执行(只有一些参数的变化),如果每次都经过上述的三个完整的步骤,势必会影响到效率.

如果编译一次之后就将编译后的sql语句缓存起来,后面再次执行这条语句的时候,不会再次编译,省去了解析优化的过程,以此来提交效率.  这种sql语句就叫预编译sql.

对于#和$,他们有不同的使用场景.有的情况下,使用#是正确的,而有的情况下,使用#却会报错.

比如

select * from user where username= #{ xxx }

这条语句需要一个字符串参数,此时使用# , sql会自动加上' ' ,此时sql语句是正确的.

但是比如排序查询

 select * from user order by #{ xxx }

这条语句是排序, 需要传入参数asc或者desc. 同样也是字符串,

如果使用#,,会给参数加上' ' , 这反倒多此一举了.

还有like模糊查询

select * from user where username=' #{aa}% '

自动加上' '后,无法查询

这种情况下,如果换成$ { },它不会自动加上'' ,看似可以很好的解决问题 .

但是$存在的一个严重的漏洞:SQL注入

正确的解决方法是使用mysql的内置函数concat . 

SQL注入

通过操作输入的数据来修改实现定义好的sql语句,来对服务器进行攻击.

由于没有对用户的输入进行严格的检查,而sql又是拼接而成,当在参数中添加了一些关键字,就可以达到改变sql运行结果的目的.

比如将 ' or 1 = '1 注入到这条sql中

select * from user where username = '${ name } ' 

最后显示的sql就是

select * from user where username ='  ' or 1 = '1 '

此时一定会将所有的行都查询出来,改变了原来的目的.

为什么${}会sql注入

为什么#和$都要加上' ',只有$会存在sql注入问题呢

这是因为#是预编译sql. 预编译sql使用占位符代替字段值,它会被交由数据库预处理,后面传入的值都会被当作值来看待,而不会出现非编译时候的查询 !

$是即时sql.即时sql每次都会经历语法解析,优化和执行的过程,每次传入的值会直接拼接成sql语法,重新解析和执行.

总结注意事项

1.排序                                  不能使用#

2.表名/字段名作为参数        也不能能用#

3.模糊查询                           如果使用# , 使用mysql的内置函数concat函数

4.实际开发中,尽量使用# ;    使用$时,一定要考虑sql注入

预编译sql和即时sql的区别

1.预编译sql的性能更高(有缓存)

2.预编译sql 不存在sql 注入的问题

四.数据库连接池

负责分配,管理,释放数据库连接,避免频繁的创建,销毁连接.它允许应⽤程序重复使⽤⼀个现有的数据库连接,⽽不是再重新建⽴⼀个.

如果不适用数据库连接池,每次执行sql语句,都要先创建一个连接,然后再执行sql语句,执行完还要关掉连接对象释放资源,这种重复的创建连接,销毁连接会比较消耗资源.

而使用数据库连接池,程序启动时,会再数据库连接池中创建一定数量的Connection对象,当客户请求数据库连接,会从数据库连接池中获取Connection对象,然后执行sql,执行完毕之后再把Connection归还给连接池.

优点

1. 减少了⽹络开销

2. 资源重⽤

3. 提升了系统的性能

常⻅的数据库连接池

• C3P0

• DBCP

• Druid

• Hikari

SpringBoot默认使用的数据库连接池Hikari

启动程序的时候就可以看到

目前比较流行的数据库连接池是Durid 和 Hikari

• Druid连接池是阿⾥巴巴开源的数据库连接池项⽬

• 功能强⼤,性能优秀,是Java语⾔最好的数据库连接池之⼀


如果想要切换数据库连接池为druid , 直接引入依赖即可

<dependency><groupId>com.alibaba</groupId><artifactId>druid-spring-boot-starter</artifactId><version>1.1.17</version>
</dependency>


总结

1.表名, 字段名使⽤⼩写字⺟或数字, 单词之间以下划线分割. 尽量避免出现数字开头或者两个下划线

中间只出现数字. 数据库字段名的修改代价很⼤, 所以字段名称需要慎重考虑。

MySQL 在 Windows 下不区分⼤⼩写;

在 Linux 下默认是区分⼤⼩写. 因此, 数据库名, 表名, 字段名都不允许出现任何⼤写字⺟

2. 表必备三字段: id, create_time, update_time

id 必为主键, 类型为 bigint unsigned, 单表时⾃增, 步⻓为 1

create_time, update_time 的类型均为 datetime 类型, create_time表⽰创建时间,update_time表⽰更新时间

3. 在表查询中, 避免使⽤ * 作为查询的字段列表, 标明需要哪些字段

4.#{} 和${} 区别

4.1 #{}:预编译处理, ${}:字符直接替换

4.2 #{} 可以防⽌SQL注⼊, ${}存在SQL注⼊的⻛险, 查询语句中, 可以使⽤ #{} ,推荐使⽤ #{}

4.3但是⼀些场景, #{} 不能完成, ⽐如 排序功能, 表名, 字段名作为参数时, 这些情况需要使⽤${}

4.4模糊查询虽然${}可以完成, 但因为存在SQL注⼊的问题,所以通常使⽤mysql内置函数concat来完成

相关文章:

【Mybatis】预编译/即时sql 数据库连接池

回顾 Mybatis是一个持久层框架.有两种方式(这两种方式可以共存) 1.注解 2.xml 一.传递参数 以使用#{} 来接受参数为例 (以上两种方式一样适用的) 1)传递单个参数 #{} 可以为任意名称 2)多个参数 默认的参数名称就是接口方法声明的形参 3)参数为对象 默认给每个对象的每个属性都…...

物联网AI 无线连接学习之WiFi基础篇 802.11协议发展

学物联网&#xff0c;来万物简单IoT物联网&#xff01;&#xff01; 前言 随着物联网行业不断发展&#xff0c;WiFi技术的发展在其中起着非常关键的作用&#xff0c;也是我们日常生活中使用非常广泛的无线网络技术之一&#xff0c;现在我们随便买一个家用电子产品&#xff0c…...

FreeRTOS-队列Queue

队列Queue 队列Queue可以用在“任务到任务”、“任务到中断”、“中断到任务”直接传输信息。 队列的阻塞访问&#xff08;可指定超时时间&#xff09; 只要知道队列的句柄&#xff0c;任务、ISR都可以读、写该队列。任务读写队列时&#xff0c;如果读写成功了就马上进入就绪态…...

车内总线通信技术简述

1. 前言 本文主要分享一些汽车总线通信技术&#xff08;CAN、CANFD、LIN、Flex Ray、MOST、LVDS、TTP/C、Ethernet&#xff09;&#xff0c;希望对大家能有所帮助。 2. 多种汽车总线通信技术 2.1 CAN CAN&#xff08;Controller Area Network&#xff09;全称为“控制器局域…...

6.2 Windows驱动开发:内核枚举SSSDT表基址

在Windows内核中&#xff0c;SSSDT&#xff08;System Service Shadow Descriptor Table&#xff09;是SSDT&#xff08;System Service Descriptor Table&#xff09;的一种变种&#xff0c;其主要用途是提供Windows系统对系统服务调用的阴影拷贝。SSSDT表存储了系统调用的函数…...

实时LCM的ImgPilot搭建部署

ImgPilot是具有实时潜在一致性模型&#xff08;LCM&#xff09;功能的图像试点 下载源码 GitHub - leptonai/imgpilot: Image pilot with the power of Real-Time Latent Consistency Modelhttps://github.com/leptonai/imgpilot安装前端web cd imgpilot npm install 安装…...

开源与闭源:大模型未来的发展之争

在当今数字化时代&#xff0c;开源与闭源软件一直是技术界争论的热点话题。随着人工智能技术的快速发展&#xff0c;特别是大模型&#xff08;如GPT-4等&#xff09;的广泛应用&#xff0c;这个辩论在大模型技术的背景下变得更加引人注目。本文将探讨开源与闭源的优劣势比较&am…...

linux系统初始化本地git,创建ssh-key

step1, 在linux系统配置你的git信息 sudo apt install -y git//step1 git config --global user.name your_name // github官网注册的用户名 git config --global user.email your_email //gitub官网注册绑定的邮箱 git config --list //可以查看刚才你的配置内容…...

JDBC 操作 SQL Server 时如何传入列表参数

本文是作为将要对 PostgreSQL 的 in, any() 操作的一个铺垫&#xff0c;也是对先前用 JDBC 操作 SQL Server 的温习。以此记录一下用 JDBC 查询 SQL Server 时如何传递一个列表参数。比如想像一下查询语句 select * from users where id in (?) 我们是否能给这里的问题参数传递…...

[算法总结] - 蓄水池采样算法

问题描述 在长度为N的数组中&#xff0c;随机等概率选取K个元素&#xff0c;如何实现这个随机算法。 思路很简单&#xff0c;生成一个[0, N]的随机数index&#xff0c;然后返回index上的数值即可。 但是&#xff0c;如果输入是一个长度未知的数组比如stream&#xff0c;先遍历…...

【Dockerfile】将自己的项目构建成镜像部署运行

目录 1.Dockerfile 2.镜像结构 3.Dockerfile语法 4.构建Java项目 5.基于Java8构建项目 1.Dockerfile 常见的镜像在DockerHub就能找到&#xff0c;但是我们自己写的项目就必须自己构建镜像了。 而要自定义镜像&#xff0c;就必须先了解镜像的结构才行。 2.镜像结构 镜…...

flink和机器学习模型的常用组合方式

背景 flink是一个低延迟高吞吐的系统&#xff0c;每秒处理的数据量高达数百万&#xff0c;而机器模型一般比较笨重&#xff0c;虽然功能强大&#xff0c;但是qps一般都比较低&#xff0c;日常工作中&#xff0c;我们一般是如何把flink和机器学习模型组合起来一起使用呢? fli…...

自动驾驶学习笔记(十二)——定位技术

#Apollo开发者# 学习课程的传送门如下&#xff0c;当您也准备学习自动驾驶时&#xff0c;可以和我一同前往&#xff1a; 《自动驾驶新人之旅》免费课程—> 传送门 《Apollo Beta宣讲和线下沙龙》免费报名—>传送门 文章目录 前言 卫星定位 RTK定位 IMU定位 GNSS定…...

【MySQL系列】PolarDB入门使用

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…...

第二节HarmonyOS DevEco Studio创建项目以及界面认识

一、创建项目 如果你是首次打开DevEco Studio&#xff0c;那么首先会进入欢迎页。 在欢迎页中单击Create Project&#xff0c;进入项目创建页面。 选择‘Application’&#xff0c;然后选择‘Empty Ability’&#xff0c;单击‘Next’进入工程配置页。 配置页中&#xff0c;详…...

网页设计--第5次课后作业

1、快速学习JavaScript的基本知识第11-14章 JavaScript入门 - 绿叶学习网 2、使用所学的知识完成以下练习。 1&#xff09;点击 “点亮”按钮 点亮灯泡&#xff0c;点击“熄灭”按钮 熄灭灯泡 2&#xff09;输入框鼠标聚焦后&#xff0c;展示小写&#xff1b;鼠标离焦后…...

Spring Cache框架,实现了基于注解的缓存功能。

个人简介&#xff1a;Java领域新星创作者&#xff1b;阿里云技术博主、星级博主、专家博主&#xff1b;正在Java学习的路上摸爬滚打&#xff0c;记录学习的过程~ 个人主页&#xff1a;.29.的博客 学习社区&#xff1a;进去逛一逛~ Spring Cache框架 简介Spring Cache 环境准备S…...

CSS-鼠标属性篇

属性名&#xff1a;cursor 功能&#xff1a;设置鼠标光标的样式 属性值&#xff1a; pointer&#xff1a;小手move&#xff1a;移动图标text&#xff1a;文字选择器crosshair&#xff1a;十字架wait&#xff1a;等待help&#xff1a;帮助 eg.html{ cursor: wait;}(此处使用css改…...

Fiddler弱网测试究竟该怎么做?

前言 使用Fiddler对手机App应用进行抓包&#xff0c;可以对App接口进行测试&#xff0c;也可以了解App传输中流量使用及请求响应情况&#xff0c;从而测试数据传输过程中流量使用的是否合理。 抓包过程&#xff1a; 1、Fiddler设置 1&#xff09;启动Fiddler->Tools->…...

蓝桥杯-平方和(599)

【题目】平方和 【通过测试】代码 import java.util.Scanner; import java.util.ArrayList; import java.util.List; // 1:无需package // 2: 类名必须Main, 不可修改public class Main {public static void main(String[] args) {Scanner scan new Scanner(System.in);//在此…...

解锁AI绘图效率工具:ComfyUI插件优化创意工作流指南

解锁AI绘图效率工具&#xff1a;ComfyUI插件优化创意工作流指南 【免费下载链接】ComfyUI_essentials 项目地址: https://gitcode.com/gh_mirrors/co/ComfyUI_essentials 在AI绘图领域&#xff0c;创作者常常面临工作流效率低下、细节控制不足等问题。ComfyUI作为强大的…...

如何利用WebSocket实现biliup的实时直播状态监控与日志推送:完整指南

如何利用WebSocket实现biliup的实时直播状态监控与日志推送&#xff1a;完整指南 【免费下载链接】biliup 自动直播录制、投稿、twitch、ytb频道搬运工具。命令行投稿(B站)和视频下载工具&#xff0c;提供多种登录方式&#xff0c;支持多p。 项目地址: https://gitcode.com/g…...

Helloagents-13travel agent学习笔记

承接上文Helloagents-13.智能旅行助手学习笔记 _helloagents旅游项目-CSDN博客 1.全链路架构梳理 1. 订单接入&#xff08;用户输入 -> 后端接收&#xff09; 前端 (Vue)&#xff1a; 用户在网页上填好目的地&#xff08;如“悉尼”&#xff09;、天数、出发日期等&#x…...

IndexTTS2 V23情感控制实测:如何用滑块调节喜怒哀乐语音

IndexTTS2 V23情感控制实测&#xff1a;如何用滑块调节喜怒哀乐语音 1. 情感语音合成技术概述 1.1 什么是情感语音合成 情感语音合成&#xff08;Emotional Text-to-Speech&#xff09;是语音合成技术的重要分支&#xff0c;它突破了传统TTS系统"机械感"的局限&am…...

Mac环境OpenClaw深度配置:Qwen3-14B镜像多模型切换技巧

Mac环境OpenClaw深度配置&#xff1a;Qwen3-14B镜像多模型切换技巧 1. 为什么需要多模型切换&#xff1f; 去年冬天&#xff0c;当我第一次尝试用OpenClaw自动化处理团队周报时&#xff0c;遇到了一个典型问题&#xff1a;同样的模型配置在处理"数据分析"和"文…...

AI+社科:当机器学习遇见人类社会,一场静悄悄的革命

AI社科&#xff1a;当机器学习遇见人类社会&#xff0c;一场静悄悄的革命 社会科学的传统研究&#xff0c;常依赖于抽样调查与理论推演&#xff0c;如同“盲人摸象”。如今&#xff0c;AI的介入正将我们带入一个“上帝视角”的时代——通过分析亿万人的数字足迹&#xff0c;我们…...

告别混乱!用这7款Chrome书签插件,5分钟搞定你的浏览器收藏夹整理

7款Chrome书签插件打造高效数字工作流&#xff1a;从混乱到秩序的全套解决方案 每次打开浏览器&#xff0c;面对满屏杂乱无章的书签&#xff0c;你是否感到无从下手&#xff1f;那些曾经精心收藏的网页链接&#xff0c;如今却成了数字空间的"垃圾堆"。这不是你一个人…...

Vue项目本地部署神器:phpStudy+nginx配置全流程(支持多项目同时运行)

Vue项目本地部署神器&#xff1a;phpStudynginx配置全流程&#xff08;支持多项目同时运行&#xff09; 每次在本地调试Vue项目时&#xff0c;你是否也遇到过这样的困扰&#xff1f;项目打包后需要部署到服务器才能预览效果&#xff0c;但配置nginx对前端开发者来说又太过复杂。…...

MySQL数据库备份实战:全量、增量、差异备份到底怎么选?

MySQL数据库备份实战&#xff1a;全量、增量、差异备份到底怎么选&#xff1f; 作为数据库管理员&#xff0c;每天最担心的莫过于数据丢失。记得去年我们团队遇到过一次硬盘故障&#xff0c;当时如果没有完善的备份策略&#xff0c;后果不堪设想。选择正确的备份方式不仅关系到…...

DeepSeek-Coder-V2完全指南:从环境搭建到代码生成实战

DeepSeek-Coder-V2完全指南&#xff1a;从环境搭建到代码生成实战 【免费下载链接】DeepSeek-Coder-V2 DeepSeek-Coder-V2: Breaking the Barrier of Closed-Source Models in Code Intelligence 项目地址: https://gitcode.com/GitHub_Trending/de/DeepSeek-Coder-V2 D…...