JDBC中的预编译语句

jdbc中预编译语句PreparedStatement的深层分析 翻阅大大小小的博客,无论中外只要你搜索PreparedStatement这个关键字,得到的大多数结果是在重复执行一条语句多次的情况下PreparedStatement会获得比Statement更好的性能,辟如下文引用的这段文字。 选择PreparedStatement还是Statement取决于你要怎么使用它们. 对于只执行一次的SQL语句选择Statement是最好的. 相反, 如果SQL语句 阅读详情

JDBC中的预编译语句


2008-12-18 23:42:08
 标签: JDBC 预编译 语句   [ 推送到技术圈]

什么是预编译语句
预编译语句PreparedStatement 是java.sql中的一个接口,它是Statement的子接口。通过Statement对象执行SQL语句时,需要将SQL语句发送给DBMS,由DBMS首先进行编译后再执行。预编译语句和Statement不同,在创建PreparedStatement 对象时就指定了SQL语句,该语句立即发送给DBMS进行编译。当该编译语句被执行时,DBMS直接运行编译后的SQL语句,而不需要像其他SQL语句那样首先将其编译。
什么时候使用预编译语句
一般是在需要反复使用一个SQL语句时才使用预编译语句,预编译语句常常放在一个for或者while循环里面使用,通过反复设置参数从而多次使用该SQL语句;为了防止SQL注入漏洞,在某些数据操作中也使用预编译语句。
为什么使用预编译语句
1、提高效率
当需要对数据库进行数据插入、更新或者删除的时候,程序会发送整个SQL语句给数据库处理和执行。数据库处理一个SQL语句,需要完成解析SQL语句、检查语法和语义以及生成代码;一般说来,处理时间要比执行语句所需要的时间长。预编译语句在创建的时候已经是将指定的SQL语句发送给了DBMS,完成了解析、检查、编译等工作。因此,当一个SQL语句需要执行多次时,使用预编译语句可以减少处理时间,提高执行效率。
2、提高安全性
恶意的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,;等做费尽心机的判断和过虑.
预编译语句的使用
1、创建 PreparedStatement 对象
       以下的代码段(其中 con 是 Connection 对象)创建包含带两个 IN 参数占位符的 SQL 语句的 PreparedStatement 对象:
  PreparedStatement pstmt = con.prepareStatement("UPDATE table4 SET m = ? WHERE x = ?");
  pstmt 对象包含语句 "UPDATE table4 SET m = ? WHERE x = ?",它已发送给DBMS,并为执行作好了准备。
2、传递 IN 参数
    在执行 PreparedStatement 对象之前,必须设置每个 ? 参数的值。这可通过调用 setXXX 方法来完成,其中 XXX 是与该参数相应的类型。例如,如果参数具有Java 类型 long,则使用的方法就是 setLong。setXXX 方法的第一个参数是要设置的参数的序数位置,第二个参数是设置给该参数的值。例如,以下代码将第一个参数设为 123456789,第二个参数设为 100000000:
  pstmt.setLong(1, 123456789);
  pstmt.setLong(2, 100000000);
一旦设置了给定语句的参数值,其值将一直保留,直到被设置为新值或者调用clearParameters()方法清除它为止。
示例:
import java.sql.*;
public class PreparedTest{
Connection con=null;
PreparedStatement update=null;
public void test(){
String sql="UPDATE STUDENT SET AGE=? WHERE ID=?";
try{
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
con=DriverManager.getConnection("jdbc:odbc:stu","name","password");
}catch(ClassNotFoundException e){}
catch(SQLException ex){}
try{
update=con.prepareStatement(sql);
for(int i=0;i<6;i++){
update.setInt(1,i+18);
update.setInt(2,i);
update.executeUpdate();
}
update.close();
con.close();
}catch(SQLException ex){}
}
}
JDBC学习(五、预编译语句对象) 一、PreparedStatement接口的常用方法是Statement的子接口,表示预编译的 SQL 语句的对象.设置占位符参数(告诉SQL中的?到底表示哪一个值): void  setXxx(int parameterIndex, Xxx value): xxx表示数据类型,比如:String,int,Long等.        parameterIndex:设置第几个占位符?(从1开始). ... 阅读详情

