可以使用CallableStatement代替PreparedStatement吗?

时间:2015-03-07 13:18:06

标签: java jdbc

需要一些JDBC查询帮助。 我自己会尝试一下,但是现在我无法访问数据库。

我的问题是: 由于CallableStatement扩展了PreparedStatement,这是否意味着我们可以使用CallableStatement来执行为预准备语句准备的任何查询?

更具体地说,使用Callable的任何缺点都是这样的:

CallableStatement stmt = null;
String sql = "UPDATE Employees set age=30 WHERE id=";
      stmt = conn.prepareCall(sql);
      int empID = 102;
      stmt.setInt(1, empID); );
      stmt.execute();
stmt.close();
conn.close();

2 个答案:

答案 0 :(得分:1)

是的,你可以。文档中描述的prepareCallprepareStatement方法的差异。正如您所看到的那样,它们只针对不同的任务进行了优化。

package com.company;

import java.sql.*;

public class Main {

    public static void main(String[] args) throws ClassNotFoundException, SQLException {
        Class.forName("com.mysql.jdbc.Driver");

        Connection connection = DriverManager.getConnection("jdbc:mysql://localhost/mysql", "user", "password");

        CallableStatement callableStatement = connection.prepareCall("SELECT * FROM db WHERE user = ?");
        callableStatement.setString(1, "deployer");
        ResultSet resultSet = callableStatement.executeQuery();

        while(resultSet.next()) {
            System.out.println(resultSet.getString("Db"));
        }

        connection.close();
    }
}

答案 1 :(得分:-1)

我们使用CallableStatement从数据库调用预定义过程,而不是执行预准备语句。

的PreparedStatement:

PreparedStatement pstmt = null;
try {
   String SQL = "Update Employees SET age = ? WHERE id = ?";
   pstmt = conn.prepareStatement(SQL);
   . . .
}
catch (SQLException e) {
   . . .
}
finally {
    pstmt.close();
}

的CallableStatement:

CallableStatement cstmt = null;
try {
   String SQL = "{call getEmpName (?, ?)}";
   cstmt = conn.prepareCall (SQL);
   . . .
}
catch (SQLException e) {
   . . .
}
finally {
   . . .
}

我建议你阅读这篇文章:

http://www.tutorialspoint.com/jdbc/jdbc-statements.htm