JDBC之PreparedStatement

JDBC之PreparedStatement

一、java.sql.PreparedStatement接口简介

  该接口表示预编译的 SQL 语句的对象。

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

  

  可以通过调用 Connection 对象的 preparedStatement() 方法获取 PreparedStatement 对象

  PreparedStatement 接口是 Statement 的子接口,它表示一条预编译过的 SQL 语句

  PreparedStatement 对象所代表的 SQL 语句中的参数用问号(?)来表示,调用 PreparedStatement 对象的 setXXX() 方法来设置这些参数. setXXX() 方法有两个参数,第一个参数是要设置的 SQL 语句中的参数的索引(从 1 开始),第二个是设置的 SQL 语句中的参数的值

二、PreapredStatement接口方法介绍

 void addBatch()
          将一组参数添加到此 PreparedStatement 对象的批处理命令中。
 void clearParameters()
          立即清除当前参数值。
 boolean execute()
          在此 PreparedStatement 对象中执行 SQL 语句,该语句可以是任何种类的 SQL 语句。
 ResultSet executeQuery()
          在此 PreparedStatement 对象中执行 SQL 查询,并返回该查询生成的 ResultSet 对象。
 int executeUpdate()
          在此 PreparedStatement 对象中执行 SQL 语句,该语句必须是一个 SQL 数据操作语言(Data Manipulation Language,DML)语句,比如 INSERTUPDATEDELETE 语句;或者是无返回内容的 SQL 语句,比如 DDL 语句。
 ResultSetMetaData getMetaData()
          获取包含有关 ResultSet 对象列信息的 ResultSetMetaData 对象,ResultSet 对象将在执行此 PreparedStatement 对象时返回。
 ParameterMetaData getParameterMetaData()
          获取此 PreparedStatement 对象的参数的编号、类型和属性。
 void setArray(int parameterIndex, Array x)
          将指定参数设置为给定 java.sql.Array 对象。
 void setAsciiStream(int parameterIndex, InputStream x)
          将指定参数设置为给定输入流。
 void setAsciiStream(int parameterIndex, InputStream x, int length)
          将指定参数设置为给定输入流,该输入流将具有给定字节数。
 void setAsciiStream(int parameterIndex, InputStream x, long length)
          将指定参数设置为给定输入流,该输入流将具有指定字节数。
 void setBigDecimal(int parameterIndex, BigDecimal x)
          将指定参数设置为给定 java.math.BigDecimal 值。
 void setBinaryStream(int parameterIndex, InputStream x)
          将指定参数设置为给定输入流。
 void setBinaryStream(int parameterIndex, InputStream x, int length)
          将指定参数设置为给定输入流,该输入流将具有给定字节数。
 void setBinaryStream(int parameterIndex, InputStream x, long length)
          将指定参数设置为给定输入流,该输入流将具有指定字节数。
 void setBlob(int parameterIndex, Blob x)
          将指定参数设置为给定 java.sql.Blob 对象。
 void setBlob(int parameterIndex, InputStream inputStream)
          将指定参数设置为 InputStream 对象。
 void setBlob(int parameterIndex, InputStream inputStream, long length)
          将指定参数设置为 InputStream 对象。
 void setBoolean(int parameterIndex, boolean x)
          将指定参数设置为给定 Java boolean 值。
 void setByte(int parameterIndex, byte x)
          将指定参数设置为给定 Java byte 值。
 void setBytes(int parameterIndex, byte[] x)
          将指定参数设置为给定 Java byte 数组。
 void setCharacterStream(int parameterIndex, Reader reader)
          将指定参数设置为给定 Reader 对象。
 void setCharacterStream(int parameterIndex, Reader reader, int length)
          将给定参数设置为给定 Reader 对象,该对象具有给定字符数长度。
 void setCharacterStream(int parameterIndex, Reader reader, long length)
          将指定参数设置为给定 Reader 对象,该对象具有给定字符数长度。
 void setClob(int parameterIndex, Clob x)
          将指定参数设置为给定 java.sql.Clob 对象。
 void setClob(int parameterIndex, Reader reader)
          将指定参数设置为 Reader 对象。
 void setClob(int parameterIndex, Reader reader, long length)
          将指定参数设置为 Reader 对象。
 void setDate(int parameterIndex, Date x)
          使用运行应用程序的虚拟机的默认时区将指定参数设置为给定 java.sql.Date 值。
 void setDate(int parameterIndex, Date x, Calendar cal)
          使用给定的 Calendar 对象将指定参数设置为给定 java.sql.Date 值。
 void setDouble(int parameterIndex, double x)
          将指定参数设置为给定 Java double 值。
 void setFloat(int parameterIndex, float x)
          将指定参数设置为给定 Java REAL 值。
 void setInt(int parameterIndex, int x)
          将指定参数设置为给定 Java int 值。
 void setLong(int parameterIndex, long x)
          将指定参数设置为给定 Java long 值。
 void setNCharacterStream(int parameterIndex, Reader value)
          将指定参数设置为 Reader 对象。
 void setNCharacterStream(int parameterIndex, Reader value, long length)
          将指定参数设置为 Reader 对象。
 void setNClob(int parameterIndex, NClob value)
          将指定参数设置为 java.sql.NClob 对象。
 void setNClob(int parameterIndex, Reader reader)
          将指定参数设置为 Reader 对象。
 void setNClob(int parameterIndex, Reader reader, long length)
          将指定参数设置为 Reader 对象。
 void setNString(int parameterIndex, String value)
          将指定参数设置为给定 String 对象。
 void setNull(int parameterIndex, int sqlType)
          将指定参数设置为 SQL NULL
 void setNull(int parameterIndex, int sqlType, String typeName)
          将指定参数设置为 SQL NULL
 void setObject(int parameterIndex, Object x)
          使用给定对象设置指定参数的值。
 void setObject(int parameterIndex, Object x, int targetSqlType)
          使用给定对象设置指定参数的值。
 void setObject(int parameterIndex, Object x, int targetSqlType, int scaleOrLength)
          使用给定对象设置指定参数的值。
 void setRef(int parameterIndex, Ref x)
          将指定参数设置为给定 REF(<structured-type>) 值。
 void setRowId(int parameterIndex, RowId x)
          将指定参数设置为给定 java.sql.RowId 对象。
 void setShort(int parameterIndex, short x)
          将指定参数设置为给定 Java short 值。
 void setSQLXML(int parameterIndex, SQLXML xmlObject)
          将指定参数设置为给定 java.sql.SQLXML 对象。
 void setString(int parameterIndex, String x)
          将指定参数设置为给定 Java String 值。
 void setTime(int parameterIndex, Time x)
          将指定参数设置为给定 java.sql.Time 值。
 void setTime(int parameterIndex, Time x, Calendar cal)
          使用给定的 Calendar 对象将指定参数设置为给定 java.sql.Time 值。
 void setTimestamp(int parameterIndex, Timestamp x)
          将指定参数设置为给定 java.sql.Timestamp 值。
 void setTimestamp(int parameterIndex, Timestamp x, Calendar cal)
          使用给定的 Calendar 对象将指定参数设置为给定 java.sql.Timestamp 值。
 void setUnicodeStream(int parameterIndex, InputStream x, int length)
          已过时。  
 void setURL(int parameterIndex, URL x)
          将指定参数设置为给定 java.net.URL 值。

