`

JDBC中的预编译语句

    博客分类:
  • 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){}
}
}
分享到:
评论

相关推荐

    02-JDBC-DAO与预编译语句.xmind

    JDBC进阶1

    JDBC之PreparedStatement类中预编译的综合应用解析

    SQL 语句被预编译并存储在 PreparedStatement 对象中。然后可以使用此对象多次高效地执行该语句

    Spring Data JDBC与JDBC的区别

    JDBC规范  ... PrepareStatement:预编译语句,性能更好  CallableStatement:调用存储过程  ResultSet:结果集,封装了多条记录  JDBC数据库连接池/Connection Pool  DBCP:apache tomcat内置  

    MySQL预编译功能详解

     大家平时都使用过JDBC中的PreparedStatement接口,它有预编译功能。什么是预编译功能呢?它有什么好处呢?  当客户发送一条SQL语句给服务器后,服务器总是需要校验SQL语句的语法格式是否正确,然后把SQL语句编译...

    JDBC笔记 JDBC笔记

    java.sql.PreparedStatement 继承Statement接口,表示预编译的SQL语句的对象,SQL语句被预编译并且存储在PreparedStatement对象中。然后可以使用此对象高效地多次执行该语句。 java.sql.CallableStatement 用来...

    JDBC 3.0数据库开发与设计

    4.1 预编译语句 4.1.1 PreparedStatement对象的创建 4.1.2 传递IN参数 4.1.3 传递对象参数 4.1.4 传递大型数据参数 4.2 调用存储过程对象 4.2.1 CallableStatement对象的创建 4.2.2 IN、OUT及INOUT参数的使用...

    JDBC性能优化.pdf

    开发一个注重性能的JDBC应用程序不是一件...的原则已经被许多现有的 JDBC应用程序编译运行并验证过。 这些指导原则包括: 正确的使用数据库 MetaData方法 只获取需要的数据 选用最佳性能的功能 管理连接和更新

    利用JDBC的PrepareStatement打印真实SQL的方法详解

    PreparedStatement是预编译的,对于批量处理可以大大提高效率. 也叫JDBC存储过程,下面这篇文章主要给大家介绍了关于利用JDBC的PrepareStatement打印真实SQL的方法,需要的朋友可以参考借鉴,下面来一起看看吧。

    mssql-jdbc-8.4.0.jre8.jar

    jdk1.8可使用的jdbc驱动... DriverManager:负责加载各种不同驱动程序(Driver),并根据不同的请求,向调用者返回相应的数据库连接(Connection)。Driver:驱动程序,会将自身加载到DriverManager中去,并处理...

    每天十道面试题(五)——JDBC数据库编程部分

    1)性能方面,PreparedStatement有预编译过程,一旦绑定SQL语句就可以执行多次,Statement执行多少次就要编译多少次SQL语句。PreparedStatement用来执行动态的SQL语句,即包含参数的SQL语句,而Statement用

    JDBC的常用方法

    在上一篇文章我们讲了一些基本使用JDBC-DBCP-MYBATIS。 1.防止SQL注入 我们在写sql语句时,为了方便可能会进行拼接字符串,这样做的...//使用预编译对象进行预编译,就不使用原始的Statement对象 PreparedStatement pr

    sqlserver各版本jdbc驱动.zip

    sqlserver各版本驱动 DriverManager:负责加载各种不同驱动程序(Driver),并根据不同的请求,向调用者返回...PreparedStatement:用以执行包含动态参数的SQL查询和更新(在服务器端编译,允许重复执行以提高效率)

    JDBC版本的增删改查

    这次写的还是对单表的增 删 改 查 ,与version1.0版本不同的是PreparedStatement 接口,它是预编译的Sql语句对象,与 Statement 不同的是 PreparedStatement ...

    Java数据库技术详解 DOC简版

    6.1 PreparedStatement预编译对象 6.2 CallableStatement存储过程对象 6.3 BatchedUpdate对象 6.4 Rowset行集合对象 6.5 JDBC的事务 6.6 本章小结 第7章 JDBC结合Servlet与JSP 的应用 7.1 Servlet概述...

    jdbc基础和参考

    提供预编译的功能,某种程度上可以避免sql注入的问题 4.提前做语法检查,在给?赋值的过程中要求数据类型一定要匹配,这样在某种程度上可以避免因为数据类型不匹配而发生的异常 CallableStatement:主要用来执行...

    在线考试系统_struts2_JDBC

    在机子上装有myeclipse tomcat jdk 就可以编译运行了 在此之前还要把sql语句在mysql里执行一遍 至于数据库设置我的是 root 密码 admin 连接数据库的代码里有这个 可以自己看 否则连不上数据库 就会报错

    《Java程序设计案例教程》教学课件09Java数据库编程.pptx

    因此,本模块我们开始学习编写Java应用程序访问数据库的方法技术,内容包含对数据库中数据记录的查询、添加、修改与删除等操作,以及使用预编译SQL语句防止从应用程序外部进行SQL注入。 《Java程序设计案例教程》...

    java面向对象核心知识点,独门大法

    每一个知识点的讲解,都会包含语法,语法个数如何定义,然后语法下面就是使用方式,能够起到活学活用的帮助,比如在讲解jdbc的时候我会列举出来 Statement(执行简单的sql语句,不支持预编译) PreparedStatement...

    《Java程序设计案例教程》教学课件07异常处理.pptx

    模块7 异常处理 《Java程序设计案例教程》教学课件07异常处理全文共31页,当前为第1页。...catch语句块中包含了处理异常及输出异常产生原因的语句。一个catch语句块仅对应一个try语句块,但是一个try语句块可以对应多

Global site tag (gtag.js) - Google Analytics