spring中JdbcTemplate操作oracle的存储过程实例代码

 更新时间:2023年04月14日 10:31:57   作者:zhangbeizhen18  
JdbcTemplate是Spring对JDBC的封装,目的是使JDBC更加易于使用,JdbcTemplate是Spring的一部分,下面这篇文章主要给大家介绍了关于spring中JdbcTemplate操作oracle的存储过程的相关资料,需要的朋友可以参考下

场景:

使用java代码调用oracle的存储过程,本例使用JdbcTemplate模板类操作.

功能:

方便后续查阅.

1.JdbcTemplate调用存储过程(Procedure)不带返回值

1.1存储过程

CREATE OR REPLACE PROCEDURE PRO_QUERY_INFO_ARGS4(TASK_ID IN NUMBER) IS
BEGIN
  INSERT INTO F_LOG_INFO
    (TASK_ID,
     BEGIN_TIME,
     END_TIME,
     FLAG,
     FAIL_INFO,
     DATA_COUNT,
     TABLE_NAME)
  VALUES
    (TASK_ID, SYSDATE - 1, SYSDATE, '999', '999', 999, 'TABLE_NAME2019');
  COMMIT;
EXCEPTION
  WHEN OTHERS THEN
    ROLLBACK;
END PRO_QUERY_INFO_ARGS4;

1.2代码

public static void doProcedures() {
	String procedures = "{call PRO_QUERY_INFO_ARGS4 ('888')}";
	jdbcTemplate.execute(procedures);
}

2.JdbcTemplate调用存储过程(Procedure)带返回值但值不是集合类型

2.1存储过程

CREATE OR REPLACE PROCEDURE PRO_QUERY_INFO_ARGS3(ARGS     IN VARCHAR2,
                                                 RTNINFO  OUT VARCHAR2,
                                                 ERRORMSG OUT VARCHAR2,
                                                 FAILINFO OUT VARCHAR2) IS
BEGIN
  ERRORMSG := '';
  RTNINFO  := '你输入的ARGS=' || ARGS;
  SELECT FAIL_INFO INTO FAILINFO FROM F_LOG_INFO where TASK_ID = 1;
  COMMIT;
EXCEPTION
  WHEN OTHERS THEN
    ERRORMSG := 'PRO_QUERY_INFO_ARG抛出异常: ' || SQLERRM;
END PRO_QUERY_INFO_ARGS3;

2.2代码

public static void getProceduresResult() {
  String tt2 = (String) jdbcTemplate.execute(
  new CallableStatementCreator() {
  	public CallableStatement createCallableStatement(
  	  	Connection con) throws SQLException {
  	  String procedures = "{call PRO_QUERY_INFO_ARGS3 (?,?,?,?)}";
  	  CallableStatement cs = con.prepareCall(procedures);
  	  /** 设置输入参数的值 */
  	  cs.setString(1, "代码调用");
  	  /** 注册输出参数的类型-此处集合为oracle的VARCHAR2 */
  	  cs.registerOutParameter(2, OracleTypes.VARCHAR);
  	  cs.registerOutParameter(3, OracleTypes.VARCHAR);
  	  cs.registerOutParameter(4, OracleTypes.VARCHAR);
  	  return cs;
  	}
  }, new CallableStatementCallback() {
  	public Object doInCallableStatement(CallableStatement st)
  	  	throws SQLException, DataAccessException {
  	  st.execute();
  	  /** 依次获取存储过程参数值,按照顺序存储过程定义参数的顺序获取 */
  	  Object tt2 = st.getObject(2);
  	  Object tt3 = st.getObject(3);
  	  Object tt4 = st.getObject(4);
  	  return tt2;
  	}
	});
}

3.JdbcTemplate调用存储过程(Procedure)带返回值且值集合类型

3.1存储过程

CREATE OR REPLACE PROCEDURE PRO_QUERY_INFO_ARGS2(ERRORMSG OUT VARCHAR2,
                                                 CURINFO  OUT SYS_REFCURSOR) IS
BEGIN
  ERRORMSG := '';
  OPEN CURINFO FOR
    SELECT FAIL_INFO, TABLE_NAME FROM F_LOG_INFO;
  COMMIT;
EXCEPTION
  WHEN OTHERS THEN
    ERRORMSG := 'PRO_QUERY_INFO_ARG2抛出异常: ' || SQLERRM;
END PRO_QUERY_INFO_ARGS2;

3.2代码

