使⽤JDBC调⽤数据库的存储过程
  本篇讲述如何使⽤JDBC来调⽤MySQL数据库中的存储过程。建议在学习如何使⽤JDBC调⽤存储过程前,请先了解如何在数据库中使⽤存储过程。
  存储过程是指在数据库系统中,⼀组为了完成特定功能的SQL语句集,存储在数据库中,经过第⼀次编译后以后再调⽤任意次都不需要重新编译了。说⽩了就是⼀堆SQL语句的合并,中间加了点逻辑控制,俗称为数据库中的函数。在⼀些⾦融等⼤型企业中,基本都是由内部⼈员编写好存储过程,然后由外部程序员调⽤存储过程,因为内部数据逻辑处理⽅式涉及商业机密等等。
  也就是说我们现在有两种⽅式来处理数据库中的数据,⼀是通过JDBC从数据库中取出数据然后通过业务层编写处理数据的逻辑代码;⼆是在数据库中定义数据的存储过程,在这个存储过程中完成对数据的逻辑操作,就好⽐数据库中的函数,⽽我们在Java程序中只要调⽤数据库中的这个存储过程即可。
操作:
  在MySQL数据库中确定要调⽤哪个存储过程,包括确定该存储过程的参数列表为哪些SQL类型。
  在JDBC中通过链接Connection对象,调⽤prepareCall(…)⽅法,在prepareCall⽅法中的参数为字符串,内容应该为”{call  存储过程名(?(占位符,个数根据存储过程参数来定)...)}”,调⽤这个⽅法后返回CallableS
tatement对象。
  通过返回的CallableStatement对象对于传⼊类型的参数(IN),如PreparedStatement对象⼀样设置占位符的替代参数,⽽对于占位符对应的参数是输出类型(INOUT),则调⽤CallableStatement对象的registerOutParameter(…)⽅法,该⽅法第⼀个参数指明替代第⼏个占位符,第⼆个参数指明该存储过程的输出参数在数据库中的SQL类型,在Java程序中可以使⽤Types类的字段指定。
  最后通过CallableStatement对象的execute()⽅法执⾏存储过程,即可通过getXXX⽅法获取prepareCall⽅法参数中占位符类型为输出的参数值。
  下⾯通过⼀个例⼦来说明。
例:
  我们现在数据库中⾃定义⼀个存储过程,这个存储过程的功能是在我们传⼊的每⼀个字符串参数⾯前加上⼀段字符串,即将两端字符串连接,最后返回:
mysql存储过程使用
delimiter //
create procedure addPrefix(in inputParam varchar(255),inout inOutParam varchar(255))
begin
select concat('long ',inputParam) into inOutParam;
end//
delimiter ;
  分析:第⼀⾏我们将MySQL中的分隔符先定义为“//”,因为等会在存储过程的逻辑代码中会使⽤到“;”,不先定义别的分隔符的话逻辑代码还没写完数据库就执⾏了。第⼆⾏定义存储过程的名称,同时在参数列表中定义参数输⼊输出类型(IN,OUT,INOUT),参数名称,参数类型(SQL数据类型)。第三⾏开始以关键字“BEGIN”开始,以“END”和刚才定义的分隔符结束,在这两个中间就是平常的SQL语句了,也就是在这个部分编写我们处理参数的逻辑。最后,我们将MySQL数据库的分隔符重新定义回分号“;”。
  注:在数据库中定义存储过程时,应先选择使⽤的库,这⾥我使⽤jdbcdemo库。
  这⾥顺便⼀说在MySQL中如何使⽤SQL命令来调⽤存储过程,对于我们上⾯刚刚创建的存储过程,可以使⽤如下SQL命令语句来调⽤和查看结果:
set @inputParam = 'LRR';
call addPrefix(@inputParam,@result);
select @result;
  因为我们使⽤到了输⼊参数,因此在调⽤存储过程之前需要先设置好输⼊类型In的参数,在MySQL中,使⽤“@”代表该参数是⼀个⽤户变量,⽽对于输出类型out或inout也需要⼀个⾃定义⽤户变量,最后由select将结果显⽰,结果如下图所⽰:
  (注:⽤户变量在退出MySQL命令⾏窗⼝后会⾃动释放资源)
  下⾯开始介绍在Java中如何调⽤数据库中的存储过程。
  创建Java⼯程,在⼯程中导⼊数据库连接驱动的jar包。在【src】⽬录下新建⼀个database.properties⽂件,内容如下:
sql.jdbc.Driver
url=jdbc:mysql://localhost:3306/jdbcdemo
username=root
password=root
  构建JDBC的⼯具类,包括注册驱动,获取连接,释放资源和连接等,这部分同《》中相同,此处略。
  接着,我们将使⽤JDBC来调⽤上⾯刚刚定义的存储过程:
1public void callableTest() throws SQLException {
2        Connection conn = null;
3        CallableStatement st = null;
4        ResultSet rs = null;
5try{
6            conn = Connection();
7            st = conn.prepareCall("{call addPrefix(?,?)}");
8            st.setString(1, "love LRR");
9            st.registerOutParameter(2, Types.VARCHAR);
10            st.execute();
11            String contactPrefix = st.getString(2);
12            System.out.println(contactPrefix);
13
14        }finally{
15            lease(conn, st, rs);
16        }
17    }
View Code
观察程序运⾏结果:
  CallableStatement对象是Statement对象的⼦类,因此在调⽤lease⽅法时使⽤了多态。在prepareCall⽅法中的参数是指定调⽤哪个存储过程的字符串,同时使⽤到了占位符,那么通过CallableStatement对象对传⼊类型的参数设置要替代占位符的数据,⽽对于输出类型的参数则调⽤registerOutParameter⽅法替代占位符并指定SQL类型。在Java中Types类封装了各种SQL类型的字段。
  以上就是如何使⽤JDBC调⽤MySQL数据库中的存储过程的步骤。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。