从java调用存储过程

lb3vh1jj  于 2021-06-20  发布在  Mysql
关注(0)|答案(2)|浏览(306)

我试图从java应用程序调用mysql存储过程。当我从mysql workbench调用存储过程时,它可以工作,并且根据我发送的参数获得正确的行数。当我尝试从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) {

    }
  }
}
t2a7ltrp

t2a7ltrp1#

过程和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]或alias提供列名。
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);
            }
        }
    }
}
kuhbmx9i

kuhbmx9i2#

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) {

    }
}

相关问题