【问题标题】:Calling stored procedures from Java从 Java 调用存储过程
【发布时间】:2021-02-11 09:53:43
【问题描述】:

我正在尝试从我的 Java 应用程序调用 mySQL 存储过程。当我从 mySQL 工作台调用存储过程时,它可以工作,并且我会根据我发送的参数获得正确的行数。当我尝试从 Java 调用它时,问题就来了,我没有得到任何结果,也找不到原因。我一直在关注 oracle 文档。

存储过程:

CREATE DEFINER=`root`@`localhost` PROCEDURE `comprobarUsuario`(
IN usu varchar(20),
IN pass varchar(20),
OUT idusuarios int)
BEGIN
  SELECT idusuarios
  FROM usuarios
  WHERE usuarios.nombreUsuario = usu and usuarios.contraseña = pass;

END

我试图调用存储过程的 Java 类:

public class ConectorSQL {

public static final String URL = "jdbc:mysql://localhost:3306/ProyectoBD?autoReconnect=true&useSSL=false";
public static final String USERNAME = "root";
public static final String PASSWORD = "1627Admin";

public static Connection getConnection() {
    Connection con = null;
    try {
        Class.forName("com.mysql.jdbc.Driver");
        con = (Connection) DriverManager.getConnection(URL, USERNAME, PASSWORD);
        //System.out.println("Conexion exitosa");

    } catch (Exception e) {
        System.out.println("Error de conexión con la base de datos");
    }
    return con;
}

public void mostrarDatos() {
    try {
        Connection con = null;
        con = getConnection();

        CallableStatement cs;
        cs = con.prepareCall("{CALL comprobarUsuario(?,?,?)}");
        cs.setString(1,"Jorge" );
        cs.setString(2, "1627Jorge");
        cs.registerOutParameter(3, Type.INT);
        ResultSet rs2 = cs.executeQuery();

        if(rs2.next()){
            System.out.println(true);
        }
        int resultado = cs.getInt("idusuarios");
        System.out.println(resultado);
        con.close();

    } catch (Exception e) {

    }
  }
}

【问题讨论】:

    标签: java mysql


    【解决方案1】:
    public void mostrarDatos() 
    {
        try {
            Connection con = null;
            con = getConnection();
    
            CallableStatement cs;
            cs = con.prepareCall("{CALL comprobarUsuario(?,?,?)}");
            cs.setString(1,"Jorge" );
            cs.setString(2, "1627Jorge");
            cs.registerOutParameter(3, Type.INT);
            cs.execute();
            ResultSet rs2 = cs.getResultSet();
    
            if(rs2.next()){
                System.out.println(true);
            }
            int resultado = cs.getInt(3); // check whether the column name is correct
            System.out.println(resultado);
            con.close();
    
        } catch (Exception e) {
    
        }
    }
    

    【讨论】:

    • 是的,我试了很多次还是不行
    • 哦,耶!我很高兴有人决定结束我的问题并将其指向一个不适用于 postgresql 的解决方案。有人知道怎么做吗?
    【解决方案2】:

    过程和 Java 代码几乎不需要采用。那么让我们从程序开始:

    create DEFINER=`root`@`localhost` PROCEDURE `comprobarUsuario`(
    IN usu varchar(20),
    IN pass varchar(20),
    OUT idusuarios int)
    BEGIN
      SELECT usuarios.idusuarios
      into idusuarios
      FROM usuarios
      WHERE usuarios.nombreUsuario = usu and usuarios.contraseña = pass;
    end
    

    您想从数据库中检索值“idusuarios”。所以你需要把它保存在参数值中。 确保 select 子句中的参数和值彼此不同,或者通过 [tablename].[column] 或别名提供列名。

    Java 问题:您根本不需要 ResultSet 对象。要访问过程输出参数中的值,请使用 CallableStatement 类提供的 cs.getInt()。

    public void mostrarDatos(){
        Connection con = null;
        try {
            con = getConnection();
            CallableStatement cs = con.prepareCall("{CALL comprobarUsuario(?,?,?)}");
            cs.setString(1, "Jorge");
            cs.setString(2, "1627Jorge");
            cs.registerOutParameter(3, java.sql.Types.INTEGER);
            cs.executeUpdate();
    
            int resultado = cs.getInt(3);
            System.out.println(resultado);  
    
        } catch (Exception e) {
            System.out.println(e);
        } finally {
            if(con != null) {
                try {
                    con.close();
                } catch (SQLException e) {
                    System.out.println(e);
                }
            }
        }
    }
    

    【讨论】:

    • 差不多了,但还有一个 Java 问题:cs.executeQuery() 会抛出异常。将其替换为cs.executeUpdate()
    • 谢谢,我更新了我的答案。显然,如果您尝试访问 ResultSet,它只会引发异常,但 cs.executeUpdate() 是更好的选择。
    • 感谢您的回答,不幸的是我仍然遇到问题:我从 mySQL 工作台中的 SP 获得了结果,但在我的 Java 应用程序中却没有,甚至按照您告诉我的方式更改了 DDL 而没有使用结果集。我确定代码有问题,因为当我从 java(使用preparedStatement)执行查询时,我得到了一个结果。
    • 更新:不知道为什么,但是将结果保存在 ResultSet 中并写入行 [ResultSet].next();我可以得到存储过程的结果。
    猜你喜欢
    • 2012-01-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-09
    • 2013-03-07
    • 2017-09-20
    相关资源
    最近更新 更多