前面我们讲了JDBC执行存储过程只有IN参数,没有OUT参数。这篇文章我们来讲下有IN参数,有OUT参数,并返回简单值的情况。
操作数据库:mysql
操作目的:建立一个名为sp_insertDetail的存储过程,该存储过程目的是在t_user中插入一条数据,并返回成功插入数据后,目前数据库里一共有几条数据。
sp_insertDetail存储过程的代码如下,还是通过mysql客户端直接创建吧,就不通过JDBC创建该存储过程了,如果还是需要通过JDBC创建存储过程,可以看之前的这篇文章:JDBC创建存储过程。
create procedure sp_insertDetail(in sp_name VARCHAR(20),out sp_count INT) begin INSERT into t_user(name) values(sp_name,2); SELECT COUNT(*) INTO sp_count FROM t_user; end
在mysql客户端中执行以上代码,可以看到以下输出结果
[SQL]create procedure sp_insertDetail(in sp_name VARCHAR(20),out sp_count INT) begin INSERT into t_user(name) values(sp_name,2); SELECT COUNT(*) INTO sp_count FROM t_user; end 受影响的行: 0 时间: 0.003s
在通过JDBC创建存储过程之前,我们来看下当前的数据库结构
可以看到存储过程sp_insertDetail已经创建成功了,并且在t_user表中有2条数据,可以预见到,通过JDBC执行存储过程后,应该返回3这个简单的整型值。
下面我们执行下JDBC执行存储过程的代码,核心代码如下:
String jdbcURL = "jdbc:mysql://localhost:3306/codingwhy?useUnicode=true&characterEncoding=utf-8"; String jdbcUser = "root"; String jdbcPassword = ""; Class.forName("com.mysql.jdbc.Driver",2); Connection conn = DriverManager.getConnection(jdbcURL,jdbcUser,jdbcPassword,2); //JDBC调用存储过程 只有输入IN参数,没有输出OUT参数 String callProcedureSql="{call sp_insertDetail(?,?)}"; CallableStatement callableStatement = conn.prepareCall(callProcedureSql,2); callableStatement.setString(1, "codingwhy_new",2); callableStatement.registerOutParameter(2, java.sql.Types.INTEGER,2); callableStatement.executeQuery(,2); int sp_count = callableStatement.getInt("sp_count",2); System.out.println("JDBC执行存储过程成功,目前数据库中共有"+sp_count+"条数据...",2);
执行以上存储过程后,我们再看下当前的数据库结构,如下图所示:
可以看到,已经成功插入了记录
在eclipse的console视图下看到了如下结果
JDBC执行存储过程成功,目前数据库中共有3条数据...
这样我们就完成了有IN参数,有OUT参数,并返回简单值存储过程的执行