在JDBC应用中,如果你已经是稍有水平开发者,你就应该始终以PreparedStatement代替Statement.也就是说,在任何时候都不要使用Statement
一.代码的可读性和可维护性.
虽然用PreparedStatement来代替Statement会使代码多出几行,但这样的代码无论从可读性还是可维护性上来说.都比直接用Statement的代码高很多档次:
stmt.executeUpdate("insert into tb_name (col1,col2,col2,col4) values ('"+var1+"','"+var2+"',"+var3+",'"+var4+"')");
perstmt = con.prepareStatement("insert into tb_name (col1,col2,col2,col4) values (?,?,?,?)");
perstmt.setString(1,var1);
perstmt.setString(2,var2);
perstmt.setString(3,var3);
perstmt.setString(4,var4);
perstmt.executeUpdate();
不用我多说,对于第一种方法.别说其他人去读你的代码,就是你自己过一段时间再去读,都会觉得伤心.
二.PreparedStatement尽最大可能提高性能.
每一种数据库都会尽最大努力对预编译语句提供最大的性能优化.因为预编译语句有可能被重复调用.所以语句在被DB的编译器编译后的执行代码被缓存下来,那么下次调用时只要是相同的预编译语句就不需要编译,只要将参数直接传入编译过的语句执行代码中(相当于一个涵数)就会得到执行.这并不是说只有一个Connection中多次执行的预编译语句被缓存,而是对于整个DB中,只要预编译的语句语法和缓存中匹配.那么在任何时候就可以不需要再次编译而可以直接执行.而statement的语句中,即使是相同一操作,而由于每次操作的数据不同所以使整个语句相匹配的机会极小,几乎不太可能匹配.比如:
insert into tb_name (col1,col2) values ('11','22');
insert into tb_name (col1,col2) values ('11','23');
即使是相同操作但因为数据内容不一样,所以整个个语句本身不能匹配,没有缓存语句的意义.事实是没有数据库会对普通语句编译后的执行代码缓存.这样每执行一次都要对传入的语句编译一次.
当然并不是所以预编译语句都一定会被缓存,数据库本身会用一种策略,比如使用频度等因素来决定什么时候不再缓存已有的预编译结果.以保存有更多的空间存储新的预编译语句.
三.最重要的一点是极大地提高了安全性.
即使到目前为止,仍有一些人连基本的恶义SQL语法都不知道.
String sql = "select * from tb_name where name= '"+varname+"' and passwd='"+varpasswd+"'";
如果我们把[' or '1' = '1]作为varpasswd传入进来.用户名随意,看看会成为什么?
select * from tb_name = '随意' and passwd = '' or '1' = '1';
因为'1'='1'肯定成立,所以可以任何通过验证.更有甚者:
把[';drop table tb_name;]作为varpasswd传入进来,则:
select * from tb_name = '随意' and passwd = '';drop table tb_name;有些数据库是不会让你成功的,但也有很多数据库就可以使这些语句得到执行.
而如果你使用预编译语句.你传入的任何内容就不会和原来的语句发生任何匹配的关系.(前提是数据库本身支持预编译,但上前可能没有什么服务端数据库不支持编译了,只有少数的桌面数据库,就是直接文件访问的那些)只要全使用预编译语句,你就用不着对传入的数据做任何过虑.而如果使用普通的statement,有可能要对drop,;等做费尽心机的判断和过虑.
上面的几个原因,还不足让你在任何时候都使用PreparedStatement吗?
相关推荐
Kaamel白皮书:Agent-to-Agent(A2A)隐私安全最佳实践
随着AI智能体架构从单体模型演化为多Agent协同系统,A2A协议为智能生态提供了强大的互操作能力。然而,能力越大,责任亦重。若无完备的隐私保护和安全防护体系,A2A将沦为数据泄露、滥权执行的温床。Kaamel作为专注于泛安全方向的Agent基础设施构建者,呼吁业界将“隐私工程”与“安全编排”作为A2A系统设计的核心前提,共建可信Agent生态,守护智能协同时代的数据主权与系统安全。未来,Kaamel计划发布一套“可信Agent协同蓝图”,涵盖:A2A协议适配Agent SDK工具集;
日志整理4-PreparedStatement的优点
在JDBC应用中,如果你已经是稍有水平开发者,你就应该始终以PreparedStatement代替Statement.也就是说,在任何时候都不要使用Statement.基于以下的原因:一.代码的可读性和可维护性.虽然用PreparedStatement来代替Statement会使代码多出几行,但这样的代码无论从可读性还是可维护性上来说.都比直接用Statement的代码高很多档次:stmt.e
混合开关电容DCDC变换器技术解析与工程应用指南
在电源设计领域,传统DCDC变换器在高降压比或高升压比场景下,往往面临占空比过窄、开关应力大、效率偏低等瓶颈。开关电容变换器虽能实现固定比例的电压变换,却受限于调节能力。混合开关电容DCDC变换器通过“开关电容网络粗调变比+电感式DCDC细调输出”的策略,兼顾高效率、高功率密度与宽调压范围。本文梳理了其典型拓扑(如2:1/4:1 SC+Buck)、关键对比、控制策略(含软充电)及工程应用中的常见问题,帮助电源工程师在服务器供电、快充、车载电源等场景下快速选型与调试。
java.sql.PreparedStatement.executeUpdate 返回受影响
当我执行一个语句: SQL code? 1 UPDATEt_friendSETfriend_list=1930WHEREaccountID=2040 的时候,我知道受影响的结果肯定是0行.因为我在linux上测试了,测试数据如下: SQL code? ...
扩散模型在工业缺陷检测中的应用与优化
扩散模型作为生成式AI的重要分支,通过逐步去噪的逆向过程实现高质量数据生成。其核心U-Net架构结合残差连接和时间步嵌入,特别适合处理工业场景中的细微缺陷检测。在计算机视觉领域,这种技术突破了传统深度学习模型对小样本数据的限制,通过域自适应预训练和小样本微调两阶段框架,显著提升金属表面、纺织品等复杂场景的检测准确率。关键技术实现涉及噪声调度优化、多任务损失设计等工程实践,最终在MVTec AD等工业数据集上达到90%以上的检测精度,为智能制造提供可靠的自动化质检方案。
汇川AM系列PLC玩转CNC:手把手教你用File模式读取G代码文件(附避坑指南)
本文详细介绍了如何使用汇川AM系列PLC的File模式读取G代码文件,涵盖从CAD设计到PLC配置的全流程。特别针对路径格式、文件类型等常见问题提供避坑指南,帮助工程师快速实现CNC加工的自动化控制。
JSP基础:包含、跳转指令,以及解决forward传参中文乱码
一.JSP包含指令 分为静态包含和动态包含 1.1静态包含 相当于把被包含的文件中的代码插入到要包含他的JSP页面中,不预先做处理,不管后缀是什么。 使用<%@include file="要包含的文件路径"%> 静态包含的处理流程: 1.2动态包含 与静态包含不同的是 动态包含会对被包含的内容先...
Allegro负片层不显示反盘的原因和解决办法
在用Allegro做PCB设计的时候,负片设计是较为常用的一种方式,有时会出现打开负片层却看不到反盘的情况,如下图。如何才能看到反盘显示的效果,具体操作如下。负片层不显示反盘的原因和解决办法。L2层仍然只能看到盘。
execute、executeQuery和executeUpdate之间的区别
JDBCTM中Statement接口提供的execute、executeQuery和executeUpdate之间的区别 Statement 接口提供了三种执行 SQL 语句的方法:executeQuery、executeUpdate 和 execute。使用哪一个方法由 SQL 语句所产生的内容决定。 方法executeQuery 用于产生单个结果...
【ESP32接入国产大模型之Deepseek】
🥳🥳🥳现在,我们在本教程中,您学习了如何使用ESP32接入语言大模型之Deepseek。🛹🛹🛹从而实现对外部世界进行感知,充分认识这个有机与无机的环境,后期会持续分享esp32跑freertos实用案列🥳🥳🥳科学地合理地进行创作和发挥效益,然后为人类社会发展贡献一点微薄之力。🤣🤣🤣如果你有任何问题,可以通过q group(945348278)加入鹏鹏小分队,期待与你思维的碰撞😘😘😘鸣谢B站UP星汇极客ESP32对接DeepSeek API,实现AI大模型交互功能。
1.2 amdgpu_bo的设计分析 — gem层和ttm层
本文分析了AMD KFD的BO设计架构,重点介绍了DRM子系统中缓冲对象的多层继承关系。文章首先展示了核心继承层次图,包括DRM通用层(drm_gem_object)、TTM内存管理层(ttm_buffer_object)、AMD驱动层(amdgpu_bo)和KFD计算层(kgd_mem)。随后详细解析了drm_gem_object结构体的关键功能,包括用户空间接口管理、内存映射支持、引用计数机制以及DMA-BUF导入/导出功能。
statement的四个执行方法---executeQuery/executeUpdate/execute/executeBatch---和早期数据库防黑技术
statement的四个执行方法 我先自己写了一个工厂类和配置文件 ConnectionFactory.java package cn.hncu.utils; import java.sql.Connection; import java.sql.DriverManager; import java.util.Properties; public class ConnectionFact
YOLO26涨点改进 | 独家创新、损失函数改进篇 | TGRS 2025顶刊 | 带来AIoU小目标涨点损失函数,增强了目标检测中对边界框形状和尺寸的敏感度,适合复杂场景和小物体检测中有效涨点
AIoU损失函数通过自适应形状感知和尺寸敏感加权机制,有效解决了YOLO26原生损失函数在小目标检测中的缺陷。实验结果表明,AIoU损失函数在多个数据集上均取得了显著的性能提升,尤其在小目标检测和多任务场景下表现突出。自适应形状感知,对形状差异较大的目标给予更大惩罚,提高边界框拟合精度尺寸敏感加权,对小目标的宽高比例差异给予更大权重,增强模型对小目标特征的学习能力梯度连续性好,即使在IoU=0时仍能提供有效的梯度更新,解决小目标梯度消失问题。
什么是Java中的PreparedStatement?它有什么优点?如何使用Java实现数据库事务管理?
SQL 注入是一种常见的网络攻击手段,攻击者通过在 SQL 语句中插入恶意代码,改变原有的 SQL 逻辑,从而获取非法数据或执行非法操作。这个接口是 Statement 的子接口,与 Statement 对象相比,PreparedStatement 对象具有更高的性能,并且可以防止 SQL 注入攻击。性能提升:PreparedStatement 是预编译的 SQL 语句,当多次执行相同的 SQL 语句时,预编译的 SQL 语句只需要编译一次,然后可以重复执行,这大大提高了执行效率。
TMS_WebGMaps_1.9.8.0_Full_Source
TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder
温度PID控制PLC程序
温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值
PreparedStatement与Statement的区别及优势
PreparedStatement是用来执行SQL查询语句的API之一,Java提供了 Statement、PreparedStatement 和 CallableStatement三种方式来执行查询语句,其中 Statement 用于通用查询, PreparedStatement 用于执行参数化查询。 为什么我们平常项目或者工作中,大多数都使用PreparedStatement,而不是Statem
OV9734 DATASHEET,完整规格书
OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等
JDBC之Statement与PreparedStatement操作数据库对比
【代码】JDBC之Statement与PreparedStatement操作数据库对比。
蓝牙模块HM-10手册
蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。
JDBC、数据库连接、使用PreparedStatement实现CRUD操作
可以通过调用 Connection 对象的方法获取 PreparedStatement 对象PreparedStatement 接口是 Statement 的子接口,它表示一条预编译过的 SQL 语句PreparedStatement 对象所代表的 SQL 语句中的参数用问号(?
JDBC中PreparedStatement接口的使用
在《java使用JDBC连接MySql数据库》中说明了JDBC链接数据库的基本方式,其中执行SQL语句使用的是Statement接口,这里介绍一个更好用的接口,PreparedStantment接口。 PreparedStatement是什么? public interface PreparedStatement exten...
Java学习——处理SQL命令的Statement和PreparedStatement
一杯茶,一包烟,一段代码歇一天…… 大家好,我是找一个bug找半天的代码小白呀。 亲爱的大家,我又来分享最近新学的知识了,不得说初学者每天做学生管理系统,不断完善,不断优化,但是还是弄不完美。 今天的内容是我在拿java学习做学生管理系统的时候,用到数据库,连接数据库的时候就花了好长的时间,在对数据库增加,查询,修改,删除这一块儿又花了好长时间,在这儿分享一下,希望初学者们能学的能轻松一点,不要浪...
【jdbc】为什么使用PreparedStatement而不是Statement
用PreparedStatement的好处: 1. 代码可读性、可维护性 比如不用PreparedStatement时,sql语句是这么写的 Connection conn = getConnection(); String sql = "insert into student values(" +s.getCardId()+",'" +s.getName()+"','" +s.ge...
JDBC(五)PreparedStatement 详解
PreparedStatement 是一个特殊的Statement对象,如果我们只是来查询或者更新数据的话,最好用PreparedStatement代替Statement,因为它有以下有点: 简化Statement中的操作 提高执行语句的性能 可读性和可维护性更好 安全性更好。 使用PreparedStat...
Statement、PreparedStatement
1.statement(Java 执行数据库操作的一个重要方法)编辑 Statement 是 Java 执行数据库操作的一个重要方法,用于在已经建立数据库连接的基础上,向数据库发送要执行的SQL语句。Statement对象,用于执行不带参数的简单SQL语句。在默认情况下,同一时间每个 Statement 对象在只能打开一个 ResultSet 对象。因此,如果读取一个 ResultSet 对象与读
JDBC - PreparedStatement和Statement的区别
使用PreparedStatement的好处: 不再使用 + 拼接sql语句,减少语法错误,语义性强 将模板sql(固定的部分)和参数部分进行了分离,提高维护性 有效的解决了sql注入问题 注入问题:比如下面的例子,使用Statement,用户输入username时,可能会输入一些特殊符号,尤其是双引号、单引号,系统将这些符号拼接到sql语句中,可能会导致sql语句出错,进而导致程序报错。 大大减少了编译次数,效率高 比如下面例子中的登录验证。 使用Statement,如果有10个人进行登录验证,程序就需
java oracle 插入_java里操作oracle执行插入操作
import java.sql.*;public class TestDML2 {/*** @param args*/public static void main(String[] args) {//值得注意的是这里的args输入参数的方法// TODO Auto-generated method stub//鼠标右键 open run Dialog,对话框里Argument里写参数要传递的数值...
JDBC封装学习笔记(三)---面向对象的JDBC,使用preparedStatement
使用PreparedStatement对象:为什么要使用PreparedStatement 原因:(1)使用Statement需要拼接SQL,太费劲,也容易出错。 String sql = "insert into userinfo" + " values (" + player.getId() + ",'" + player.getPlayerID() + "','"+ player....
Java 中访问数据库的步骤?Statement 和PreparedStatement 之间的区别?
Java 中访问数据库的步骤?Statement 和PreparedStatement 之间的区别?Java 中访问数据库的步骤1)注册驱动;2)建立连接;3)创建Statement;4)执行sql 语句;5)处理结果集(若sql 语句为查询语句);6)关闭连接。Statement 和PreparedStatement 之间的区别与Statement相比:①PreparedStateme...
1598



被折叠的 条评论
为什么被折叠?



