Spring JdbcTemplate 调用存储过程
遇到调用存储过程的业务,以前有用过,但不是用Spring的 JdbcTemplate去做的,这次是在一个已经有的SpringMVC框架的项目下写处理存储过程的。
参考网络中的方法,在实际操作中遇到两个问题:
1 存储过程的参数问题 ,原本以为只要传对应的入参就可以,即每个入参占用一个?,在报错后检查发现,出参也要占用一个?;
2连接数据库,这个是开始没有注意,但很快就发现了。
完成这个存储过程调用的代码
int param2Value = (Integer ) jdbcTemplate.execute(new CallableStatementCreator()
{
public CallableStatement createCallableStatement(Connection con) throws SQLException
{
String storedProc = sql;// 调用的sql
CallableStatement cs = con.prepareCall(storedProc);
cs.setString(1, obj[0] + "");
cs.setInt(2, Integer.parseInt(obj[1] + ""));
cs.setString(3, obj[2] + "");
cs.setString(4, obj[3] + "");
cs.setString(5, obj[4] + "");
cs.setInt(6, Integer.parseInt(obj[5] + ""));
cs.setLong(7, Long.parseLong(obj[6] + "") );
// 注册输出参数的类型
cs.registerOutParameter(8, OracleTypes.NUMBER);
return cs;
}
}, new CallableStatementCallback()
{
public Object doInCallableStatement(CallableStatement cs) throws SQLException, DataAccessException
{
cs.execute();
return cs.getInt(8);// 获取输出参数的值
}
});
return param2Value;
}
catch (Exception e)
{
e.printStackTrace();
return -1;
}
trycatch 非必须的。
其中 jdbcTemplate要设置其获取oracle数据库的连接,也就是读取配置。
private JdbcTemplate jdbcTemplate;
/**
* 设置数据源
* @param dataSource 数据源对象
* @return void 无返回对象
* @author 邹建松 2014-07-14
*/
@Resource(name="baseDataSource")
public void setJdbcTemplate(DataSource dataSource) {
this.jdbcTemplate = new JdbcTemplate(dataSource);
}
baseDataSource 是配置文件xml里的
以上是有返回参数,即是有出参数的。
没有出参的如下
public void test(){
try
{
this.jdbcTemplate.execute("call p_create_student_test('123')");
}
catch (Exception e)
{
e.printStackTrace();
}
}
还有一种情况就是有结果集的,这种我还没有用过,参考网络的
- public void test() {
- List resultList = (List) jdbcTemplate.execute(
- new CallableStatementCreator() {
- public CallableStatement createCallableStatement(Connection con) throws SQLException {
- String storedProc = "{call sp_list_table(?,?)}";// 调用的sql
- CallableStatement cs = con.prepareCall(storedProc);
- cs.setString(1, "p1");// 设置输入参数的值
- cs.registerOutParameter(2, OracleTypes.CURSOR);// 注册输出参数的类型
- return cs;
- }
- }, new CallableStatementCallback() {
- public Object doInCallableStatement(CallableStatement cs) throws SQLException,DataAccessException {
- List resultsMap = new ArrayList();
- cs.execute();
- ResultSet rs = (ResultSet) cs.getObject(2);// 获取游标一行的值
- while (rs.next()) {// 转换每行的返回值到Map中
- Map rowMap = new HashMap();
- rowMap.put("id", rs.getString("id"));
- rowMap.put("name", rs.getString("name"));
- resultsMap.add(rowMap);
- }
- rs.close();
- return resultsMap;
- }
- });
- for (int i = 0; i < resultList.size(); i++) {
- Map rowMap = (Map) resultList.get(i);
- String id = rowMap.get("id").toString();
- String name = rowMap.get("name").toString();
- System.out.println("id=" + id + ";name=" + name);
- }
- }
还有就是用别的方法调用存储过程,如
public void updateStudentIncludeType(User bean) {
Connection con = getConnection();
CallableStatement csmt = null;
Student student = (Student) bean.getDetails();
try {
/*
* v_student_id in number,--学生ID v_student_name in varchar,--学生姓名
* v_sex in number,--性别 v_student_no in number,--学号 v_duty in
* varchar,--职务 v_phonenumber in varchar,--联系电话 v_school_org_id in
* number,--组织ID v_school_org in number,--组织 v_card_id in
* varchar,--考勤卡号
*/
csmt = con.prepareCall("{CALL P_MODIFY_STUDENT_AND_TYPE(?,?,?,?,?,?,?,?,?,?,?)}");
csmt.setLong(1, student.getUserId());
csmt.setString(2, student.getStudentName());
csmt.setLong(3, student.getSex());
csmt.setString(4, student.getStudentNo());
csmt.setString(5, student.getDuty());
csmt.setString(6, student.getLinkDn());
csmt.setLong(7, student.getOrgId());
csmt.setLong(8, Long.parseLong(student.getSchool_id()));
csmt.setString(9, student.getCard());
csmt.setInt(10, student.getStudentType());
csmt.registerOutParameter(11, Types.INTEGER);
csmt.executeUpdate();
if (csmt.getInt(11) == 1) {
throw new DaoException("修改学生信息失败!");
}
if (csmt.getInt(11) == 2) {
throw new DaoException("考勤卡号重复,请重输!");
}
if (csmt.getInt(11) == 3) {
throw new DaoException("学生学号重复,请重输!");
}
} catch (SQLException e) {
throw new DaoException("系统维护中,请稍后再试!", e);
} finally {
JdbcUtils.closeStatement(csmt);
closeConnectionIfNecessary(con);
}
}
用到jar包
Spring JdbcTemplate 调用存储过程的更多相关文章
- spring jdbctemplate调用存储过程,返回list对象
注:本文来源于< spring jdbctemplate调用存储过程,返回list对象 > spring jdbctemplate调用存储过程,返回list对象 方法: /** * 调用 ...
- Spring如何使用JdbcTemplate调用存储过程的三种情况
注:原文 <Spring如何使用JdbcTemplate调用存储过程的三种情况 > Spring的SimpleJdbcTemplate将存储过程的调用进行了良好的封装,下面列出使用Jdbc ...
- jdbcTemplate 调用存储过程。 入参 array 返回 cursor
注:本文来源< jdbcTemplate 调用存储过程. 入参 array 返回 cursor > 需求: java传入一个list object.从数据库找到相关的数据并返回. ...
- Spring JDBC调用存储过程
以下示例将演示spring jdbc如何调用存储过程.将通过调用存储过程来读取Student表中的一个可用记录.将传递一个学生ID并获取学生记录信息. 语法: SimpleJdbcCall jdbcC ...
- spring jdbcTemplate 操作存储过程
Spring的SimpleJdbcTemplate将存储过程的调用进行了良好的封装,下面列出使用JdbcTemplate调用Oracle存储过程的三种情况: 一.无返回值的存储过程调用 1.存储过程代 ...
- 解决Spring JdbcTemplate调用queryForObject()方法结果集为空时报异常
JdbcTemplate用的时候发现一个问题:调用queryForObject()方法,如果没有查到东西则会抛一个异常:org.springframework.dao.EmptyResultDataA ...
- spring heibernate 调用存储过程
一:参考网址 http://sunbin123.iteye.com/blog/1007556 二:示例 @Autowired @Qualifier("jdbcTemplate") ...
- spring jdbctemplate调用procedure(返回游标)
package cn.com.git.htsc.uac.core.repository.report; import cn.com.git.htsc.uac.core.api.dto.report.R ...
- jdbctemplate 调用oracle 有返回(会话型临时表数据的)结果的存储过程
注:本文为博主 原创. jdbctemplate 调用oracle存储过程 事务 临时表 有返回结果 1:java 代码 本逻辑代码本是想把 java 代码里的list<Strign>类 ...
随机推荐
- .NET 配置项扩展
using System; using System.Configuration; namespace ConsoleApplication3 { /* web.config 或 app.config ...
- html5 canvas画不出图像的原因
很久没写博客了,今年过年的时候,家里出了意外,现在心里依然很难受.6月份之前一直忙着写毕业论文,答辩完6月初回公司继续上班,今天刚好周末有空,就写下之前碰到一个问题. 做一个图像查看器(基于Chrom ...
- C++ MFC打开文件的流程
打开文件的步骤如下: 弹出打开文件对话框 -> 获取选择的文件,并将文件显示在视图中. 我们程序中经常需要定制的操作如下: 1. 定制弹出的文件对话框,例如需要修改打开文件的类型或扩展名 2. ...
- git操作日志
切换分支 git checkout plugin 更新文件 git pull origin master 合并分支 主分支合并到分支 git checkout dev_2 git merge mast ...
- Git保存密码
TortoiseGit中,通过https方式连接时,默认是不会保存帐号密码,需要我们每次输入一次,真心很麻烦! 通过简单的设置,就可以解决这一问题! 编辑仓库目录中本地的”.git/config”文件 ...
- modelsim搭建uvm环境及实例
Modelsim SE-64 10.2c 自带编译好的uvm-1.1d 脚本new_run.do set UVM_DPI_HOME C:/modeltech64_10.2c/uvm-1.1d/win6 ...
- [问题解决]《GPU高性能编程CUDA实战》中第4章Julia实例“显示器驱动已停止响应,并且已恢复”问题的解决方法
以下问题的出现及解决都基于"WIN7+CUDA7.5". 问题描述:当我编译运行<GPU高性能编程CUDA实战>中第4章所给Julia实例代码时,出现了显示器闪动的现象 ...
- 转载:shell脚本之sed使用----替换、变量、转义字符
sed替换的基本语法为:----s后面跟的是分隔符,原字符串可使用.*这种正则表达式进行整行替换 代码如下: sed 's/原字符串/替换字符串/' 单引号里面,s表示替换,三根斜线中间是替换的样式, ...
- C# WinForm 中 MessageBox的使用详解
1.C# WinForm 中 MessageBox的使用详解:http://www.cnblogs.com/bq-blog/archive/2012/07/27/2611810.html
- Linux cp命令使用说明
Linux cp命令使用说明 --功能说明:复制目录或文件 --命令格式:cp [参数] <文件或目录> <文件或目录> --常用参数: -R 复制目录 -i 覆盖文件之 ...