PreparedStatement对象
在上一小节中,SQL语句的执行是通过Statement对象实现的。Statement对象每次执行SQL语句时,都会对其进行编译。当相同的SQL语句执行多次时,Statement对象就会使数据库频繁编译相同的SQL语句,从而降低数据库的访问效率。
为了解决上述问题,Statement提供了一个子类PreparedStatement。PreparedStatement对象可以对SQL语句进行预编译。也就是说,当相同的SQL语句再次执行时,数据库只需使用缓冲区中的数据,而不需要对SQL语句再次编译,从而有效提高数据的访问效率。为了大家快速了解PreparedStatement对象的使用,接下来,通过一个案例来演示,如例1所示。
例1 Example02.java
1 package cn.itcast.jdbc.example;
2 import java.sql.Connection;
3 import java.sql.DriverManager;
4 import java.sql.PreparedStatement ;
5 import java.sql.SQLException;
6 public class Example02 {
7 public static void main(String[] args) throws SQLException {
8 Connection conn = null;
9 PreparedStatement preStmt = null;
10 try {
11 // 加载数据库驱动
12 Class.forName("com.mysql.jdbc.Driver");
13 String url = "jdbc:mysql://localhost:3306/chapter01";
14 String username = "root";
15 String password = "itcast";
16 // 创建应用程序与数据库连接的Connection对象
17 conn = DriverManager.getConnection(url, username, password);
18 // 执行的SQL语句
19 String sql = "INSERT INTO users(name,password,email,birthday)"
20 + "VALUES(?,?,?,?)";
21 // 创建执行SQL语句的PreparedStatement 对象
22 preStmt = conn.prepareStatement(sql);
23 preStmt.setString(1, "zl");
24 preStmt.setString(2, "123456");
25 preStmt.setString(3, "zl@sina.com");
26 preStmt.setString(4, "1789-12-23");
27 preStmt.executeUpdate();
28 } catch (ClassNotFoundException e) {
29 e.printStackTrace();
30 } finally { // 释放资源
31 if (preStmt != null) {
32 try {
33 preStmt.close();
34 } catch (SQLException e) {
35 e.printStackTrace();
36 }
37 preStmt = null;
38 }
39 if (conn != null) {
40 try {
41 conn.close();
42 } catch (SQLException e) {
43 e.printStackTrace();
44 }
45 conn = null;
46 }
47 }
48 }
49 }
例1演示了使用PreparedStatement对象执行SQL语句的步骤。首先通过Connection对象的prepareStatement()方法生成PreparedStatement 对象,然后调用PreparedStatement 对象的setXxx()方法,给SQL语句中的参数赋值,最后通过调用executeUpdate()方法执行SQL语句。
例1运行成功后,会在数据库chapter01的users表中插入一条数据。进入MySQL,使用SELECT语句查看users表,结果如下所示:
mysql> select * from users;
+----+--------+----------+-----------------+------------+
| id | name | password | email | birthday |
+----+--------+----------+-----------------+------------+
| 1 | zs | 123456 | zs@sina.com | 1980-12-04 |
| 2 | lisi | 123456 | lisi@sina.com | 1981-12-04 |
| 3 | wangwu | 123456 | wangwu@sina.com | 1979-12-04 |
| 4 | zl | 123456 | zl@sina.com | 1789-12-23 |
+----+--------+----------+-----------------+------------+
4 rows in set (0.00 sec)
从上述结果可以看出,users表中多了一条数据,说明PreparedStatement 对象可以成功执行对数据库的操作。