hibernate中调用存储过程

2014-11-24 08:26:43 · 作者: · 浏览: 0
我搭建的一个ssh1(spring2.5.6+hibernate3.4+struts1.3.8)框架中需要提供一个调用存储过程的公有方法。
原理:这个其实和ssh没啥关系,主要是我们的java.sql.Connection中已经提供了这样的接口了。我们只是通过hibernate的session来获取我们的Connection而已。
具体的通用接口编码如下:

01 /**
02 * 直接调用存储过程
03 * @param procString
04 * www.2cto.com" class="referer" target="_blank">@author kongqz
05 * @throws Exception
06 * @date 2009-03-03
07 * **/
08 public void callProcedure(String procString,List params) throws Exception {
09 CallableStatement stmt = null;
10 try {
11 stmt = this.getSession().connection().prepareCall(procString);
12 if (params != null){
13 int idx = 1;
14 for (Object obj : params) {
15 if (obj != null) {
16 stmt.setObject(idx, obj);
17 } else {
18 stmt.setNull(idx, Types.NULL);
19 }
20 idx++;
21 }
22 }
23 stmt.execute();
24 } catch (SQLException e) {
25 e.printStackTrace();
26 throw new Exception("调用存储过程的时候发生错误[sql = " + procString + "]", e);
27
28 }
29 }
这里我在我的mysql5 数据库中创建了两个存储过程:
不带参数的:
01 DELIMITER $$
02
03 DROP PROCEDURE IF EXISTS `hdssh`.`testProc`$$
04
05 CREATE PROCEDURE `hdssh`.`testProc`()
06 /*LANGUAGE SQL
07 | [NOT] DETERMINISTIC
08 | { CONTAINS SQL | NO SQL | READS SQL DATA | MODIFIES SQL DATA }
09 | SQL SECURITY { DEFINER | INVOKER }
10 | COMMENT 'string'*/
11 BEGIN
12 delete from ss_roles;
13 insert into ss_roles (id,name,descn) values(1,'1','desc1'||now());
14 insert into ss_roles (id,name,descn) values(2,'2','desc2'||now());
15 END$$
16
17 DELIMITER ;
带参数的:
01 DELIMITER $$
02
03 DROP PROCEDURE IF EXISTS `hdssh`.`testProcParam`$$
04
05 CREATE PROCEDURE `hdssh`.`testProcParam`(in tmp varchar(255))
06 /*LANGUAGE SQL
07 | [NOT] DETERMINISTIC
08 | { CONTAINS SQL | NO SQL | READS SQL DATA | MODIFIES SQL DATA }
09 | SQL SECURITY { DEFINER | INVOKER }
10 | COMMENT 'string'*/
11 BEGIN
12 delete from ss_roles;
13 insert into ss_roles (id,name,descn) values(1,'1',tmp);
14 insert into ss_roles (id,name,descn) values(2,'2',tmp);
15 END$$
16
17 DELIMITER ;
上边两个 mysql5下的过程就是向某些表中插入一些数据而已。
接下来就是我方法的调用了
不带参数的调用:
1 try {
2 this.callProcedure("{call hdssh.testProc}", params);
3 } catch (Exception e) {
4 // TODO Auto-generated catch block
5 throw new Exception(e.getMessage());
6 }
带参数的调用
1 List params = new ArrayList();
2 params.add("测试串");
3 this.callProcedure("{call hdssh.testProcParam( )}", param);
将上边的程序整入既有的 系统就完成了从hibernate存储过程的调用
作者:索隆