jdbc创建与调用存储过程

本文介绍如何使用Java JDBC创建和调用Mysql存储过程。首先展示了创建存储过程的方法,并提供了具体的SQL语句示例。接着详细解释了如何通过CallableStatement来调用带有输入和输出参数的存储过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前提:知道Mysql创建存储过程的语法及sql语句,不知道先看一下这方面知识
[url]http://blog.sina.com.cn/s/blog_52d20fbf0100ofd5.html[/url]
1、jdbc创建存储过程
private static Connection conn = null;
private static PreparedStatement pstmt = null;
public static void loginProcedure(){
conn = getConnection(); // 这里getConnection方法没列出来,就是连接数据库,返回java.sql.Connection对象引用
String procedureSQL = "create procedure USER_EXIST(in loginName varchar(50),out amount int)" +
"select count(*) into amount from user where username = loginName ; ";
try {
pstmt = conn.prepareStatement(procedureSQL);
pstmt.executeUpdate();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally{
try {
pstmt.close();
pstmt = null;
conn.close();
conn = null;
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}

}
}

主要是存储过程的sql语句的书写,其实写法和普通的jdbc书写sql语句一样,只是存储过程的纯sql语句本来就复杂些,特别是存储过程比较复杂的时候,jdbc的sql语句写法就要好好注意了,不过只要数据库的存储过程sql语句清楚的话,jdbc书写也还是简单的;
上面的String procedureSQL是简化的写法,一般化的写法如下:
String procedureSQL = " create procedure USER_EXIST(in loginName varchar(50),out amount int)" + 
" begin" +
" declare middleVariable int;" + //声明中间变量,用到的话就声明
" select count(*) into amount from user where username = loginName;" +
" end;" ;
//在begin和end之间可以进行逻辑代码的书写

当然,不能把凑起来的sql语句直接放到数据库中执行来检验是否正确,因为她解析不过来,需要按如下方式在数据库中输入
	mysql> delimiter $$						
mysql> create procedure USER_EXIST(in loginName varchar(50),out amount int)
-> begin
-> declare middleVariable int;
-> select count(*) into amount from user where username = loginName;
-> end
-> $$
Query OK, 0 rows affected (0.00 sec)

mysql> delimiter ;

delimiter $$是将Mysql的语句结束符改成$$,这样在创建存储过程中就能使用分号了(分号默认是Mysql的语句结束符) 最后delimiter ;是还原Mysql语句结束符
2、调用存储过程
	private static Connection conn = null;
private static PreparedStatement pstmt = null;
private static CallableStatement cstmt = null;
String username = "132";
conn = getConnection();
try {
cstmt = conn.prepareCall("{call USER_EXIST(?,?)}");
cstmt.setString(1, username);
cstmt.registerOutParameter(2, Types.INTEGER); //注册输出参数
cstmt.execute();
System.out.println(cstmt.getInt(2)); //与上注册的对应

} catch (SQLException e) {
e.printStackTrace();
} finally{
try {
cstmt.close();
cstmt = null;
conn.close();
conn = null;
} catch (SQLException e) {
e.printStackTrace();
}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值