【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协议发展
学物联网,来万物简单IoT物联网!! 前言 随着物联网行业不断发展,WiFi技术的发展在其中起着非常关键的作用,也是我们日常生活中使用非常广泛的无线网络技术之一,现在我们随便买一个家用电子产品,…...
FreeRTOS-队列Queue
队列Queue 队列Queue可以用在“任务到任务”、“任务到中断”、“中断到任务”直接传输信息。 队列的阻塞访问(可指定超时时间) 只要知道队列的句柄,任务、ISR都可以读、写该队列。任务读写队列时,如果读写成功了就马上进入就绪态…...
车内总线通信技术简述
1. 前言 本文主要分享一些汽车总线通信技术(CAN、CANFD、LIN、Flex Ray、MOST、LVDS、TTP/C、Ethernet),希望对大家能有所帮助。 2. 多种汽车总线通信技术 2.1 CAN CAN(Controller Area Network)全称为“控制器局域…...
6.2 Windows驱动开发:内核枚举SSSDT表基址
在Windows内核中,SSSDT(System Service Shadow Descriptor Table)是SSDT(System Service Descriptor Table)的一种变种,其主要用途是提供Windows系统对系统服务调用的阴影拷贝。SSSDT表存储了系统调用的函数…...
实时LCM的ImgPilot搭建部署
ImgPilot是具有实时潜在一致性模型(LCM)功能的图像试点 下载源码 GitHub - leptonai/imgpilot: Image pilot with the power of Real-Time Latent Consistency Modelhttps://github.com/leptonai/imgpilot安装前端web cd imgpilot npm install 安装…...
开源与闭源:大模型未来的发展之争
在当今数字化时代,开源与闭源软件一直是技术界争论的热点话题。随着人工智能技术的快速发展,特别是大模型(如GPT-4等)的广泛应用,这个辩论在大模型技术的背景下变得更加引人注目。本文将探讨开源与闭源的优劣势比较&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() 操作的一个铺垫,也是对先前用 JDBC 操作 SQL Server 的温习。以此记录一下用 JDBC 查询 SQL Server 时如何传递一个列表参数。比如想像一下查询语句 select * from users where id in (?) 我们是否能给这里的问题参数传递…...
[算法总结] - 蓄水池采样算法
问题描述 在长度为N的数组中,随机等概率选取K个元素,如何实现这个随机算法。 思路很简单,生成一个[0, N]的随机数index,然后返回index上的数值即可。 但是,如果输入是一个长度未知的数组比如stream,先遍历…...
【Dockerfile】将自己的项目构建成镜像部署运行
目录 1.Dockerfile 2.镜像结构 3.Dockerfile语法 4.构建Java项目 5.基于Java8构建项目 1.Dockerfile 常见的镜像在DockerHub就能找到,但是我们自己写的项目就必须自己构建镜像了。 而要自定义镜像,就必须先了解镜像的结构才行。 2.镜像结构 镜…...
flink和机器学习模型的常用组合方式
背景 flink是一个低延迟高吞吐的系统,每秒处理的数据量高达数百万,而机器模型一般比较笨重,虽然功能强大,但是qps一般都比较低,日常工作中,我们一般是如何把flink和机器学习模型组合起来一起使用呢? fli…...
自动驾驶学习笔记(十二)——定位技术
#Apollo开发者# 学习课程的传送门如下,当您也准备学习自动驾驶时,可以和我一同前往: 《自动驾驶新人之旅》免费课程—> 传送门 《Apollo Beta宣讲和线下沙龙》免费报名—>传送门 文章目录 前言 卫星定位 RTK定位 IMU定位 GNSS定…...
【MySQL系列】PolarDB入门使用
💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…...
第二节HarmonyOS DevEco Studio创建项目以及界面认识
一、创建项目 如果你是首次打开DevEco Studio,那么首先会进入欢迎页。 在欢迎页中单击Create Project,进入项目创建页面。 选择‘Application’,然后选择‘Empty Ability’,单击‘Next’进入工程配置页。 配置页中,详…...
网页设计--第5次课后作业
1、快速学习JavaScript的基本知识第11-14章 JavaScript入门 - 绿叶学习网 2、使用所学的知识完成以下练习。 1)点击 “点亮”按钮 点亮灯泡,点击“熄灭”按钮 熄灭灯泡 2)输入框鼠标聚焦后,展示小写;鼠标离焦后…...
Spring Cache框架,实现了基于注解的缓存功能。
个人简介:Java领域新星创作者;阿里云技术博主、星级博主、专家博主;正在Java学习的路上摸爬滚打,记录学习的过程~ 个人主页:.29.的博客 学习社区:进去逛一逛~ Spring Cache框架 简介Spring Cache 环境准备S…...
CSS-鼠标属性篇
属性名:cursor 功能:设置鼠标光标的样式 属性值: pointer:小手move:移动图标text:文字选择器crosshair:十字架wait:等待help:帮助 eg.html{ cursor: wait;}(此处使用css改…...
Fiddler弱网测试究竟该怎么做?
前言 使用Fiddler对手机App应用进行抓包,可以对App接口进行测试,也可以了解App传输中流量使用及请求响应情况,从而测试数据传输过程中流量使用的是否合理。 抓包过程: 1、Fiddler设置 1)启动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);//在此…...
QMC5883L的驱动
简介 本篇文章的代码已经上传到了github上面,开源代码 作为一个电子罗盘模块,我们可以通过I2C从中获取偏航角yaw,相对于六轴陀螺仪的yaw,qmc5883l几乎不会零飘并且成本较低。 参考资料 QMC5883L磁场传感器驱动 QMC5883L磁力计…...
如何在看板中体现优先级变化
在看板中有效体现优先级变化的关键措施包括:采用颜色或标签标识优先级、设置任务排序规则、使用独立的优先级列或泳道、结合自动化规则同步优先级变化、建立定期的优先级审查流程。其中,设置任务排序规则尤其重要,因为它让看板视觉上直观地体…...
基于uniapp+WebSocket实现聊天对话、消息监听、消息推送、聊天室等功能,多端兼容
基于 UniApp + WebSocket实现多端兼容的实时通讯系统,涵盖WebSocket连接建立、消息收发机制、多端兼容性配置、消息实时监听等功能,适配微信小程序、H5、Android、iOS等终端 目录 技术选型分析WebSocket协议优势UniApp跨平台特性WebSocket 基础实现连接管理消息收发连接…...
(二)原型模式
原型的功能是将一个已经存在的对象作为源目标,其余对象都是通过这个源目标创建。发挥复制的作用就是原型模式的核心思想。 一、源型模式的定义 原型模式是指第二次创建对象可以通过复制已经存在的原型对象来实现,忽略对象创建过程中的其它细节。 📌 核心特点: 避免重复初…...
Springcloud:Eureka 高可用集群搭建实战(服务注册与发现的底层原理与避坑指南)
引言:为什么 Eureka 依然是存量系统的核心? 尽管 Nacos 等新注册中心崛起,但金融、电力等保守行业仍有大量系统运行在 Eureka 上。理解其高可用设计与自我保护机制,是保障分布式系统稳定的必修课。本文将手把手带你搭建生产级 Eur…...
基于Docker Compose部署Java微服务项目
一. 创建根项目 根项目(父项目)主要用于依赖管理 一些需要注意的点: 打包方式需要为 pom<modules>里需要注册子模块不要引入maven的打包插件,否则打包时会出问题 <?xml version"1.0" encoding"UTF-8…...
拉力测试cuda pytorch 把 4070显卡拉满
import torch import timedef stress_test_gpu(matrix_size16384, duration300):"""对GPU进行压力测试,通过持续的矩阵乘法来最大化GPU利用率参数:matrix_size: 矩阵维度大小,增大可提高计算复杂度duration: 测试持续时间(秒&…...
Unit 1 深度强化学习简介
Deep RL Course ——Unit 1 Introduction 从理论和实践层面深入学习深度强化学习。学会使用知名的深度强化学习库,例如 Stable Baselines3、RL Baselines3 Zoo、Sample Factory 和 CleanRL。在独特的环境中训练智能体,比如 SnowballFight、Huggy the Do…...
ios苹果系统,js 滑动屏幕、锚定无效
现象:window.addEventListener监听touch无效,划不动屏幕,但是代码逻辑都有执行到。 scrollIntoView也无效。 原因:这是因为 iOS 的触摸事件处理机制和 touch-action: none 的设置有关。ios有太多得交互动作,从而会影响…...
关键领域软件测试的突围之路:如何破解安全与效率的平衡难题
在数字化浪潮席卷全球的今天,软件系统已成为国家关键领域的核心战斗力。不同于普通商业软件,这些承载着国家安全使命的软件系统面临着前所未有的质量挑战——如何在确保绝对安全的前提下,实现高效测试与快速迭代?这一命题正考验着…...
