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存储过程的调用

你可能感兴趣的:(hibernate中调用存储过程)