`
wangming2012
  • 浏览: 139155 次
  • 性别: Icon_minigender_1
  • 来自: 枣阳
社区版块
存档分类
最新评论

java之preparestatement详细介绍

    博客分类:
  • JDBC
阅读更多
传送给数据库的 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_TABLE WHERE LASTNAME = ?");

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

示例:prepareStatement 方法

注意:请阅读以了解重要的法律信息。

// New in JDBC 2.0 PreparedStatement ps2 = conn.prepareStatement("SELECT * FROM EMPLOYEE_TABLE WHERE LASTNAME = ?", ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_UPDATEABLE); // New in JDBC 3.0 PreparedStatement ps3 = conn.prepareStatement("SELECT * FROM EMPLOYEE_TABLE WHERE LASTNAME = ?", ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_UPDATEABLE, ResultSet.HOLD_CURSOR_OVER_COMMIT); PreparedStatement ps4 = conn.prepareStatement("SELECT * FROM EMPLOYEE_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 相符并且类似。提供了全面的诸如精度、标度、数据类型、数据类型名以及该参数是否允许空值之类的信息。
分享到:
评论

相关推荐

    java数据库连接PrepareStatement

    java数据库连接PrepareStatement

    JDBC(用PrepareStatement实现)

    用JDBC实现Java与数据库的连接,该文件使用PrepareStatement实现。

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

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

    06丨数据库原理:为什么PrepareStatement性能更好更安全?.pdf

    数据库原理:为什么PrepareStatement性能更好更安全

    JAVA连接FileMaker完整工程

    JAVA连接FileMaker完整工程 包函FileMaker数据库Java连接驱动 修改工程中的FileMaker安装地址就 可以用JAVA操作FileMaker ... prepareStatement = con.prepareStatement(insertSQL); b = prepareStatement.execute();

    解决oracle 驱动bug: preparestatement ArrayIndexOutOfBounds

    In Oracle Metalink (Oracle's support site - Note ID 736273.1...Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 12 at oracle.jdbc.driver.OracleSql.computeBasicInfo(OracleSql.java:950)

    java业务层框架开发ibatis(java源码)

    public PreparedStatement prepareStatement(String sql, int resultSetType, int resultSetConcurrency, int resultSetHoldability) throws SQLException { return null;} public CallableStatement prepareCall...

    JDBC PrepareStatement 使用(附各种场景 demo)

    该资源中包含 JDBC 连接 MySQL 完整代码、常规 select、update 语句完整代码,以及 JDBC 批量处理数据的几种不同方式完整代码,且附带 使用说明!

    java项目之学生信息管理系统

    ps = conn.prepareStatement(DBSql.SELECT_CLASS_STU_SNO_SNAME_EXAM); ps.setInt(1, examVo.getC_id()); rs = ps.executeQuery(); while (rs.next()) { sNum[i] = rs.getInt(1); sName[i] = ...

    【Java】无框架增删改查+登陆+分页+事务处理综合演示web应用

    这次是做一个不使用框架,用最原始的方法实现了java-jsp的web应用,栗子呢包含增删改查、登陆登出、分页、事务处理和权限管理这几个web应用的基本要素,界面就做得很烂了,除了对齐以外就没用到CSS了,也是节约时间...

    多渠道打包android

    android 多渠道打包,把渠道文件放入channel.txt 就行

    java 数据库实例

    java 中几个连接数据库的小例子 Class.forName("oracle.jdbc.driver.OracleDriver"); String url = "jdbc:oracle:thin:@192.168.8.20:1521:recruit";... PreparedStatement pstat = con.prepareStatement(sql);

    java数据库封装类

    pstmt = conn.prepareStatement(sql, autoGenereatedKeys); } } catch (SQLException e) { e.printStackTrace(); } return pstmt; } public static Statement getStatement(Connection conn) { ...

    mysql+java课程设计学生管理系统

    PreparedStatement pstmt=con.prepareStatement(sql); pstmt.setString(1, book.getBookName()); pstmt.setString(2, book.getAuthor()); pstmt.setString(3, book.getSex()); pstmt.setFloat(4, book.getPrice...

    java使用jdbc插入信息时获取id1

    // 设置成可以获取主键 preparedStatement = connection.prepareStatement(sql, Statement.RE

    最新 彻底解决asp注入漏洞

    原理,就是象java一样使用preparestatement. 详细请看例子

    Java WEB访问数据库

    preparedstatement ps = connection.preparestatement(sql); ps.setint(1,id); ps.setstring(2,name); resultset rs = ps.executequery(); 使用preparedstatement的另一个优点是字符串不是动态创建的。下面是一个...

    java与mysql日期类型的问题

    java和mysql日期的问题。通过java向mysql中插入... PreparedStatement pstmt = connection.prepareStatement(sql); Timestamp time = new Timestamp(System.currentTimeMillis()); pstmt.setTimestamp(1, time);

    java的密码确定

    preStmt = connection.prepareStatement(sql); preStmt.setString(1, "EDA技术"); preStmt.setString(2, "清华大学"); preStmt.setString(3, "1"); preStmt.setString(4, "2017-1-1"); preStmt.setDouble...

    java仓库管理

    this.preparedStatement = this.conn.prepareStatement(sql); this.preparedStatement.setInt(1, s.getSupplierId()); this.preparedStatement.setString(2, s.getSupplierName()); this.preparedStatement....

Global site tag (gtag.js) - Google Analytics