[英]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.