【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来完成

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/189658.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

中海油“海安杯”一站到底知识竞赛真的很有特色

中海油“海安杯”一站到底知识竞赛规格高&#xff0c;赛制复杂&#xff0c;天纵知识竞赛系统为此次知识竞赛提供了软件支持。本次竞赛设置选手区和擂台区两个区域。比赛共分为五个轮次&#xff0c;五个轮次选手区所有参赛选手均需答题。 第一轮&#xff1a;“脱颖而出” 所有参…

ruoyi-plus-vue docker 部署

本文以 ruoyi-vue-plus 5.x docker 部署为基础 安装虚拟机 部署文档 安装docker 安装docker 安装docker-compose 配置idea环境 上传 /doicker 文件夹 到服务器&#xff1b;赋值 777权限 chmod -R 777 /docker idea构建 jar 包 利用 idea 构建镜像; 创建基础服务 docker…

深入了解 Pinia:现代 Vue 应用的状态管理利器

&#x1f90d; 前端开发工程师&#xff08;主业&#xff09;、技术博主&#xff08;副业&#xff09;、已过CET6 &#x1f368; 阿珊和她的猫_CSDN个人主页 &#x1f560; 牛客高级专题作者、在牛客打造高质量专栏《前端面试必备》 &#x1f35a; 蓝桥云课签约作者、已在蓝桥云…

2017年11月16日 Go生态洞察:Go用户调查深度解析

&#x1f337;&#x1f341; 博主猫头虎&#xff08;&#x1f405;&#x1f43e;&#xff09;带您 Go to New World✨&#x1f341; &#x1f984; 博客首页——&#x1f405;&#x1f43e;猫头虎的博客&#x1f390; &#x1f433; 《面试题大全专栏》 &#x1f995; 文章图文…

CSDN助手:一键下载CSDN博客:高效保存,随时阅读

文章目录 &#x1f4d6; 介绍 &#x1f4d6;&#x1f3e1; 环境 &#x1f3e1;&#x1f4d2; 使用方法 &#x1f4d2;⚓️ 相关链接 ⚓️ &#x1f4d6; 介绍 &#x1f4d6; 这是我自己无聊的时候写的一个应用&#xff0c;以前UI有点丑&#xff0c;这次重写了一下UI 功能如下 …

使用VC++设计程序对一幅256级灰度图像进行全局固定阈值分割、自适应阈值分割

图像分割–全局固定阈值分割、自适应阈值分割 获取源工程可访问gitee可在此工程的基础上进行学习。 该工程的其他文章&#xff1a; 01- 一元熵值、二维熵值 02- 图像平移变换&#xff0c;图像缩放、图像裁剪、图像对角线镜像以及图像的旋转 03-邻域平均平滑算法、中值滤波算法、…

Linux python安装 虚拟环境 virtualenv,以及 git clone的 文件数据, 以及 下资源配置

根目录创建 venvs 文件夹 sudo mkdir /venvs 进入 /venvs 目录 cd /venvsp 创建虚拟环境&#xff0c;前提要按照 python3 安装 的 命令 sudo apt install python3 sudo python3 -m venv 虚拟环境名 激活虚拟环境 source /venvs/zen-venv/bin/activate 安装flask pip install fl…

Java + openCV更换证件照背景色

最近在小红书上看到很多更换证件照背景色的需求&#xff0c;联想到以前自己也更换过证件照背景色而且还是付费的&#xff0c;碰巧最近在看一本书《JavaOpenCV高效入门》&#xff0c;于是查找资料&#xff0c;找到了通过技术解决这个需求的办法。 先看效果图&#xff08;图片来自…

每日一题2023.11.26——个位数统计【PTA】

题目要求&#xff1a; 输入格式&#xff1a; 每个输入包含 1 个测试用例&#xff0c;即一个不超过 1000 位的正整数 N。 输出格式&#xff1a; 对 N 中每一种不同的个位数字&#xff0c;以 D:M 的格式在一行中输出该位数字 D 及其在 N 中出现的次数 M。要求按 D 的升序输出。…

设备树是什么?

设备树&#xff1a; 设备树DTS(Device Tree Source) 描述设备信息的独立的文件。 为什么要引入设备树&#xff1f; 随着芯片的发展&#xff0c;Linux内核中就包含着越来越多这些描述设备的代码&#xff0c;导致Linux内核代码会很臃肿。因此引入了设备树文件&#xff0c;从…

Runloop解析

RunLoop 前言 ​ 本文介绍RunLoop的概念&#xff0c;并使用swift和Objective-C来描述RunLoop机制。 简介 ​ RunLoop——运行循环&#xff08;死循环&#xff09;&#xff0c;它提供了一个事件循环机制在程序运行过程中处理各种事件&#xff0c;例如用户交互、网络请求、定…

前端review

关于实时预览vs code中的颜色代码需要安装的插件&#xff0c;包括html文件格式中的颜色代码安装Flutter Color插件 VSCode 前端常用插件集合 1.Auto Close Tag自动闭合HTML/XML标签 2.Auto Rename Tag自动完成另一侧标签的同步修改 3.Beautify格式化代码&#xff0c;值得注…

Python武器库开发-前端篇之html概述(二十八)

前端篇之html概述(二十八) html概述 HTML5是构建Web内容的一种语言描述方式。HTML5是互联网的下一代标准&#xff0c;是构建以及呈现互联网内容的一种语言方式&#xff0e;被认为是互联网的核心技术之一。HTML产生于1990年&#xff0c;1997年HTML4成为互联网标准&#xff0c;…

斐讯K2结合Padavan实现锐捷认证破解方法

前言 众所周知&#xff0c;校园网在传统模式下是不能直接插路由使用的&#xff0c;但苦于校园网只能连接一台设备的烦恼&#xff0c;不得不“另辟蹊径”来寻求新的解决路径&#xff0c;这不&#xff0c;它来了&#xff0c;它来了&#xff0c;它带着希望走来了。 本文基于斐讯…

基于Haclon的图形镜像案例

项目要求&#xff1a; 图为HALCON的例图“green-dot”&#xff0c;请将其中的圆形图案按水平和垂直两个方向分别进行镜像。 项目知识&#xff1a; 首先要用BLOB分析的方法&#xff0c;得到圆形图案的目标区域&#xff0c;再对其进行镜像。 在HALCON中与镜像相关的算子为mirr…

Android平台GB28181设备接入模块开发填坑指南

技术背景 为什么要开发Android平台GB28181设备接入模块&#xff1f;这个问题不再赘述&#xff0c;在做Android平台GB28181客户端的时候&#xff0c;媒体数据这块&#xff0c;我们已经有了很好的积累&#xff0c;因为在此之前&#xff0c;我们就开发了非常成熟的RTMP推送、轻量…

Deepin使用记录-deepin系统下安装RabbitMq

目录 0、引言 1、由于RabbitMq是erlang语言开发的&#xff0c;所有需要先安装erlang 2、更新源并安装RabbitMq 3、安装完成之后&#xff0c;服务是启动的&#xff0c;可以通过以下语句查看状态 4、这样安装完成之后&#xff0c;是看不到web页面的&#xff0c;需要再安装一…

PTA NeuDs_数据库题目

二.单选题 1.数据库应用程序的编写是基于数据库三级模式中的。 A.模式 B.外模式 C.内模式 D.逻辑模式 用户应用程序根据外模式进行数据操作&#xff0c;通过外模式一模式映射&#xff0c;定义和建立某个外模式与模式间的对应关系 2.对创建数据库模式一类的数据库对象的授权…

【开源项目】C#.NET 扩展库 -- Com.Gitusme.Net.Extensiones.Core

目录 1、项目介绍 2、集成方式 方法一&#xff1a;项目中通过Nuget包管理器安装导入 方法二&#xff1a;手动从Nuget官网下载&#xff0c;下载地址&#xff1a; 3、代码中导入命名空间 4、版本变更说明 1.0.7 版本 1.0.6 版本 1.0.5 版本 1.0.4 版本 5、演示示例 示…

Unity SRP 管线【第三讲:URP 光照】

3.2.3 以前属于Shader部分&#xff0c;Shader部分不进行讲解。 这里只涉及Unity内部管线的设置问题。 文章目录 3.2.3 向GPU发送灯光数据设置光源数据设置主光源设置额外点光源 Shader中的数据 3.2.3 向GPU发送灯光数据 在UniversalRenderPipeline.cs > RenderSingleCamera…