使用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
分享到:
相关推荐
使用 Spring JdbcTemplate 调用 Oracle 存储过程实现 CRUD 在本文中,我们将讨论如何使用 Spring JdbcTemplate 调用 Oracle 存储过程来实现 CRUD(Create、Read、Update、Delete)操作。我们将首先编写 Oracle 存储...
本文将通过分析一个Java程序调用数据库存储过程的具体实例来探讨如何有效地调用存储过程,并解释其中涉及的关键概念和技术细节。 #### 二、存储过程调用的基本原理 存储过程是存储在数据库中的SQL代码块,它可以...
2. **模板方法模式**:JdbcTemplate采用了设计模式中的模板方法模式,预先定义了一系列数据库操作的基本步骤,如执行SQL查询、更新、调用存储过程等,用户只需关注具体的SQL语句和参数即可。 3. **事务管理**:...
标题中的“Spring+Jdbc scott用户的调用存储过程”涉及到的是在Java开发中使用Spring框架的JDBC模块来调用数据库的存储过程。在Java应用程序中,Spring JDBC提供了一个简单且有效的方式来处理数据库交互,包括执行...
无论是查询、插入还是调用存储过程,`jdbcTemplate`都能提供简洁且安全的API,使得数据库操作变得更加便捷。在实际开发中,结合自定义的映射器和回调处理器,我们可以构建出高效且灵活的数据库访问层。
接着,调用存储过程:在SpringBoot应用中,你可以使用JdbcTemplate或者NamedParameterJdbcTemplate来调用存储过程。例如,使用JdbcTemplate执行上面创建的存储过程: ```java @Autowired private JdbcTemplate ...
3. **调用`JdbcTemplate`**:使用`JdbcTemplate`的`callProcedure()`或`execute()`方法执行存储过程,传入`SplitPageResultSetExtractor`实例作为参数。 4. **处理结果**:`ResultSetExtractor`会在内部维护当前页...
SpringJdbcTemplate是一个模板类,它提供了大量的方法来执行SQL查询、更新、存储过程等操作。这些方法会自动处理JDBC相关的资源关闭、异常转换等细节,使得代码更加整洁和健壮。 2. **数据库自适应** Spring...
Spring JdbcTemplate提供了一个面向对象的接口,用于执行SQL查询、更新和存储过程,避免了直接与JDBC API打交道的繁琐工作。它通过异常处理、事务管理以及结果集的自动处理,简化了数据库访问。基于注解的Spring ...
4. **SQL执行**:支持多种方式执行SQL,包括查询、更新、调用存储过程等。 5. **参数绑定**:通过占位符的方式安全地绑定参数,防止SQL注入。 6. **结果集处理**:提供了多种结果集转换方式,如List、Map、单个...
4. 存储过程调用:JdbcTemplate也支持调用存储过程,通过`call()`方法,传入CallableStatementCreator和SqlParameterSource对象。 四、事务管理 JdbcTemplate默认不处理事务,但可以通过配合...
结合Spring和Hibernate,你可以在Spring的Service层使用Hibernate的Session来调用存储过程,或者在Repository层通过JdbcTemplate或NamedParameterJdbcTemplate进行调用。具体选择哪种方式取决于你的项目结构和需求。...
`JdbcUtils.java`可能是提供了一些数据库连接和JdbcTemplate使用的辅助方法,如数据库连接池的配置,或者封装了JdbcTemplate的执行方法,以提高代码复用性。例如: ```java public class JdbcUtils { private ...
7. **编写DAO**:使用JdbcTemplate或JPA的Repository接口进行数据库操作,注解方法执行SQL。 8. **实现业务逻辑**:创建Service层,使用`@Autowired`注入DAO,实现业务逻辑。 9. **创建Controller**:创建`@...
JdbcTemplate的主要功能包括执行SQL查询、更新、存储过程,以及事务管理。 JdbcTemplate的工作原理主要包括以下几个步骤: 1. 创建DataSource:DataSource是JDBC规范中的一个接口,用于获取数据库连接。Spring框架...
在本案例中,开发者可能使用了如Redis或 Ehcache等内存缓存技术,先将数据库查询结果存储在缓存中,然后在索引更新时,先从缓存读取数据,而不是直接从数据库读取。这样既提高了效率,也降低了对数据库的压力。 当...
- `call`:用于执行存储过程调用。 通过这些方法,开发者可以轻松地进行数据库操作,无需关注底层的资源管理和异常处理,从而提高了开发效率和代码质量。 总之,Spring-JdbcTemplate通过其简洁的API和强大的功能,...