hibernate中調用存儲過程

我搭建的一個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存儲過程的調用
相關文章
相關標籤/搜索