JDBC中Statement和Preparement的使用讲解

Statement对象是用来执行SQL语句的

PreparedStatement:预编译的Statement对象,是Statement的子接口。

一.性能和代码编写的简洁程度方面

它允许数据库预编译SQL语句(这些SQL语句通常有带有参数),以后每次只需改变SQL命令的参数,避免数据库每次都需要编译SQL语句,提高了性能。 e.g. 连接数据库部分

//已定义好driver、url、user、passwd等
//加载驱动
Class.forName(driver);
//获得连接
Connection conn = DriverManager.getConnection(url, user, passwd);

Statement:

//用Connection创建一个Statement
Statement stmt = conn.createStatement() {
  //100条SQL语句来插入100条记录
  for(int i = 0;i < 100;i++) {
    stmt.executeUpdate("insert into student values(" + "null, 'aaa" + i + "',90)");
  }
}

PreparedStatement:

//用Connection创建一个PreparedStatement
PreparedStatement pstmt = conn,getPreparedStatement("insert into student_table values(null, ?, 90)") {
  //设置参数,100次传入参数而不是100次传入SQL语句
  for(int i = 0;i < 100;i++) {
    pstmt.setString(1, "姓名" + i);
  //执行
  pstmt.executeUpdate();
  }
}

通过运行以上的代码可以发现,PreparedStatement插入100条记录所用的时间比Statement插入100条记录所花费时间少。而且可以在代码中可以看出,带有参数的SQL语句,创建Statement对象需要对参数进行拼接,但是PreparedStatement会简洁很多。

完整代码移步GitHub:Statement&PrepareStatement

运行结果:

二.安全方面

又因为PreparedStatement不需要拼接,还可以防止SQL注入从而提高安全性

注:SQL注入是一种Cracker入侵方式,从SQL语句的漏洞入侵

比如一个登录页面,我们在获取表单传来的参数,将其与数据库中的数据进行比对,比对有该账号密码时则登录成功:

Statement:

//传入参数username和passwd是提交的信息
String sql = "select * from users " + "where username = ' " + username + " ' and password= ' " + passwd + " ';
rs = stmt.executeQuery(sql);

如果在username框中输入了:'or true or',那么,拼接后的SQL语句就变成了:

select * from users where username = ' ' or true or ' ' and desc = ' ';

结果为true被SQL当成直接量那么直接会登录成功

PreparedStatement:

//传入参数username和passwd是提交的信息
PreparedStatement pstmt = conn.getPreparedStatement("select * from users where username = ? and password= ?");
pstmt.setString(1, username);
pstmt.setString(2, passwd);

从上述可以看出PreparedStatement相较于Statement有三个好处:

  • 1. 预编译,性能较好
  • 2. 不用拼接,易编写易读懂
  • 3. 防止SQL注入,提高安全性

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对我们的支持。如果你想了解更多相关内容请查看下面相关链接

(0)