相关推荐

掌握JDBC预编译语句与批处理技术

本文通过一个动物园新大象注册的案例,深入探讨了如何利用JDBC的PreparedStatement实现参数化查询,并讨论了批处理更新和从ResultSet中获取数据的最佳实践。文章详细解释了绑定变量的使用,演示了如何通过PreparedStatement方法设置参数,并强调了正确管理参数顺序和数量的重要性。此外,还探讨了如何通过批处理减少数据库交互,以及如何遍历ResultSet来获取数据。

weixin_34438187的博客 347

使用JDBC的预编译方法prepareStatement时报错:sql语法错误

初学preparestatement预编译出现的报错

weixin_65920414的博客 3536

从立创商城到Cadence:手把手教你实现封装格式的精准迁移

本文详细介绍了如何从立创商城获取元器件封装并精准迁移至Cadence Allegro的全流程。通过实战案例MAX31865ATP+T芯片,逐步解析Altium Designer格式转换、Cadence环境配置、封装导入验证等关键步骤,提供常见问题解决方案和效率提升技巧,帮助硬件工程师实现封装格式的高效迁移。

weixin_42519985的博客 216

JDBC笔记3(基础—预编译语句(PreparedStatement))

使用预编译PreparedStatement语句来执行SQL语句。

wangshiqi666的博客 1893

诠视MR眼镜Unity开发设置_Unity2020.3.38

请按照如下设置Android SDK 和 Gradle。打包前先将Unity切换到Android模式。Preferences 设置。

m0_71932574的博客 602

AI智能体安全沙箱agentguard:为LLM代码执行筑起防火墙

在AI应用开发领域,大语言模型(LLM)驱动的智能体(Agent)能够自动生成并执行代码,极大地提升了自动化能力。然而,赋予AI直接执行系统命令的权限也带来了显著的安全风险,如恶意代码注入、敏感数据泄露和系统资源滥用。为了解决这一核心矛盾,安全沙箱技术应运而生,它通过在不可信代码与宿主系统之间建立隔离层,实现"默认拒绝、最小权限"的安全原则。agentguard项目正是这一理念的工程实践,它结合白名单机制与容器化隔离,为AI智能体提供了可配置、可审计的安全执行环境。该方案不仅适用于内部自动化工具开发,也为构

weixin_28695537的博客 296

java预编译语句_JDBC04----预编译语句介绍

sql的拼接很麻烦,且容易出错,因此就可以使用预编译语句。接口java.sql.Statement有两个子接口:CallableStatement,PreparedStatement有两种类型的sql语句:1.静态sql在执行之前就知道了sql语句的形式。2.动态sql一. Statement接口的实现类1. PreparedStatementPreparedStatement用于预编译模板SQL...

weixin_42339801的博客 929

半导体AMHS天车振动控制:从0.5G到超低振动的技术演进与工程实战

在先进晶圆厂中,自动化物料搬运系统(AMHS)的天车如同空中出租车,承担着晶圆盒(FOUP)在洁净室各工艺区间的转运任务。然而,当天车加减速、过弯或抓取时产生的机械振动通过轨道梁和建筑结构传递至光刻机等敏感设备,便可能直接威胁套刻精度与良率。传统被动减振方案依靠橡胶垫和弹簧,在0.5G指标时代曾行之有效,但在EUV光刻和先进制程面前已力不从心。主动振动控制技术通过传感器、控制器与作动器构成的闭环系统,在轨道吊点和机械手端实时输出反向力抵消振动,配合磁悬浮走行、轻量化结构及调度系统的路径优化,将振动从0.5G

weixin_29188043的博客 342

JDBC预编译语句

什么是预编译语句 预编译语句PreparedStatement 是java.sql中的一个接口,它是Statement的子接口。通过Statement对象执行SQL语句时,需要将SQL语句发送给DBMS,由DBMS首先进行编译后再执行。预编译语句和Statement不同,在创建PreparedStatement 对象时就指定了SQL语句,该语句立即发送给DBMS进行编译。当该编译语句被执行时

