PostgreSQL JDBC PreparedStatement 执行预编译SQL语句

PostgreSQL JDBC 可能使用 Statement 或者 PreparedStatement 接口执行 SQL 语句,如果想通过动态绑参形式执行预编译 SQL 语句,那么只能选择 PreparedStatement 接口。

Statement 对象与 PreparedStatement 对象的使用注意事项如下:

  • Statement 对象可用于执行 SQL 语句,在数据库连接创建之后,可以创建一个 Statement 对象实例,在连接的生命周期内可以多次使用该实例。但是要注意,任何时刻 ResultSet 对象只能与 Statement 或者 PreparedStatement 对象中的一个关联,不能同时关联两者。
  • 如果正在处理 ResultSet 对象中的数据时想再执行一个 SQL 语句,则需要创建并使用另外一个 Statement 对象。
  • 如果使用多线程编程,并且每个线程都需要访问数据库,那么对每个线程使用独立的 Statement 对象。
  • 当使用完 Statement 或者 PreparedStatement 对象时,应该关闭该对象。
  • 在 JDBC 中,问号(?)是 PreparedStatement 对象执行 SQL 的位置参数的占位符。然而有许多 PostgreSQL 运算符包含问号,要防止 SQL 语句中的此类问号被解释为位置参数,则需要使用两个问号(??)作为转义序列。对于 Statement 对象,也可以使用此转义序列,但这不是必需的。因为在 Statement 对象中,单个问号(?)才能用作运算符。

下面通过一个示例,演示 JDBC 执行预编译 SQL 语句。通过 JDBC 预编译 SQL 语句查询 student 表,where 条件为字段 name 包含 ? 符号并且 age 为 20,age 是动态绑参确定,输出查询结果,完整代码如下:

import java.sql.*;
import java.util.Properties;

public class Main{
    public static void main(String[] args)
    {
        String url = "jdbc:postgresql://127.0.0.1:36099/postgres";
        try {
                Connection conn = DriverManager.getConnection(url, "admin", "123456");
                PreparedStatement st = conn.prepareStatement("select * from student where name like '%?%' and age=?");
                st.setInt(1, 20);
                ResultSet rs = st.executeQuery();
                while(rs.next()){
                    int id = rs.getInt(1);
                    String name = rs.getString(2);
                    int age = rs.getInt(3);
                    System.out.println("id:" + id + " name:" + name + " age:" + age);
                }
                rs.close();
                st.close();
                conn.close();
        }catch (SQLException e) {
                e.printStackTrace();
        }
    }
}

数据库表 student 原始数据如下:

postgres=> select * from student;
 id | name | age
----+------+-----
  1 | aaa  |  19
  2 | bbb  |  20
  3 | ???  |  20
  4 | ?    |  20
  5 | ccc  |  20
(5 rows)

执行程序结果如下:

[zhang@localhost java]$ javac -Djava.ext.dirs=jdbc Main.java
[zhang@localhost java]$ java -Djava.ext.dirs=jdbc Main
id:3 name:??? age:20
id:4 name:? age:20

文章评论

0条评论