相关推荐

  • You must SET PASSWORD before executing this statement的解决方法

    参考前文利用安全模式成功登陆,然后修改密码,等于给MySql设置了密码.登陆进去后,想创建一个数据库测试下.得到的结果确实: ERROR 1820 (HY000): You must SET PASSWORD before executing this statement 非常诡异啊,明明用密码登陆进去了,怎么还提示需要密码. 参考官方的一个文档,见http://dev.mysql.com/doc/refman/5.6/en/alter-user.html.如下操作后就ok了: mysql> c

  • MyBatis绑定错误提示BindingException:Invalid bound statement (not found)的解决方法

    如果出现: org.apache.ibatis.binding.BindingException: Invalid bound statement (not found) 一般的原因是Mapper interface和xml文件的定义对应不上,需要检查包名,namespace,函数名称等能否对应上. 按以下步骤一一执行: 1.检查xml文件所在的package名称是否和interface对应的package名称一一对应 2.检查xml文件的namespace是否和xml文件的package名称一

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

    预编译的优点1.PreparedStatement是预编译的,对于批量处理可以大大提高效率. 也叫JDBC存储过程. 2.使用 Statement 对象.在对数据库只执行一次性存取的时侯,用 Statement 对象进行处理.PreparedStatement 对象的开销比Statement大,对于一次性操作并不会带来额外的好处. 3.statement每次执行sql语句,相关数据库都要执行sql语句的编译,preparedstatement是预编译得,   preparedstatement支

  • PDO预处理语句PDOStatement对象使用总结

    PDO对预处理语句的支持需要使用PDOStatement类对象,但该类对象并不是通过NEW关键字实例化出来的,而是通过PDO对象中的prepare()方法,在数据库服务器中准备好一个预处理的SQL语句后直接返回的.如果通过之前执行PDO对象中的query()方法返回的PDOStatement类对象,只代表的是一个结果集对象.而如果通过执行PDO对象中的prepare()方法产生的PDOStatement类对象,则为一个查询对象,能定义和执行参数化的SQL命令.PDOStatement类中的全部成

  • Java数据库连接PreparedStatement的使用详解

    本文介绍了Java数据库连接PreparedStatement的使用详解,分享给大家,具体如下: 首先了解Statement和PreparedStatement的区别: 由此可见,一般使用PreparedStatement. 操作数据库SU(Course表),其中Course属性有Cno,Cname,Cpno,Ccredit. public class Demo_2 { public static void main(String[] args) { PreparedStatement ps=n

  • PHP PDOStatement对象bindpram()、bindvalue()和bindcolumn之间的区别

    PDOStatement::bindParam - 绑定一个参数到指定的变量名. 绑定一个PHP变量到用作预处理的SQL语句中的对应命名占位符或问号占位符. 不同于 PDOStatement::bindValue() ,此变量作为引用被绑定,并只在 PDOStatement::execute() 被调用的时候才取其值. PDOStatement::bindValue - 把一个值绑定到一个参数. 绑定一个值到用作预处理的 SQL 语句中的对应命名占位符或问号占位符. 复制代码 代码如下: <?p

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

    前言 本文主要给大家介绍了关于利用JDBC的PrepareStatement打印真实SQL的相关内容,分享出来供大家参考学习,下面来一起看看详细的介绍: 我们知道,JDBC 的 PrepareStatement 优点多多,通常都是推荐使用 PrepareStatement 而不是其基类 Statment.PrepareStatement 支持 ? 占位符,可以将参数按照类型转自动换为真实的值.既然这一过程是自动的,封装在 JDBC 内部的,那么我们外部就不得而知目标的 SQL 最终生成怎么样--

  • Java使用PreparedStatement接口及ResultSet结果集的方法示例

    本文实例讲述了Java使用PreparedStatement接口及ResultSet结果集的方法.分享给大家供大家参考,具体如下: 说明: 1.PreparedStatement接口继承Statement,它的实例包含已编译的SQL语句,执行速度要快于Statement. 2.PreparedStatement继承了Statement的所有功能,三种方法executeUpdate.executeQuery.execute不再需要参数. 3.在JDBC应用中,一般都用PreparedStateme

  • Java使用Statement接口执行SQL语句操作实例分析

    本文实例讲述了Java使用Statement接口执行SQL语句操作的方法.分享给大家供大家参考,具体如下: Statement执行SQL语句: 1. 对数据库的曾删改操作时,使用stmt.executeUpdate(sql)  执行给定 SQL 语句,分别为 insert .update.delete. 2. 对数据库做查询时,直接使用 stmt.executeQuery(sql),返回结果可以为一个resultSet结果集. 首先做一些准备工作: ①对要进行操作的数据库表进行封装,比如说我的数

  • JDBC使用Statement修改数据库

    获取数据连接后,即可对数据库中的数据进行修改和查看.使用Statement 接口可以对数据库中的数据进行修改,下面是程序演示. /** * 获取数据库连接,并使用SQL语句,向数据库中插入记录 */ package com.pack03; import java.io.InputStream; import java.sql.Connection; import java.sql.DriverManager; import java.sql.SQLException; import java.s

随机推荐