自学内容网 自学内容网

15.4 JDBC数据库编程4——使用PreparedStatement对象

目录

15.4  使用PreparedStatement对象

15.4.1  引言

15.4.2  创建PreoareStatement对象

15.4.3  带参数的SQL语句

1.设置占位符

2.用复杂数据设置占位符

3.设置空值


15.4  使用PreparedStatement对象

15.4.1  引言

        Statement对象在每次执行SQL语句时都将该语句传给数据库,这样,在多次执行同一个语句时效率较低。为了提高语句的执行效率,可以使用PrepareStatement接口对象,它是Statement的子接口。

15.4.2  创建PreoareStatement对象

        使用PreparedStatement对象可以将SQL语句传给数据库作预编译,以后每次执行这个SQL语句时效率较低。为了提高语句的执行效率,可以使用PrepareStatement接口对象,它是Statement的子接口。
        创建PreparedStatement对象使用Connection接口的prepareStatement()方法。与创建Statement对象不同的是,需要给该方法传递一个SQL命令。用Connection的下列方法创建PreparedStatement对象。与创建Statement对象不同的是,需要给该方法传递一个SQL命令。用Connection的下列方法创建PreparedStatement对象

  • public PreparedStatement prepareStatement(String sql):使用特定的SQL命令创建一个预处理语句对象,在该对象上返回的ResultSet是只能向前滚动的,不可更新的,不可保持的结果集对象
  • public PreparedStatement prepareStatement(String sql, int type ,int concurrency):使用给定的SQL命令创建一个预处理语句对象,在该对象上返回的ResultSet可以通过type和concurrency参数指定是否可滚动,是否可更新。

15.4.3  带参数的SQL语句

        PreparedStatement对象通常用来执行带参数的SQL语句,通过使用带参数的SQL语句可以提高SQL语句的灵活性。此时需要在SQL语句中通过问好(?)指定参数。每个问号为一个参数,是实际参数的占位符。在SQL语句执行时,参数将被实际数据替换。

String sql="INSERT INTO products VALUES(?,?,?,?,?)";
PreparedStatement pstmt=conn.prepareStatement(sql);

1.设置占位符

        创建PreparedStatement对象之后,在执行该SQL语句之前,必须用数据替换每个占位符。每个占位符都是通过它们的序列号被引用,从SQL字符串左边开始,第一个占位符的序号为1,依次类推。可以通过PreparedStatement接口中定义的setXxx()方法为占位符设置具体的值。例如,下面方法分别为占位符设置整数值和字符串值。

  • public void setInt(int parameterIndex,int x):这里parameterIndex为参数的序号,x为一个整数值。
  • public void setString(int parameterIndex,String x):这里parameterIndex为占位符设置一个字符串值

        每个Java基本类型都有一个对应的setXxx()方法,此外还有许多对象类型,如Date和BigDecimal都有相应的setXxx()方法。关于这些方法的详细信息参考Java API文档
对于前面的INSERT语句,使用下面的代码设置每个占位符的值

pstmt.setInt(1,106);
pstmt.setString(2,"MP4播放器");
pstmt.setString(3,"Sony");
pstmt.setFloat(4,900.00F);
pstmt.setInt(5,2);

注意:在执行SQL语句之前必须设置所有参数,否则会抛出SQLException异常
        使用预处理语句还有另外一个优点,每次执行这个SQL命令时已经设置的值不需要再重新设置,也就是说设置的值是可保持的。另外,还可以使用预处理语句执行批量更新。

2.用复杂数据设置占位符

        使用预处理语句对象可以对要插入到数据库的数据进行处理。对于日期,时间和时间戳,只要简单地创建相应的java.sql.Date或java.sql.Time对象,然后把它传给预处理语句对象的setDate()或setTime()方法即可。在JavaSE8中,java.sql包中地Date,Time和Timestamp类都提供了一些方法,可以与java.time包中对应的LocalDate,LocalTime和LocalDateTime类互相进行转换。例如,在java.sql.Date类中定义了下面方法。

public static Date valueOf(LocalDate date):将LocalDate对象转换成java.sql.Date对象。
下面代码将LocalDate对象转换成java.sql.Date对象并设置预编译语句的参数。

LocalDate localDate =LocalDate.of(2022,Month.NOVEMBER,20);
java.sql.Date d=java.sql.Date.valueOf(localDate);
pstmt.setDate(1,d);

3.设置空值

如果需要为某个占位符设置空值,需要使用PreparedStatement对象的setNull()方法,该方法有下面两种格式:

  • public void setNull(int parameterIndex,int sqlType)
  • public void setNull(int parameterIndex,int sqlType,String typeName)

参数parameterIndex是占位符的索引;sqlType参数是指定SQL类型,它的取值为java.sql.Types

4.执行预处理语句

        设置预处理语句的全部参数后,调用PreparedStatement对象有关方法执行语句,对不同的预处理语句应使用不同的执行方法。

  • public ResultSet executeQuery():执行预处理语句中的SQL查询语句
  • public int executeUpdate():执行预处理语句中SQL的DML语句,如INSERT,UPDATE或DELETE等,返回这些语句所影响的行数。该方法还可以执行如CREATE,ALTER,DROP等无返回值(实际返回0)的DDL语句
  • public boolean execute():执行任何的预处理SQL语句

对预处理的更新语句调用executeUpdate()方法,如下所示:

int i=pstmt.executeUpdate();

注意,对于预处理语句,必须调用这些方法的无参数版本,如executeQuery()等。如果调用executeQuery(String),executeUpdate(String)或execute(String)方法,将抛出SQLException异常。


原文地址:https://blog.csdn.net/haozihua/article/details/142654200

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!