15.4 JDBC数据库编程4——使用PreparedStatement对象
目录
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)!