第一步:定义存储过程(注意:不同MySQL定义存储过程语法有差异)
DELIMITER $$
DROP PROCEDURE IF EXISTS `jdbc`.`addUser` $$
CREATE PROCEDURE `jdbc`.`addUser` (IN `pname` varchar(45),IN `birthday` date,IN `money` float,OUT `pid` int)
BEGIN
insert into user(`name`,`birthday`,`money`) values(pname, birthday, money);
select last_insert_id() into id;
END $$
DELIMITER ;
第二步:编写Java代码进行测试
package cn.itcast.jdbc;
import java.sql.CallableStatement;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Types;
import org.junit.Test;
/**
* JDBC之调用存储过程
*/
public class CallableStatementTest {
@Test
public void testCs() throws SQLException {
csTest();
}
/**
* 测试调用存储过程
* @throws SQLException
*/
static void csTest() throws SQLException {
Connection conn = null;
CallableStatement cs = null;
ResultSet rs = null;
try {
//建立连接
conn = JdbcUtils.getConnection();
//即使没有参数,下面这行也需要括号
String sql = "{ call addUser(?, ?, ?, ?)}";
cs = conn.prepareCall(sql);
//设置输出参数
cs.registerOutParameter(4, Types.INTEGER);
cs.setString(1, "ps name");//设置第一个参数
cs.setDate(2, new java.sql.Date(System.currentTimeMillis()));
cs.setFloat(3, 100f);
cs.executeUpdate();
//获取输出结果
int id = cs.getInt(4);
System.out.println("id=" + id);
} finally {
//因为CallableStatement是继承自PreparedStatement,
//所以可以直接传入关闭
JdbcUtils.free(rs, cs, conn);
}
}
}