http://hi.baidu.com/ou_yang_/blog/item/4378ff50c20725581138c256.html

传送给数据库的 SQL 语句通过一个包含两个步骤的过程来返回结果。首先准备它们,然后处理它们。借助 Statement 对象,这两个阶段对应用程序而言变成一个阶段。PreparedStatement 允许将这两个步骤分开。准备步骤在创建对象时发生,而处理步骤在对 PreparedStatement 对象调用 executeQuery、executeUpdate 或 execute 方法时发生。

如果不添加参数标记,能够将 SQL 处理分割成单独的阶段并没有意义。参数标记放在应用程序中,从而使它能够告诉数据库它在准备时并不具有特定的值,但它在处理之前提供一个值。在 SQL 语句中,参数标记是使用问号表示的。

通过使用参数标记,有可能创建用于特定请求的一般 SQL 语句。例如,给定以下 SQL 查询语句:

SELECT * FROM EMPLOYEE_TABLE WHERE LASTNAME = 'DETTINGER'

这是一个特定的 SQL 语句,它只返回一个值;即关于名为 Dettinger 的雇员的信息。通过添加参数标记,可以使语句更为灵活:

SELECT * FROM EMPLOYEE_TABLE WHERE LASTNAME = ?

通过简单地将参数标记设置为某个值,可以获取关于表中的任何雇员的信息。

由于前一个 Statement 示例可以只经过一次准备阶段并接着使用不同的参数值来重复地进行处理,所以 PreparedStatement 能够提供比 Statement 更高的性能。

注意:要支持本机 JDBC 驱动程序的语句合用,必须使用 PreparedStatement。

prepareStatement 方法用来创建新的 PreparedStatement 对象。与 createStatement 方法不同,创建 PreparedStatement 对象时必须提供 SQL 语句。在那个时候,对 SQL 语句进行预编译以供使用。例如,假定已存在名为 conn 的 Connection 对象,以下示例将创建 PreparedStatement 对象并准备要在数据库中处理的 SQL 语句。

PreparedStatement ps = conn.prepareStatement("SELECT * FROM EMPLOYEE_TABLEWHERE LASTNAME = ?");

与 createStatement 方法相同,重载 prepareStatement 方法的目的是提供对指定 ResultSet 特征的支持。prepareStatement 方法还具有变体,可使用自动生成的键。以下是有效 prepareStatement 方法调用的一些示例:

示例:prepareStatement 方法

注意:请阅读代码示例不保证声明以了解重要的法律信息。

// New in JDBC 2.0PreparedStatement ps2 = conn.prepareStatement("SELECT * FROMEMPLOYEE_TABLE WHERE LASTNAME = ?",ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_UPDATEABLE);// New in JDBC 3.0PreparedStatement ps3 = conn.prepareStatement("SELECT * FROMEMPLOYEE_TABLE WHERE LASTNAME = ?",ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_UPDATEABLE,ResultSet.HOLD_CURSOR_OVER_COMMIT);PreparedStatement ps4 = conn.prepareStatement("SELECT * FROMEMPLOYEE_TABLE WHERE LASTNAME = ?", Statement.RETURN_GENERATED_KEYS);

在可以处理 PreparedStatement 对象之前,必须将每个参数标记设置为一些值。PreparedStatement 对象提供了许多个用于设置参数的方法。所有这些方法的格式均为 set<Type>,其中 <Type> 是 Java 数据类型。这些方法的一些示例包括 setInt、setLong、setString、setTimestamp、setNull 和 setBlob。几乎所有这些方法都有两个参数:

  • 第一个参数是该参数在语句中的索引。参数标记具有从 1 开始的编号。
  • 第二个参数是要对第一个参数设置的值。有几个 set<Type> 方法具有附加的参数,如 setBinaryStream 上的长度参数。

有关更多信息,请查阅 java.sql 包的 Javadoc。通过对 ps 给出在先前示例中准备的 SQL 语句,以下代码说明了如何在处理之前指定参数值:

ps.setString(1,'Dettinger');

如果尝试处理带有尚未设置的参数标记的 PreparedStatement,则将抛出 SQLException。

注意:在设置参数标记之后,除非发生下列情况,否则参数标记将保持具有同一个值。

  • 另一个 set 方法调用更改了该值。
  • 调用 clearParameters 方法时除去了该值。

clearParameters 方法将所有参数都标记为尚未设置。在进行 clearParameters 调用之后,在执行下一个过程之前,必须再次对所有参数调用 set 方法。

新的 ParameterMetaData 接口允许检索关于参数的信息。此支持与 ResultSetMetaData 相符并且类似。提供了全面的诸如精度、标度、数据类型、数据类型名以及该参数是否允许空值之类的信息。