public static List getProceduresResultList() {
 
 List resultList = (List) jdbcTemplate.execute(
  new CallableStatementCreator() {
  	public CallableStatement createCallableStatement(
  	  	Connection conn) throws SQLException {
  	  /** 调用指定存储过程 */
  	  String procedures = "{ CALL PRO_QUERY_INFO_ARGS2(?,?) }";
  	  CallableStatement statement = conn
  	  		.prepareCall(procedures);
  	  /** 注册输出参数的类型-此处集合为oracle的VARCHAR2 */
  	  statement.registerOutParameter(1, OracleTypes.VARCHAR);
  	  /** 注册输出参数的类型-此处集合为oracle的游标类型 */
  	  statement.registerOutParameter(2, OracleTypes.CURSOR);
  	  return statement;
  	}
  }, new CallableStatementCallback() {
  	public Object doInCallableStatement(
  	  	CallableStatement statement) throws SQLException,
  	  	DataAccessException {
  	  List resultsMap = new ArrayList();
  	  statement.execute();
  	  /** 获取游标结果集-此处2是存储过程参数顺序 */
  	  ResultSet resultSet = (ResultSet) statement
  	  		.getObject(2);
  	  /** 转换每行的返回值到Map中 */
  	  while (resultSet.next()) {
  	  	Map rowMap = new HashMap();
  	  	rowMap.put("FAIL_INFO",
  	  			resultSet.getObject("FAIL_INFO"));
  	  	rowMap.put("TABLE_NAME",
  	  			resultSet.getObject("TABLE_NAME"));
  	  	resultsMap.add(rowMap);
  	  }
  	  resultSet.close();
  	  return resultsMap;
  	}
  });
 return resultList;
}

4.附本例使用建表语句

create table F_LOG_INFO
(
  task_id    NUMBER(16) not null,
  begin_time DATE,
  end_time   DATE,
  flag       VARCHAR2(8),
  fail_info  VARCHAR2(512),
  data_count NUMBER(16),
  table_name VARCHAR2(256)
);
alter table F_LOG_INFO
  add constraint PK_F_LOG_INFO primary key (TASK_ID);

5.附本例使用完整测试代码

public class TestProcedures {
public static JdbcTemplate jdbcTemplate = getJdbcTemplate();
public static void main(String[] args) {
 System.out.println("测试开始......");
 // getProceduresResult();
 doProcedures();
 List result = getProceduresResultList();
 for (int i = 0; i < result.size(); i++) {
  Map rowMap = (Map) result.get(i);
  String id = rowMap.get("FAIL_INFO").toString();
  String name = rowMap.get("TABLE_NAME").toString();
  System.out.println("FAIL_INFO=" + id + ";TABLE_NAME=" + name);
 }
 System.out.println("测试结束......");
}
/**
 * 执行存储过程无返回值
 * */
public static void doProcedures() {
	String procedures = "{call PRO_QUERY_INFO_ARGS4 ('888')}";
	jdbcTemplate.execute(procedures);
}
/**
 * 调用存储过程-返回值是非集合
 * */
public static void getProceduresResult() {
 String tt2 = (String) jdbcTemplate.execute(
  new CallableStatementCreator() {
  	public CallableStatement createCallableStatement(
  	 	Connection con) throws SQLException {
  	 String procedures = "{call PRO_QUERY_INFO_ARGS3 (?,?,?,?)}";
  	 CallableStatement cs = con.prepareCall(procedures);
  	 /** 设置输入参数的值 */
  	 cs.setString(1, "代码调用");
  	 /** 注册输出参数的类型-此处集合为oracle的VARCHAR2 */
  	 cs.registerOutParameter(2, OracleTypes.VARCHAR);
  	 cs.registerOutParameter(3, OracleTypes.VARCHAR);
  	 cs.registerOutParameter(4, OracleTypes.VARCHAR);
  	 return cs;
  	}
  }, new CallableStatementCallback() {
  	public Object doInCallableStatement(CallableStatement st)
  	 	throws SQLException, DataAccessException {
  	 st.execute();
  	 /** 依次获取存储过程参数值,按照顺序存储过程定义参数的顺序获取 */
  	 Object tt2 = st.getObject(2);
  	 Object tt3 = st.getObject(3);
  	 Object tt4 = st.getObject(4);
  	 return tt2;
  	}
  });
}
/**
 * 调用存储过程-返回值是List集合
 * */
public static List getProceduresResultList() {
  List resultList = (List) jdbcTemplate.execute(
   new CallableStatementCreator() {
   	public CallableStatement createCallableStatement(
   	 	Connection conn) throws SQLException {
   	 /** 调用指定存储过程 */
   	 String procedures = "{ CALL PRO_QUERY_INFO_ARGS2(?,?) }";
   	 CallableStatement statement = conn
   	 		.prepareCall(procedures);
   	 /** 注册输出参数的类型-此处集合为oracle的VARCHAR2 */
   	 statement.registerOutParameter(1, OracleTypes.VARCHAR);
   	 /** 注册输出参数的类型-此处集合为oracle的游标类型 */
   	 statement.registerOutParameter(2, OracleTypes.CURSOR);
   	 return statement;
   	}
   }, new CallableStatementCallback() {
   	public Object doInCallableStatement(
   	 	CallableStatement statement) throws SQLException,
   	 	DataAccessException {
   	 List resultsMap = new ArrayList();
   	 statement.execute();
   	 /** 获取游标结果集-此处2是存储过程参数顺序 */
   	 ResultSet resultSet = (ResultSet) statement
   	 		.getObject(2);
   	 /** 转换每行的返回值到Map中 */
   	 while (resultSet.next()) {
   	 	Map rowMap = new HashMap();
   	 	rowMap.put("FAIL_INFO",
   	 			resultSet.getObject("FAIL_INFO"));
   	 	rowMap.put("TABLE_NAME",
   	 			resultSet.getObject("TABLE_NAME"));
   	 	resultsMap.add(rowMap);
   	 }
   	 resultSet.close();
   	 return resultsMap;
   	}
   });
  return resultList;
}
/** 获取JdbcTemplate数据源 */
public static JdbcTemplate getJdbcTemplate() {
  DruidDataSource dataSource = new DruidDataSource();
  /**数据库连接信息*/
  String username = "demodb";
  String password = "123456";
  String jdbcUrl = "jdbc:oracle:thin:@127.0.0.1:1521/orcl";
  String driverName = "oracle.jdbc.OracleDriver";
  /** 设置数据源属性参数 */
  dataSource.setPassword(password);
  dataSource.setUrl(jdbcUrl);
  dataSource.setUsername(username);
  dataSource.setDriverClassName(driverName);
  /** 获取spring的JdbcTemplate*/
  JdbcTemplate jdbcTemplate = new JdbcTemplate();
  /** 设置数据源 */
  jdbcTemplate.setDataSource(dataSource);
  return jdbcTemplate;
}
}

