读书人

Hibernate调用施行存储过程

发布时间: 2012-11-13 10:00:51 作者: rapoo

Hibernate调用执行存储过程

??? 项目中需要采用存储过程使用代码:

?

/**
? * 执行存储过程的方法(存储过程仅仅支持输入参数的使用,并且无返回值的以后扩展信息)
? *
? * @param procedureName
? *??????????? 存储过程的名称
? * @param paramList
? *??????????? 备注:Map<String, Object> paramList 其中String 参数: Object输入的参数对象
? *??????????? 存储过程参数的信息
? */
?public void executeProcedure(String procedureName, final Map<String, Object> paramList) {
??if (StringUtils.isNotBlank(procedureName)) {
???int length = 0;
???if (MapUtils.isNotEmpty(paramList)) {
????length = paramList.size();
???}
???final String executeProcedure = generationExcuteProdure(procedureName, length);
???this.getHibernateTemplate().execute(new HibernateCallback() {
????@SuppressWarnings("deprecation")
????@Override
????public Object doInHibernate(Session session) throws HibernateException, SQLException {
?????boolean flag = false;
?????Transaction trans = session.beginTransaction();
?????try {
??????CallableStatement cstmt = session.connection().prepareCall(executeProcedure);
??????if (MapUtils.isNotEmpty(paramList)) {
???????Set<Entry<String, Object>> entrys = paramList.entrySet();
???????for (Entry<String, Object> entry : entrys) {
????????cstmt.setObject(entry.getKey(), entry.getValue());
???????}
??????}
??????flag = cstmt.execute();
??????trans.commit();
?????} catch (RuntimeException e) {
??????trans.rollback();
??????flag = false;
??????logger.error(e);
?????}
?????return flag;
????}
???});
??} else {
???throw new RuntimeException(" the procedureName is not null!");
??}
?}

?

?

?/**
? * 生成存储过程的方法
? *
? * @param procedureName
? *??????????? 存储过程的名称
? * @param length
? *??????????? 参数的个数
? * @return 生成的执行的存储过程
? */
?private String generationExcuteProdure(String procedureName, int length) {
??StringBuilder sql = new StringBuilder();
??sql.append("{ call ");
??sql.append(StringUtils.trim(procedureName));
??if (length > 0) {
???sql.append("(");
???for (int i = 0; i < length; i++) {
????sql.append("?");
????if (i != length - 1) {
?????sql.append(",");
????}
???}
???sql.append(")");
??}
??sql.append("}");
??logger.info("executeProcedure", sql.toString());
??return sql.toString();
?}

?

备注:项目中采用注解希望大家指点一下,有没有更加简单的方法或采用注解方式:

@SQLInsert,@SQLUpdate,怎么使用希望大家拍砖!!

好像可以但是不知道怎么使用?请教高人支持!!!!

读书人网 >软件架构设计

热点推荐