苍月 1万+

T265摄像头插着开机后,需要重新插拔才能正常启动

T265摄像头插着开机后,需要重新插拔才能正常启动

qq_35598561的博客 1078

(11-3-01 )

以太坊(Ethereum)是一种基于区块链技术的开源平台和加密货币。它于2015年由Vitalik Buterin和Gavin Wood等开发者创建,并成为比特币之后最受欢迎的加密货币之一。以太坊不仅支持加密货币交易,还为开发者和企业提供了构建去中心化应用程序的强大工具。在本节的内容中,将实型一个完整的机器学习模型项目,智能检测出以太坊区块链中的非法账户。从问题定义到模型建立和评估,再到最终的总结和建议。本实例突出了处理类别不平衡问题的重要性,并展示了如何使用多种机器学习算法来解决实际问题。此外,通过数据可

码农三叔 2170

JDBC 操作预编译语句中LIKE模糊匹配怎么用

问题描述 在使用JDBC 预编译执行语句时,遇到一个问题,那就是在含有LIKE的查询语句时,我到底怎么使用匹配符%、_呢。 如: SELECT * FROM "+LQ_USERS+" WHERE "+USER_LOGIN+" LIKE ? 问题分析 我们先看看我们要实现的结果: SELECT * FROM lq_users WHERE user_login LIKE "%2%"; 既然这样,我...

Jason的学习笔记 1828

Unity零基础到进阶 | Unity 探针系统深度解析:光照探针、反射探针与相关技术

在 Unity 渲染管线中,探针(Probe) 是一类通过预计算或实时采样来捕捉空间光照信息的核心组件。它们弥补了传统静态光照贴图和实时光源各自的局限性,是实现高质量、高性能全局光照效果的关键工具。 本文将系统介绍光照探针(Light Probe)和反射探针(Reflection Probe)的作用与用法,分析二者之间的协同关系,并延伸介绍自适应探针体积(APV)、光照探针代理体(LPPV)、探针体积等进阶技术。

努力前行,总会成为自己心中的那道光 1万+

‌JDBC的预编译语句:防止SQL注入与提升性能

是一种强大的工具,它通过参数化查询机制,既能有效防止SQL注入攻击,又能显著提升数据库操作性能。以下我将逐步解释其原理、优势,并提供一个代码示例。)是一种强大的工具,它通过参数化查询机制,既能有效防止SQL注入攻击,又能显著提升数据库操作性能。以下我将逐步解释其原理、优势,并提供一个代码示例。SQL注入是一种常见攻击,攻击者通过输入恶意字符串(如。SQL注入是一种常见攻击,攻击者通过输入恶意字符串(如。查询用户数据,并体现防注入和性能优势。查询用户数据,并体现防注入和性能优势。

2501_93879649的博客 946

量子化学仿真软件:VASP_(9).磁性材料计算

在量子化学仿真软件 VASP 中,磁性材料的计算是一个复杂但重要的过程。通过正确设置磁性状态、分析磁性性质、优化计算参数以及研究磁性相变和磁动力学,可以更准确地描述和预测磁性材料的性能。希望本节的内容能够为研究磁性材料的科研人员提供有用的参考和指导。

kkchenjj的博客 1375

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

03. JDBC 预编译SQL语句 & 储存过程调用

在JDBC中,Statement接口用于进行Java程序和数据库之间的数据传输,具体类有3个实现,如下:Statement用于对数据库进行通用访问,在运行时使用静态SQL语句时使用。 PreparedStatement当计划要多次使用SQL语句时使用。PreparedStatement接口在运行时接受输入参数。CallableStatement当想要访问数据库存储过程时使用。CallableSta...

Al_assad的博客 1399

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

JDBC中的预编译语句(转载)

  JDBC中的预编译语句 转自:http://desizen.blog.51cto.com/623223/121005 什么是预编译语句 预编译语句PreparedStatement 是java.sql中的一个接口,它是Statement的子接口。通过Statement对象执行SQL语句时,需要将SQL语句发送给DBMS,由DBMS首先进行编译后再执行。预编译语句...

inotgaoshou的专栏 261

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

[疯狂Java]JDBC:PreparedStatement预编译执行SQL语句

1. SQL语句的执行过程——Statement直接执行的弊病:     1) SQL语句和编程语言一样,仅仅就会普通的文本字符串,首先数据库引擎无法识别这种文本字符串,而底层的CPU更不理解这些文本字符串(只懂二进制机器指令),因此SQL语句在执行之前肯定需要编译的;     2) SQL语句的执行过程:提交SQL语句 -> 数据库引擎对SQL语句进行编译得到数据库可执行的代码 -> 执行S

