从Java调用存储过程
我试图从我的Java应用程序调用一个mySQL存储过程。当我从mySQL workbench调用存储过程时,它可以工作,并且根据我发送的参数获得正确的行数。当我尝试从Java调用它时,问题就出现了,我没有得到任何结果,也不知道为什么。我一直在关注oracle文档 存储过程:从Java调用存储过程,java,mysql,Java,Mysql,我试图从我的Java应用程序调用一个mySQL存储过程。当我从mySQL workbench调用存储过程时,它可以工作,并且根据我发送的参数获得正确的行数。当我尝试从Java调用它时,问题就出现了,我没有得到任何结果,也不知道为什么。我一直在关注oracle文档 存储过程: CREATE DEFINER=`root`@`localhost` PROCEDURE `comprobarUsuario`( IN usu varchar(20), IN pass varchar(20), OUT idu
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
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) {
}
}
}
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
我试图调用存储过程的Java类:
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
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) {
}
}
}
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
过程和Java代码几乎不需要采用。因此,让我们从以下步骤开始:
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
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) {
}
}
}
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);
}
}
}
}
是的,我试了很多东西,但还是不行啊,耶!我很高兴有人决定结束我的问题,并将其指向一个不适用于postgresql的解决方案。有人知道怎么做吗?就快到了,但仍然有一个Java问题:
cs.executeQuery()
将引发异常。用cs.executeUpdate()替换它。。谢谢,我更新了我的答案。显然,如果您试图访问ResultSet,它只会抛出一个异常,但是cs.executeUpdate()是更好的选择。感谢您的回答,不幸的是,我仍然有一个问题:我在mySQL workbench中从SP获得一个结果,而不是在Java应用程序中,甚至按照您告诉我的那样更改DDL,而不使用ResultSet。我确信代码有问题,因为当我从java执行一个查询(使用preparedStatement)时,我得到了一个结果。更新:不知道为什么,但将结果保存在一个ResultSet中并写入行[ResultSet].next();我能够得到存储过程的结果。