三、PreparedStatement vs Statement

  相比于Statement,PreparedStatement的代码的可读性和可维护性较好.

  PreparedStatement 能最大可能提高性能:

  ①DBServer会对预编译语句提供性能优化。因为预编译语句有可能被重复调用,所以语句在被DBServer的编译器编译后的执行代码被缓存下来,那么下次调用时只要是相同的预编译语句就不需要编译,只要将参数直接传入编译过的语句执行代码中就会得到执行。
  ②在statement语句中,即使是相同操作但因为数据内容不一样,所以整个语句本身不能匹配,没有缓存语句的意义.事实是没有数据库会对
普通语句编译后的执行代码缓存.这样每执行一次都要对传入的语句编译一次.
  ③(语法检查,语义检查,翻译成二进制命令,缓存)

  PreparedStatement 可以防止 SQL 注入,SQL注入是利用某些系统没有对用户输入的数据进行充分的检查,而在用户输入数据中注入非法的 SQL 语句段或命令,从而利用系统的 SQL 引擎完成恶意行为的做法对于 Java 而言,要防范 SQL 注入,只要用PreparedStatement 取代 Statement 就可以了

如果,您对我的这篇博文有什么疑问,欢迎评论区留言,大家互相讨论学习。
如果,您认为阅读这篇博客让您有些收获,不妨点击一下右下角的【推荐】。
如果,您希望更容易地发现我的新博客,不妨点击一下左下角的【关注我】。
如果,您对我的博文感兴趣,可以关注我的后续博客,我是【AlbertRui】。

转载请注明出处和链接地址,欢迎转载,谢谢!

原文地址:https://www.cnblogs.com/albertrui/p/8414313.html