JDBC PreparedStatement接口
时间:2020-01-09 10:35:20 来源:igfitidea点击:
在JDBC中使用Statement,我们可以在连接的数据库上执行SQL查询,但是使用Statement有一个限制,它没有给我们参数化SQL查询的机会,因此可以通过传递不同的参数来多次使用同一查询。在JDBC中有Statement的一个子接口,PreparedStatement,它提供了编写可多次执行的参数化查询的选项。
除了为我们提供编写动态查询的选项之外,使用JDBC PreparedStatement的另一个好处是。在PreparedStatement中,我们将在创建实例时传递该SQL语句,以便将SQL语句预先编译并存储在PreparedStatement对象中。然后可以使用该对象多次有效地执行该语句。由于在调用execute时查询已经被编译,因此PreparedStatement的性能更好。
如何获取PreparedStatement对象
我们可以通过调用Connection接口的prepareStatement(String sql)方法来获取PreparedStatement对象。例如
PreparedStatement pstmt = con.prepareStatement("UPDATE EMPLOYEES SET DEPARTMENT = ? WHERE ID = ?");
这里的"?"是参数化语句中的占位符。这些占位符的值是通过setter方法提供的。
Java PreparedStatement中的方法
PreparedStatement接口的一些常用方法如下:
- execute()–在此PreparedStatement对象中执行SQL语句,它可以是任何类型的SQL语句。该方法返回一个布尔值;如果第一个结果是ResultSet对象,则为true;否则为false。如果是更新计数或者没有结果,则返回false。
- executeQuery()–在此PreparedStatement对象中执行SQL查询,并返回查询生成的ResultSet对象。
- executeUpdate()–在此PreparedStatement对象中执行SQL语句,该对象可以是DML语句,例如INSERT,UPDATE或者DELETE,也可以是不返回任何内容的SQL语句,例如SQL DDL语句(创建,删除)。
- addBatch()–向此PreparedStatement对象的一批命令中添加一组参数。
设置不同类型参数的值的设置方法也很多,在这里列出了其中一些
- setInt(int parameterIndex,int x)–将给定索引处的参数设置为给定Java int值。
- setLong(int parameterIndex,long x)–将给定索引处的参数设置为给定Java long值。
- setShort(int parameterIndex,short x)–将给定索引处的参数设置为给定Java short值。
- setString(int parameterIndex,String x)–将给定索引处的参数设置为给定Java String值。
- setDate(int parameterIndex,Date x)–使用运行应用程序的虚拟机的默认时区,将给定索引处的参数设置为给定java.sql.Date值。
- setTime(int parameterIndex,Time x)–将给定索引处的参数设置为给定java.sql.Time值。
- setTimestamp(int parameterIndex,Timestamp x)-将给定索引处的参数设置为给定java.sql.Timestamp值。
PreparedStatement Java示例
这是一个示例,显示JDBC PreparedStatement用于CRUD操作的用法。使用的数据库是MySql,模式是theitroad,使用的表是EMPLOYEE,其列分别为id,FIRST_NAME,LAST_NAME和DEPARTMENT,请注意,id是自动生成的,因此不会通过查询发送。
import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; public class PreparedStatementDemo { public static void main(String[] args) { Connection connection = null; try { // Load driver Class.forName("com.mysql.cj.jdbc.Driver"); // connection object connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/theitroad", "root", "admin"); // create Statement object PreparedStatementDemo preparedStatement = new PreparedStatementDemo(); preparedStatement.insertEmployee(connection, "Ranjeet", "Sharma", "Police"); preparedStatement.updateEmployee(connection, 16, "Finance"); preparedStatement.deleteEmployee(connection, 22); preparedStatement.getEmployeeById(connection, 16); } catch (ClassNotFoundException | SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); }finally{ if(connection != null){ try { connection.close(); } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } } private void insertEmployee(Connection connection, String fName, String lName, String dept) throws SQLException{ String insertSQL = "INSERT INTO EMPLOYEE (FIRST_NAME, LAST_NAME, DEPARTMENT) values (?, ?, ?)"; PreparedStatement prepStmt = null; try { prepStmt = connection.prepareStatement(insertSQL); prepStmt.setString(1, fName); prepStmt.setString(2, lName); prepStmt.setString(3, dept); int count = prepStmt.executeUpdate(); System.out.println("Number of records inserted- " + count); }finally{ if(prepStmt != null){ prepStmt.close(); } } } private void updateEmployee(Connection connection, int id, String department) throws SQLException{ String updateSQL = "UPDATE EMPLOYEE SET DEPARTMENT = ? WHERE ID = ?"; PreparedStatement prepStmt = null; try { prepStmt = connection.prepareStatement(updateSQL); prepStmt.setString(1, department); prepStmt.setInt(2, id); int count = prepStmt.executeUpdate(); System.out.println("Number of records updated " + count); }finally{ if(prepStmt != null){ prepStmt.close(); } } } private void deleteEmployee(Connection connection, int id) throws SQLException { String deleteSQL = "DELETE FROM EMPLOYEE WHERE id = ?"; PreparedStatement prepStmt = null; try { prepStmt = connection.prepareStatement(deleteSQL); prepStmt.setInt(1, id); int count = prepStmt.executeUpdate(); System.out.println("Number of records deleted " + count); }finally{ if(prepStmt != null){ prepStmt.close(); } } } private void getEmployeeById(Connection connection, int id) throws SQLException{ String selectSQL = "SELECT * FROM EMPLOYEE WHERE id = ?"; PreparedStatement prepStmt = null; try { prepStmt = connection.prepareStatement(selectSQL); prepStmt.setInt(1, id); ResultSet rs = prepStmt.executeQuery(); while(rs.next()){ System.out.println("id: " + rs.getInt("id")); System.out.println("First Name: " + rs.getString("FIRST_NAME")); System.out.println("Last Name: " + rs.getString("LAST_NAME")); System.out.println("Department: " + rs.getString("DEPARTMENT")); } }finally{ if(prepStmt != null){ prepStmt.close(); } } } }