Lirx_Tech的专栏 1万+

JDBC:PreparedStatement预编译执行SQL语句

1. SQL语句的执行过程——Statement直接执行的弊病:     1) SQL语句和编程语言一样,仅仅就会普通的文本字符串,首先数据库引擎无法识别这种文本字符串,而底层的CPU更不理解这些文本字符串(只懂二进制机器指令),因此SQL语句在执行之前肯定需要编译的;     2) SQL语句的执行过程:提交SQL语句 -> 数据库引擎对SQL语句进行编译得到数据库可执行的代码 -> 执行S

qq_33364884的博客 3361

JDBC登录案例开发-预编译语句防止注入攻击

JDBC登录案例开发-预编译语句防止注入攻击 1.sql语句的注入攻击 当我们在使用jdbc连接数据库完成登录验证工作时,从键盘录入账号和密码 ,当密码输入<kbd>123 or '4'='4'</kbd>时,无论账号为何值都能成功登录。 我们直接看sql的验证代码: ```java String sql="select * from admin where account...

weixin_43814894的博客 197

mysql预编译表名_JDBC预编译语句表名占位异常

有时候,我们有这样的需求,需要清空多个表的内容,这样我们有两种做法,可用delete from table 或 truncate table table,两种方法视情况而定,前者只是一条条的删除表数据,主键自增的序列还能保存,后者类似是重新建表保留表结构,主键信息,也被清空。OK,下面我们用JDBC开始删除,因为是多个表,所以要循环删除,根据以往的经验,使用预编译的sql语句,可能执行效率会更高,...

weixin_39815031的博客 330

JDBC预编译语句表名占位异常

有时候,我们有这样的需求,需要清空多个表的内容,这样我们有两种做法,可用delete from table 或 truncate table table,两种方法视情况而定,前者只是一条条的删除表数据,主键自增的序列还能保存,后者类似是重新建表保留表结构,主键信息,也被清空。 OK,下面我们用JDBC开始删除,因为是多个表,所以要循环删除,根据以往的经验,使用预编译的sql语句,可能执行效率

K's Blog 1518

java预编译啥意思_java预编译 java jdbc 预编译语句和普通语句的区别

java中什么是预编译precompile?总有一天你恍然大悟,父母是你花心思,花时间最少,却最爱你的人。什么是预编译?起什么作用的? 。在java中如何实现预编译?祝你幸福!这句话真俗。小编会祝你幸福,但小编不会祝福你们。就是启动tomcat服务器后,进入页面时,不用编译了,也不用在连接数据 库/* * ProCompile.java *预处理要编译的文件,删除多余的空白,注释,换行,回车等 *...

weixin_39601794的博客 1957

JDBC:预编译语句和批量更新-

JDBC:预编译语句和批量更新- - 进一步提高JDBC应用程序的性能 (四) http://www.daima.com.cn/Info/55/Info15348/ bootcool@263.net 四:使用预编译语句和批量更新 首先我们得大致的了解数据库是怎么处理各种数据库操作语句的...

雁过寒潭 614
上一篇: sybase 的 mda表使用---用来查监控信息,比sp好用---新加配置过程--监控deadlock
下一篇: 如何打脱离eclipse环境运行的jar包
thunder09
博客等级 码龄17年 187粉丝 50原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值