【问题标题】:Can CallableStatement be used in place of PreparedStatement?可以使用 CallableStatement 代替 PreparedStatement 吗?
【发布时间】:2015-05-09 00:44:14
【问题描述】:

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

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

更具体地说,像这样使用 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();

【问题讨论】:

  • 你也许可以,但你不应该。 CallableStatement 是“用于执行 SQL 存储过程的接口。”。你没有调用存储过程,所以你不应该使用它。现在,对于大多数 JDBC 驱动程序,它可能会工作,但它可能具有专门用于存储过程的行为,并可能导致奇怪且难以诊断的问题。

标签: java jdbc


【解决方案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();
    }
}

【讨论】:

  • 有什么区别?
【解决方案2】:

我们使用 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 cstmt = null;
try {
   String SQL = "{call getEmpName (?, ?)}";
   cstmt = conn.prepareCall (SQL);
   . . .
}
catch (SQLException e) {
   . . .
}
finally {
   . . .
}

我建议你阅读这篇文章:

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

【讨论】:

    猜你喜欢
    • 2012-01-12
    • 2016-04-05
    • 2019-08-10
    • 2012-02-03
    • 2012-08-11
    • 2022-01-23
    • 2015-08-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多