JDBC 用CallableStatement接口操作存储过程

1.什么是存储过程:

在数据库中,可以通过创建一个存储过程来达到一次性执行多条SQL语句的目的

在 mysql命令行中:

创建不带参数的存储过程,如:

create procedure sp_name () select * from usertable;         表示创建一个名为sp_name的存储过程,执行的语句为 select * from usertable; 


执行存储过程:

call sp_name();


2.通过CallableStatement接口在JAVA程序中执行存储过程:

1.Connection conn = 连接数据库 ;(conn 为连接数据库后返回的引用)

2.[例子] CallableStatement cstmt = conn.prepareCall("{call show_usertbl()}");   //创建CallableStatement对象.调用prepareCall方法调用存储过程

  //例子中,存储过程的名字为 show_usertbl(),call表示调用.注意,旁边要有中括号{}引起来    

(一)调用没有参数的存储过程

public class Test3 {

	public static void main(String[] args) {
		test();
	}

	static void test() {
		Connection conn = DBUtil.open(); // 连接数据库	(注:DBUtil是自定义的类,详细定义如何可翻看之前文章)
		try {
			CallableStatement cstmt = conn.prepareCall("{call show_usertbl()}");// 第一步
			ResultSet rs = cstmt.executeQuery(); // 第二步,执行存储过程调用,结果返回到 rs中。
			while (rs.next()) {
				int id = rs.getInt(1);
				String name = rs.getString(2);
				System.out.println("id:" + id + " name:" + name);
			}
		} catch (SQLException e) {
			e.printStackTrace();
		} finally {
			DBUtil.close(conn); // 关闭数据库
		}
	}
}



(二)带输入参数的存储过程:

参数类型: in 表示输入,out 表示输出

在mysql命令行下:

创建带输入参数的存储过程:

例子:create procedure insert_usertbl(in myid int,  in myname  varchar(20))  insert into usertbl(id,name) values(20,"xiaoming");

说明:insert_usertbl 是存储过程的名字,myid是整型的输入参数,myname是字符型的输入参数, insert into usertbl(id,name) values(20,"xiaoming") 是SQL语句


创建存储过程后,在JAVA程序中通过CallableStatement接口调用:
问号?表示要动态赋值的变量。

import java.sql.CallableStatement;
import java.sql.Connection;
import java.sql.SQLException;

public class Test4 {
	public static void main(String[] args) {
		Insert();
	}
	
	static void Insert()
	{
		Connection conn = DBUtil.open();	//连接数据库
		try {
			CallableStatement cstmt = conn.prepareCall("{call insert_usertbl(?,?)}");
														//问号表示要动态赋值的参数
			cstmt.setInt(1, 8);				//给第一个问号赋值为8
			cstmt.setString(2, "xiaowang"); //给第二个问号赋值为“xiaowang”
			cstmt.executeUpdate();			//执行 call insert_usertbl(8,“xiaowang”)
		} catch (SQLException e) {
			e.printStackTrace();
		}finally
		{
			DBUtil.close(conn);				//关闭数据库
		}
	}
}



(三)创建有输入输出参数的存储过程:

参数类型: in 表示输入,out 表示输出
在mysql命令行下:

例子:create procedure getNameById(in cid int,out return_name varchar(20)) select name from usertbl where id = cid;

说明:其中getNameById为存储过程名字,cid为要输入的参数,而return_name为系统要返回给我的数据。select name into return_name from usertbl where id = cid 是操作的SQL语句 (返回的name是从return_name中抽取的)


Java程序中用CallableStatement接口调用此存储过程:

注意:有输出变量的时候,要给输出变量进行注册

import java.sql.CallableStatement;
import java.sql.Connection;
import java.sql.SQLException;
import java.sql.Types;

public class Test5 {

	public static void main(String[] args) {
		getName();
	}

	static void getName() {
		Connection conn = DBUtil.open();
		try {
			CallableStatement cstmt = conn.prepareCall("{call getNameById(?,?)}");// 输入输出变量都要以?表示
			cstmt.setInt(1, 20); // 给第一个问号赋值为20
			// 注册输出参数
			cstmt.registerOutParameter(2, Types.CHAR); // 给作为输出变量的第二个问号注册,并制定其为char型
			cstmt.execute(); // 执行 call getNameById()
			String name = cstmt.getString(2); // 取存储过程中的第二个变量的值

			System.out.println("name:" + name);
		} catch (SQLException e) {
			e.printStackTrace();
		} finally {
			DBUtil.close(conn);
		}
	}
}


  • 5
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值