zoukankan      html  css  js  c++  java
  • Statement与PreparedStatement

    Statement

    用于通用查询,能批处理

    PreparedStatement(简称PS

    用于执行参数化查询,能批处理

    什么是参数化查询?

    指在设计与数据库链接并访问数据时,在需要填入数值或数据的地方,使用参数 (Parameter) 来给值,这个方法目前已被视为最有效可预防SQL注入攻击的防御方式。

    而且参数化有利于代码的可读性和可维护性

    eg:

    使用statement

    stmt.executeUpdate(“insert into tb_name (col1,col2,col2,col4) values (‘”+var1+”’,’”+var2+”’,”+var3+”,’”+var4+”’)”);//stmt是Statement对象实例

    使用PreparedStatement

    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(); //prestmt是 PreparedStatement 对象实例 

    ------------------------------------------------------------------------

    什么时候用PreparedStatement?

    多次请求推荐用PreparedStatement,数据库系统会sql语句进行预编译处理(如果JDBC驱动支持的话),预处理语句将被预先编译好,这条预编译的sql查询语句能在将来的查询中重用,这样一来,在多次请求的情况下它比Statement对象生成的查询速度更快

    相对的,一次请求可用Statement

    PreparedStatement的第一次执行消耗是很高的,假设我使用PreparedStatement的方式来执行一个针对Employee表的查询, JDBC驱动会先发送一个网络请求去解析数据、优化查询, 而当执行时会则会产生另一个网络请求。

    如果使用Statement.,一个查询只会产生一次网络到数据库的通讯。

    备注:两者查询的结果(扫描的结果集)应该都是一样的

    ----------------------------------------------------

    PreparedStatement原理

    SQL执行流程如下(以Oracle为例):

    备注: DBMS (datebase manage system),数据库管理系统,为数据库的核心

    如你所见,第一步、第二步预编译sql语句,并存储于Shared pool(共享池)中,当第二次使用PreparedStatement时,可免去前两个步骤。

    很多DBMS对此并不支持的,例如mysql就,这样虽然看似使用PreparedStatement,实际上驱动实现并没有真正实现这个功能,而是生成statement

    mysql居然不支持......

    ----------------------------------------------------

    接下来说一下PreparedStatementCache

    PreparedStatement是数据库层面的缓存优化,当我们发出多个相同的请求时,依旧需要多次与数据库建立连接,能否对服务器层次进行缓存优化

    PreparedStatementCache用于保存与数据库交互的prepareStatement对象。在cache里的ps对象,不需要重新走一次DBMS连接请求去创建

  • 相关阅读:
    文件上传及文件大小限制_学习笔记
    Java后台及Jsp前端的简单分页_学习笔记
    Java过滤器Filter的原理及配置_学习笔记
    Jsp入门EL表达式_学习笔记
    关于forName()、newInstance()、getMethod()、getClass()等区别的简略说明
    SQL语句查询某字段不同数据的个数(DISTINCT 的使用)
    C# 中delegate和event的区别
    java面试题(转)
    Servlet中的几个重要的对象(转)
    Spring 注解注入的几种方式(转)
  • 原文地址:https://www.cnblogs.com/yanze/p/10102755.html
Copyright © 2011-2022 走看看