你好,欢迎来到电脑编程技巧与维护杂志社! 杂志社简介广告服务读者反馈编程社区  
合订本订阅
 
 
您的位置:技术专栏 / Java专栏
hibernate中调用存储过程
 
我搭建的一个ssh1(spring2.5.6+hibernate3.4+struts1.3.8)框架中需要提供一个调用存储过程的公有方法。
   原理:这个其实和ssh没啥关系,主要是我们的java.sql.Connection中已经提供了这样的接口了。我们只是通过hibernate的session来获取我们的Connection而已。
  具体的通用接口编码如下:
 
01 /**
02  * 直接调用存储过程
03  * @param procString
04  * <a href="www.2cto.com" class="referer" target="_blank">@author</a>  kongqz
05  * @throws Exception
06  * @date 2009-03-03
07  * **/
08 public void callProcedure(String procString,List<Object> 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存储过程的调用
  推荐精品文章

·2024年12月目录 
·2024年11月目录 
·2024年10月目录 
·2024年9月目录 
·2024年8月目录 
·2024年7月目录 
·2024年6月目录 
·2024年5月目录 
·2024年4月目录 
·2024年3月目录 
·2024年2月目录 
·2024年1月目录
·2023年12月目录
·2023年11月目录

  联系方式
TEL:010-82561037
Fax: 010-82561614
QQ: 100164630
Mail:gaojian@comprg.com.cn

  友情链接
 
Copyright 2001-2010, www.comprg.com.cn, All Rights Reserved
京ICP备14022230号-1,电话/传真:010-82561037 82561614 ,Mail:gaojian@comprg.com.cn
地址:北京市海淀区远大路20号宝蓝大厦E座704,邮编:100089