簡體   English   中英

從 Java 調用存儲過程

[英]Calling stored procedures from Java

我正在嘗試從我的 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 Class :

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 代碼幾乎不需要采用。 那么讓我們從程序開始:

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

    }
}

如果在您的情況下可以接受使用第三方,您可以使用jOOQ 的存儲過程代碼生成功能(否則您不必使用 jOOQ)。

jOOQ 會生成一個 class 像這樣(簡化):

public class Comprobarusario extends AbstractRoutine<Integer> {
    public void setUsu(String usu) { ... }
    public void setPass(String pass) { ... }
    public Integer getIdusarios() { ... }
}

然后你可以這樣稱呼它:

Comprobarusario call = new Comprobarusario();
call.setUsu(...);
call.setPass(...);
call.execute(configuration);
Integer idusarios = call.getIdusarios();

// This will contain the contents of your procedure's result set:
Results results = call.getResults();

免責聲明:我在 jOOQ 背后的公司工作。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM