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条评论