hibernate中调用存储过程

   我搭建的一个ssh1(spring2.5.6+hibernate3.4+struts1.3.8)框架中需要提供一个调用存储过程的公有方法。

   原理:这个其实和ssh没啥关系,主要是我们的java.sql.Connection中已经提供了这样的接口了。我们只是通过hibernate的session来获取我们的Connection而已。

  具体的通用接口编码如下:

  /** * 直接调用存储过程 * @param procString * @author kongqz * @throws Exception * @date 2009-03-03 * **/ public void callProcedure(String procString,List<Object> params) throws Exception { CallableStatement stmt = null; try { stmt = this.getSession().connection().prepareCall(procString); if (params != null){ int idx = 1; for (Object obj : params) { if (obj != null) { stmt.setObject(idx, obj); } else { stmt.setNull(idx, Types.NULL); } idx++; } } stmt.execute(); } catch (SQLException e) { e.printStackTrace(); throw new Exception("调用存储过程的时候发生错误[sql = " + procString + "]", e); } }

 

这里我在我的mysql5数据库中创建了两个存储过程:

不带参数的:

DELIMITER $$ DROP PROCEDURE IF EXISTS `hdssh`.`testProc`$$ CREATE PROCEDURE `hdssh`.`testProc`() /*LANGUAGE SQL | [NOT] DETERMINISTIC | { CONTAINS SQL | NO SQL | READS SQL DATA | MODIFIES SQL DATA } | SQL SECURITY { DEFINER | INVOKER } | COMMENT 'string'*/ BEGIN delete from ss_roles; insert into ss_roles (id,name,descn) values(1,'1','desc1'||now()); insert into ss_roles (id,name,descn) values(2,'2','desc2'||now()); END$$ DELIMITER ;

带参数的:

DELIMITER $$ DROP PROCEDURE IF EXISTS `hdssh`.`testProcParam`$$ CREATE PROCEDURE `hdssh`.`testProcParam`(in tmp varchar(255)) /*LANGUAGE SQL | [NOT] DETERMINISTIC | { CONTAINS SQL | NO SQL | READS SQL DATA | MODIFIES SQL DATA } | SQL SECURITY { DEFINER | INVOKER } | COMMENT 'string'*/ BEGIN delete from ss_roles; insert into ss_roles (id,name,descn) values(1,'1',tmp); insert into ss_roles (id,name,descn) values(2,'2',tmp); END$$ DELIMITER ;

上边两个mysql5下的过程就是向某些表中插入一些数据而已。

 

接下来就是我方法的调用了

不带参数的调用:

try { this.callProcedure("{call hdssh.testProc}", params); } catch (Exception e) { // TODO Auto-generated catch block throw new Exception(e.getMessage()); }

带参数的调用

List params = new ArrayList(); params.add("测试串"); this.callProcedure("{call hdssh.testProcParam(?)}", param);

 

将上边的程序整入既有的系统就完成了从hibernate存储过程的调用

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

你可能感兴趣的:(sql,exception,Hibernate,Security,存储,insert)