参见示例:ParameterMetaData 以了解如何在应用程序中使用这项新支持。

PreparedStatement详解相关推荐

  1. MySQL攻略 - JDBC程序SQL注入,PreparedStatement接口详解与案例练习,JDBC相关API小结

    文章目录 SQL注入 Statement详解 基本介绍 Navicat演示SQL注入 JDBC演示SQL注入 PreparedStatement详解 基本介绍 预处理好处 预处理案例(selete语句 ...

  2. 详解PreparedStatement

    详解PreparedStatement /*** PrepareStatement 测试插入数据库*//*** 如果使用Statement,那么就必须在SQL语句中,实际地去嵌入值,比如之前的inse ...

  3. JDBC学习笔记02【ResultSet类详解、JDBC登录案例练习、PreparedStatement类详解】

    黑马程序员-JDBC文档(腾讯微云)JDBC笔记.pdf:https://share.weiyun.com/Kxy7LmRm JDBC学习笔记01[JDBC快速入门.JDBC各个类详解.JDBC之CR ...

  4. Mybatis复习笔记3:映射文件详解

    映射文件详解 参数处理(#和$的区别) #{}:可以获取map中的值或者实体对象属性的值: ${}:可以获取map中的值或者实体对象属性的值: select * from person where i ...

  5. Spring JdbcTemplate方法详解

    2019独角兽企业重金招聘Python工程师标准>>> Spring JdbcTemplate方法详解 标签: springhsqldbjava存储数据库相关sql 2012-07- ...

  6. Spring JDBC详解

    <Spring JDBC详解> 本文旨在讲述Spring JDBC模块的用法.Spring JDBC模块是Spring框架的基础模块之一. 一.概述 在Spring JDBC模块中,所有的 ...

  7. logback的使用和logback.xml详解

    一.logback的介绍 Logback是由log4j创始人设计的另一个开源日志组件,官方网站: http://logback.qos.ch.它当前分为下面下个模块: logback-core:其它两 ...

  8. [转]阿里巴巴数据库连接池 druid配置详解

    一.背景 java程序很大一部分要操作数据库,为了提高性能操作数据库的时候,又不得不使用数据库连接池.数据库连接池有很多选择,c3p.dhcp.proxool等,druid作为一名后起之秀,凭借其出色 ...

  9. Spring Boot 2.x基础教程:默认数据源Hikari的配置详解

    点击上方蓝色"程序猿DD",选择"设为星标" 回复"资源"获取独家整理的学习资料! 作者 | 翟永超 来源 | http://blog.di ...

最新文章

  1. ARM-CPU卷积网络的自动调谐
  2. 亚马逊ses如何发qq_使用Amazon SES发送电子邮件
  3. 445port入侵具体解释
  4. 《LeetCode力扣练习》第141题 环形链表 Java
  5. python入门教程2word-使用python操作word
  6. 达梦数据库DM8飞腾版本、芯版本获取地址,最新达梦数据库各国产化版本获取方法,达梦数据库DM8使用手册、产品文档获取
  7. 《剑指offer》和为s的连续正数序列
  8. 2 s锁是什么_《演员请就位》:一场戏拿了2张S卡,任敏凭什么打败老戏骨?
  9. JS-逻辑运算符-累加累减-分支循环结构-九九乘法表
  10. 云、AI、5G技术融合,会将移动互联网带到什么新高度?
  11. linux下打包deb文件,制作deb包的三种方法
  12. 关于PhpDE zend ide破解方式
  13. 【LeetCode】【字符串】题号:*13. 罗马数字转整数
  14. Atitit 标签式tab 切换的实现 Softdev=declare+intercept 申明+解释 软件=代码+文档 软件=数据结构+算法 软件=程序+数据+文档 申明式 decla
  15. 递归实现斐波那契数列(Java)
  16. LabVIEW2018工具包分享
  17. 医院管理系统数据库,课程设计,SQLserver,纯代码设计
  18. 计算机基础教学模式,浅谈中技计算机基础教学模式
  19. fedora30解决Rhythmbox MP3中文歌曲歌名乱码
  20. 18-19款迈巴赫S400改装原厂3D大柏林之声,天籁之音

热门文章

  1. bzoj3390[Usaco2004 Dec]Bad Cowtractors牛的报复*
  2. Give root password for maintenance 问题的解决方法
  3. CWnd的派生类-1、CFrameWnd类
  4. 常用的WebService
  5. 从“救火”到“井然有序”
  6. 如何在ashx里提取context.Request.Files?
  7. 问题二十九:测试ray tracing中camera几个主要参数
  8. python constructor_Python学习札记(2)——搭建Boa-constructor
  9. 【手册】jc-cookies 中文文档
  10. 小学校园计算机兴趣小组,小学计算机兴趣小组活动记录文本.doc