`
fancy888
  • 浏览: 38487 次
  • 性别: Icon_minigender_1
  • 来自: 大连
文章分类
社区版块
存档分类
最新评论

使用JdbcTemplate调用数据库存储过程

阅读更多

      使用Jdbc调用存储过程相信大多数朋友在开发过程中都会用到,本例使用一个工具类将调用存储过程的方法封装起来,隐藏了大部分的处理逻辑,使用起来还是很方便的。

 

package com.coolfancy;

import java.math.BigDecimal;
import java.sql.CallableStatement;
import java.sql.Connection;
import java.sql.Date;
import java.sql.SQLException;
import java.sql.Types;
import java.util.ArrayList;
import java.util.List;

import javax.sql.DataSource;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.dao.DataAccessException;
import org.springframework.jdbc.core.ConnectionCallback;
import org.springframework.jdbc.core.support.JdbcDaoSupport;
import org.springframework.stereotype.Service;

@Service
public class ProcedureUtil extends JdbcDaoSupport {

	@Autowired
	public void setter(DataSource dataSource) {
		super.setDataSource(dataSource);
	}

	/**
	 * <p>
	 * 调用存储过程。
	 * </p>
	 * <p>
	 * 输入参数可识别的数据类型为String、Long、BigDecimal和Date,识别三种特殊类型的入参:
	 * <ul>
	 * <li>"varcharnull"表示Null值的VARCHAR型入参;
	 * <li>"numbernull"表示Null值的Number型入参;
	 * <li>"datenull"表示Null值的Date型入参。
	 * </ul>
	 * </p>
	 * <p>
	 * 输出参数的类型用字符串表示,识别的三种值:
	 * <ul>
	 * <li>"varchar"表示VARCHAR型出参;
	 * <li>"number"表示Number型出参;
	 * <li>"date"表示Date型出参。
	 * </ul>
	 * </p>
	 * <p>
	 * 
	 * @author coolfancy
	 * @param proName
	 *            存储过程名称。
	 * @param paraIn
	 *            输入参数。
	 * @param _paraOutType
	 *            输出参数的类型,传入Null表示没有返回值。
	 * @return 存储过程的返回值。
	 */
	public List<Object> executeProcedure(final String proName, final Object[] paraIn, final String[] _paraOutType) {
		final int len = _paraOutType == null ? 0 : _paraOutType.length;
		final int[] paraOutType = new int[len];
		for (int i = 0; i < len; i++) {
			if ("varchar".equalsIgnoreCase(_paraOutType[i]))
				paraOutType[i] = Types.VARCHAR;
			else if ("number".equalsIgnoreCase(_paraOutType[i]))
				paraOutType[i] = Types.FLOAT;
			else if ("date".equalsIgnoreCase(_paraOutType[i]))
				paraOutType[i] = Types.DATE;
		}
		paraOutType[len] = Types.FLOAT;
		paraOutType[len + 1] = Types.VARCHAR;
		return  getJdbcTemplate().execute(new ConnectionCallback<List<Object>>() {
			public List<Object> doInConnection(Connection conn) throws SQLException, DataAccessException {
				final List<Object> returnObjs = new ArrayList<Object>();
				final StringBuffer procedureName = new StringBuffer("{call ").append(proName).append("(");
				for (int i = 0; i < paraIn.length + len; i++) {
					if (i == paraIn.length + len - 1)
						procedureName.append("?)}");
					else
						procedureName.append("?,");
				}
				final CallableStatement proc = conn.prepareCall(procedureName.toString());
				for (int i = 1; i <= paraIn.length; i++) {
					final Object para_obj = paraIn[i - 1];
					if (para_obj == null || para_obj.equals("varcharnull")) {
						proc.setNull(i, Types.VARCHAR);
					} else if (para_obj.equals("numbernull")) {
						proc.setNull(i, Types.FLOAT);
					} else if (para_obj.equals("datenull")) {
						proc.setNull(i, Types.DATE);
					} else if (para_obj instanceof String) {
						proc.setString(i, (String) para_obj);
					} else if (para_obj instanceof BigDecimal) {
						proc.setBigDecimal(i, (BigDecimal) para_obj);
					} else if (para_obj instanceof Date) {
						proc.setDate(i, (Date) para_obj);
					} else if (para_obj instanceof Long) {
						proc.setLong(i, ((Long) para_obj).longValue());
					} else {
						throw new RuntimeException("执行存储过程" + proName + "]时发生错误:");
					}
				}
				for (int i = paraIn.length + 1; i <= paraIn.length + paraOutType.length; i++)
					proc.registerOutParameter(i, paraOutType[i - paraIn.length - 1]);
				try {
					proc.execute();
					for (int i = 1; i <= paraOutType.length; i++)
						returnObjs.add(proc.getObject(i + paraIn.length));
				} finally {
					proc.close();
				}
				return returnObjs;
			}
		});
	}

}

 

      更多精彩原创文章请关注笔者的原创博客:http://www.coolfancy.com

 

0
0
分享到:
评论

相关推荐

    Spring JdbcTemplate调用Oracle存储过程实现CRUD

    Spring JdbcTemplate调用Oracle存储过程输出游标结果集实现增删改查

    Spring JdbcTemplate 调用 Oracle 存储过程 与 Oracle 驱动下载

    1、关于 JdbcTemplate 的介绍、pom 依赖、DI 注入可以参考《Spring JdbcTemplate 模板剖析 之 常用 增删改查》,本文继续介绍 JdbcTemplate 调用数据库的存储过程,虽然 Mysql 也有存储过程,但是为了尽可能的多覆盖...

    Spring中文帮助文档

    使用SimpleJdbcCall调用存储过程 11.5.6. 声明SimpleJdbcCall使用的参数 11.5.7. 如何定义SqlParameters 11.5.8. 使用SimpleJdbcCall调用内置函数 11.5.9. 使用SimpleJdbcCall返回的ResultSet/REF Cursor 11.6...

    Spring.3.x企业应用开发实战(完整版).part2

    11.6.3 使用StoredProcedure执行存储过程 11.6.4 SqlFunction类 11.7 小结 第12章 整合其他ORM框架 12.1 Spring整合ORM技术 12.2 在Spring中使用Hibernate 12.2.1 配置SessionFactory 12.2.2 使用HibernateTemplate ...

    Spring3.x企业应用开发实战(完整版) part1

    11.6.3 使用StoredProcedure执行存储过程 11.6.4 SqlFunction类 11.7 小结 第12章 整合其他ORM框架 12.1 Spring整合ORM技术 12.2 在Spring中使用Hibernate 12.2.1 配置SessionFactory 12.2.2 使用HibernateTemplate ...

    Spring API

    使用SimpleJdbcCall调用存储过程 11.5.6. 声明SimpleJdbcCall使用的参数 11.5.7. 如何定义SqlParameters 11.5.8. 使用SimpleJdbcCall调用内置函数 11.5.9. 使用SimpleJdbcCall返回的ResultSet/REF Cursor 11.6...

    Spring高级之注解驱动开发视频教程

    合集中的每一项都是针对不同数据存储做的简化封装,使我们在操作不同数据库时,以最简洁的代码完成需求功能。 SpringTest它是针对Junit单元测试的整合。让我们在开发中以及开发后期进行测试时,直接使用Junit结合...

    Java Web程序设计教程

    13.2.2通过jdbcdaosupport使用jdbctemplate 263 13.2.3jdbctemplate提供的常用数据操作方法 264 13.3spring中的事务处理 265 13.3.1spring事务处理概述 266 13.3.2编程式事务处理 266 13.3.3声明式事务处理 ...

Global site tag (gtag.js) - Google Analytics