我搭建的一個ssh1(spring2.5.6+hibernate3.4+struts1.3.8)框架中須要提供一個調用存儲過程的公有方法。java
原理:這個其實和ssh沒啥關係,主要是咱們的java.sql.Connection中已經提供了這樣的接口了。咱們只是經過hibernate的session來獲取咱們的Connection而已。mysql
具體的通用接口編碼以下:spring
/** * 直接調用存儲過程 * @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數據庫中建立了兩個存儲過程:sql
不帶參數的:數據庫
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下的過程就是向某些表中插入一些數據而已。session
接下來就是我方法的調用了框架
不帶參數的調用:ssh
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存儲過程的調用