spring中JdbcTemplate操作oracle的存儲過程實例代碼
更新時間:2023年04月14日 10:31:57 作者:zhangbeizhen18
JdbcTemplate是Spring對JDBC的封裝,目的是使JDBC更加易于使用,JdbcTemplate是Spring的一部分,下面這篇文章主要給大家介紹了關(guān)于spring中JdbcTemplate操作oracle的存儲過程的相關(guān)資料,需要的朋友可以參考下
場景:
使用java代碼調(diào)用oracle的存儲過程,本例使用JdbcTemplate模板類操作.
功能:
方便后續(xù)查閱.
1.JdbcTemplate調(diào)用存儲過程(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調(diào)用存儲過程(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); /** 設置輸入?yún)?shù)的值 */ cs.setString(1, "代碼調(diào)用"); /** 注冊輸出參數(shù)的類型-此處集合為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(); /** 依次獲取存儲過程參數(shù)值,按照順序存儲過程定義參數(shù)的順序獲取 */ Object tt2 = st.getObject(2); Object tt3 = st.getObject(3); Object tt4 = st.getObject(4); return tt2; } }); }
3.JdbcTemplate調(diào)用存儲過程(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 { /** 調(diào)用指定存儲過程 */ String procedures = "{ CALL PRO_QUERY_INFO_ARGS2(?,?) }"; CallableStatement statement = conn .prepareCall(procedures); /** 注冊輸出參數(shù)的類型-此處集合為oracle的VARCHAR2 */ statement.registerOutParameter(1, OracleTypes.VARCHAR); /** 注冊輸出參數(shù)的類型-此處集合為oracle的游標類型 */ statement.registerOutParameter(2, OracleTypes.CURSOR); return statement; } }, new CallableStatementCallback() { public Object doInCallableStatement( CallableStatement statement) throws SQLException, DataAccessException { List resultsMap = new ArrayList(); statement.execute(); /** 獲取游標結(jié)果集-此處2是存儲過程參數(shù)順序 */ ResultSet resultSet = (ResultSet) statement .getObject(2); /** 轉(zhuǎn)換每行的返回值到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("測試結(jié)束......"); } /** * 執(zhí)行存儲過程無返回值 * */ public static void doProcedures() { String procedures = "{call PRO_QUERY_INFO_ARGS4 ('888')}"; jdbcTemplate.execute(procedures); } /** * 調(diào)用存儲過程-返回值是非集合 * */ 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); /** 設置輸入?yún)?shù)的值 */ cs.setString(1, "代碼調(diào)用"); /** 注冊輸出參數(shù)的類型-此處集合為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(); /** 依次獲取存儲過程參數(shù)值,按照順序存儲過程定義參數(shù)的順序獲取 */ Object tt2 = st.getObject(2); Object tt3 = st.getObject(3); Object tt4 = st.getObject(4); return tt2; } }); } /** * 調(diào)用存儲過程-返回值是List集合 * */ public static List getProceduresResultList() { List resultList = (List) jdbcTemplate.execute( new CallableStatementCreator() { public CallableStatement createCallableStatement( Connection conn) throws SQLException { /** 調(diào)用指定存儲過程 */ String procedures = "{ CALL PRO_QUERY_INFO_ARGS2(?,?) }"; CallableStatement statement = conn .prepareCall(procedures); /** 注冊輸出參數(shù)的類型-此處集合為oracle的VARCHAR2 */ statement.registerOutParameter(1, OracleTypes.VARCHAR); /** 注冊輸出參數(shù)的類型-此處集合為oracle的游標類型 */ statement.registerOutParameter(2, OracleTypes.CURSOR); return statement; } }, new CallableStatementCallback() { public Object doInCallableStatement( CallableStatement statement) throws SQLException, DataAccessException { List resultsMap = new ArrayList(); statement.execute(); /** 獲取游標結(jié)果集-此處2是存儲過程參數(shù)順序 */ ResultSet resultSet = (ResultSet) statement .getObject(2); /** 轉(zhuǎn)換每行的返回值到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數(shù)據(jù)源 */ public static JdbcTemplate getJdbcTemplate() { DruidDataSource dataSource = new DruidDataSource(); /**數(shù)據(jù)庫連接信息*/ String username = "demodb"; String password = "123456"; String jdbcUrl = "jdbc:oracle:thin:@127.0.0.1:1521/orcl"; String driverName = "oracle.jdbc.OracleDriver"; /** 設置數(shù)據(jù)源屬性參數(shù) */ dataSource.setPassword(password); dataSource.setUrl(jdbcUrl); dataSource.setUsername(username); dataSource.setDriverClassName(driverName); /** 獲取spring的JdbcTemplate*/ JdbcTemplate jdbcTemplate = new JdbcTemplate(); /** 設置數(shù)據(jù)源 */ jdbcTemplate.setDataSource(dataSource); return jdbcTemplate; } }
以上,感謝.
總結(jié)
到此這篇關(guān)于spring中JdbcTemplate操作oracle的存儲過程的文章就介紹到這了,更多相關(guān)JdbcTemplate操作oracle存儲過程內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
java基本教程之synchronized關(guān)鍵字 java多線程教程
這篇文章主要介紹了java的synchronized原理、synchronized基本規(guī)則、synchronized方法 和 synchronized代碼塊、實例鎖和全局鎖2014-01-01總結(jié)Junit4,Junit5,Jupiter之間的聯(lián)系
Jupiter和Junit5之間有什么聯(lián)系?Jupiter提供了哪些新的測試方法?如何用IDEA和Jupiter生成可讀性更好的測試報告?文中有非常詳細的說明,需要的朋友可以參考下2021-06-06