以上,感谢.

总结

到此这篇关于spring中JdbcTemplate操作oracle的存储过程的文章就介绍到这了,更多相关JdbcTemplate操作oracle存储过程内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Scala之文件读取、写入、控制台操作的方法示例

    Scala之文件读取、写入、控制台操作的方法示例

    这篇文章主要介绍了Scala之文件读取、写入、控制台操作的方法示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-06-06
  • Windows 下安装配置 Eclipse详细教程

    Windows 下安装配置 Eclipse详细教程

    Eclipse是一款非常优秀的开源IDE,非常适合Java开发,由于支持插件技术,受到了越来越多的开发者的欢迎。配合众多令人眼花缭乱的插件,完全可以满足从企业级Java应用到手机终端Java游戏的开发。本文将带您手把手步入Eclipse的广阔天地
    2016-09-09
  • SpringBoot实现二维码扫码登录的原理及项目实践

    SpringBoot实现二维码扫码登录的原理及项目实践

    本文主要介绍了SpringBoot实现二维码扫码登录的原理及项目实践,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-04-04
  • Spring中@PathVariable和@RequestParam注解的用法区别

    Spring中@PathVariable和@RequestParam注解的用法区别

    这篇文章主要介绍了Spring中@PathVariable和@RequestParam注解的用法区别,@PathVariable 是 Spring 框架中的一个注解,用于将 URL 中的变量绑定到方法的参数上,它通常用于处理 RESTful 风格的请求,从 URL 中提取参数值,并将其传递给方法进行处理,需要的朋友可以参考下
    2024-01-01
  • Spring与MyBatis集成 AOP整合PageHelper插件的操作过程

    Spring与MyBatis集成 AOP整合PageHelper插件的操作过程

    Spring与MyBatis集成的主要目的是为了提供更强大的数据访问和事务管理能力,以及简化配置和提高开发效率,这篇文章主要介绍了Spring与MyBatis集成AOP整合PageHelper插件,需要的朋友可以参考下
    2023-08-08
  • SpringBoot2使用WebFlux函数式编程的方法

    SpringBoot2使用WebFlux函数式编程的方法

    这篇文章主要介绍了SpringBoot2使用WebFlux函数式编程的方法,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-08-08
  • 自己写的java日志类和方法代码分享

    自己写的java日志类和方法代码分享

    这篇文章主要介绍了一个自己写的java日志类和方法,下面把代码分享给大家
    2014-01-01
  • MyBatis测试报错:Cannot determine value type from string 'xxx'的解决办法

    MyBatis测试报错:Cannot determine value type from string &a

    这篇文章主要给大家介绍了关于MyBatis测试报错:Cannot determine value type from string 'xxx'的解决办法,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
    2023-02-02
  • Springboot 自定义校验代码实例

    Springboot 自定义校验代码实例

    这篇文章主要介绍了Springboot 自定义校验代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-11-11
  • SpringMVC + jquery.uploadify实现上传文件功能

    SpringMVC + jquery.uploadify实现上传文件功能

    文件上传是很多项目都会使用到的功能,SpringMVC当然也提供了这个功能。不过小编不建议在项目中通过form表单来提交文件上传,这样做的局限性很大。下面这篇文章主要介绍了利用SpringMVC + jquery.uploadify实现上传文件功能的相关资料,需要的朋友可以参考下。
    2017-06-06

最新评论