【Spring學習】Spring JdbcTemplate之五類方法總結
自定義函式回撥:
1、params:用於描述自定義函式佔位符引數或命名引數型別;SqlParameter用於描述IN型別引數、SqlOutParameter用於描述OUT型別引數、SqlInOutParameter用於描述INOUT型別引數、SqlReturnResultSet用於描述呼叫儲存過程或自定義函式返回的ResultSet型別資料,其中SqlReturnResultSet需要提供結果集處理回撥用於將結果集轉換為相應的形式,hsqldb自定義函式返回值是ResultSet型別。
2、CallableStatementCreator:提供Connection物件用於建立CallableStatement
3、outValues:呼叫call方法將返回型別為Map<String, Object>物件;
4、outValues.get("result"):獲取結果,即通過SqlReturnResultSet物件轉換過的資料;其中SqlOutParameter、SqlInOutParameter、SqlReturnResultSet指定的name用於從call執行後返回的Map中獲取相應的結果,即name是Map的鍵。
幾種具體使用:public void testCallableStatementCreator() { final String callFunctionSql = "{call FUNCTION_TEST(?)}"; List<SqlParameter> params = new ArrayList<SqlParameter>(); params.add(new SqlParameter(Types.VARCHAR)); params.add(new SqlReturnResultSet("result",new ResultSetExtractor<Integer>() { @Override public Integer extractData(ResultSet rs) throws SQLException,DataAccessException { while(rs.next()) { return rs.getInt(1); } return 0; })); Map<String, Object> outValues = jdbcTemplate.call(new CallableStatementCreator() { @Override public CallableStatement createCallableStatement(Connection conn) throws SQLException { CallableStatement cstmt = conn.prepareCall(callFunctionSql); cstmt.setString(1, "test"); return cstmt; }}, params); }
1、呼叫無返回值的儲存過程
2、呼叫有返回值的儲存過程(不是結果集)public class callProcedure { private JdbcTemplate jdbcTemplate; public void setJdbcTemplate(JdbcTemplate jdbcTemplate) { this.jdbcTemplate = jdbcTemplate; } public void test(){ this.jdbcTemplate.execute("{call procedureName (?)}"); } }
public class test {
/**
* 呼叫無參的儲存過程(有返回值)
* @return
*/
public static int callProcedure() {
String str = (String)jdbcTemplate.execute(new CallableStatementCreator(){
@Override
public CallableStatement createCallableStatement(Connection connection) {
String procedure = "{call PRC_BJ_SYNC_CIRCUIT_DATA_INCRE (?)}";//儲存過程
CallableStatement cs = null;//建立儲存過程的物件
try {
cs = connection.prepareCall(procedure);
cs.registerOutParameter(1,OracleTypes.VARCHAR);//註冊輸出引數的型別
} catch (Exception e) {
logger.error("call procedure error : " + e);
}
return cs;
}
}, new CallableStatementCallback(){
@Override
public Object doInCallableStatement(CallableStatement cs) {
String csStr = null;
try {
cs.execute();
csStr = cs.getString(1);//獲取輸出引數的值
} catch (Exception e) {
logger.error("call procedure error : " + e);
}
return csStr;//獲取輸出引數的值
}});
return Integer.parseInt(str);
}
/**
* 呼叫有參的儲存過程(有返回值)
* @return
*/
public static int callProcedure() {
String str = (String)jdbcTemplate.execute(new CallableStatementCreator(){
@Override
public CallableStatement createCallableStatement(Connection connection) {
String procedure = "{call PRC_BJ_SYNC_CIRCUIT_DATA_INCRE (?,?)}";//儲存過程
CallableStatement cs = null;//建立儲存過程的物件
try {
cs = connection.prepareCall(procedure);
cs.setString(1,"value1");//設定入參的值
cs.registerOutParameter(1,OracleTypes.VARCHAR);//註冊輸出引數的型別
} catch (Exception e) {
logger.error("call procedure error : " + e);
}
return cs;
}
}, new CallableStatementCallback(){
@Override
public Object doInCallableStatement(CallableStatement cs) {
String csStr = null;
try {
cs.execute();
csStr = cs.getString(2);//獲取輸出引數的值
} catch (Exception e) {
logger.error("call procedure error : " + e);
}
return csStr;//獲取輸出引數的值
}});
return Integer.parseInt(str);
}
}
3、呼叫有返回值的儲存過程(是結果集)public class test {
List resultList = (List) jdbcTemplate.execute(
new CallableStatementCreator() {
public CallableStatement createCallableStatement(Connection con) throws SQLException {
String storedProc = "{call PRC_BJ_SYNC_CUST_DATA(?,?)}";// 呼叫的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);
}
}
相關推薦
【Spring學習】Spring JdbcTemplate之五類方法總結
自定義函式回撥:1、params:用於描述自定義函式佔位符引數或命名引數型別;SqlParameter用於描述IN型別引數、SqlOutParameter用於描述OUT型別引數、SqlInOutParameter用於描述INOUT型別引數、SqlReturnResultSet用於描述呼叫儲存過程或自定義函式返
【java學習】spring mvc 公共dao的實現,定義基本的增刪改查
pri 代碼 部分 lec sse encoding del epo repos 接口類: package com.blog.db.dao; import com.blog.util.Pagination; import java.util.Lis
【Spring學習】spring註解自動注入bean
Spring mvc註解用到的配置: <!-- 啟用spring mvc 註解 --> <context:annotation-config /> <context:component-scan base-package
【機器學習】特徵選擇之最小冗餘最大相關性(mRMR)與隨機森林(RF)
特徵選擇之最小冗餘最大相關性(mRMR) 最小冗餘最大相關性(mRMR)是一種濾波式的特徵選擇方法,由Peng et.al提出。主要用途有機器學習,影象識別等。 一種常用的特徵選擇方法是最大化特徵與分類變數之間的相關度,就是選擇與分類變數擁有最高相關度的前k個變數。但是,在特徵選擇中,
【Qt學習】Qt入門之Qt5.3.2+vs2010(中文版)+opencv2.4.9配置與簡單測試
【Qt學習--1】Qt入門之Qt5.3.2+vs2010(中文版)+opencv2.4.9配置與簡單測試 最近開始接觸Qt,起因就是想做個視覺化的操作介面來,剛好也看到相關的一些博文和資料,對Qt有比較詳盡的介紹,就動手安裝配置起來,下面就開始吧,記錄和分享一下我的安裝過程
【WPF學習】第三十五章 資源字典
如果希望在多個專案之間共享資源,可建立資源字典。資源字典只是XAML文件,除了儲存希望使用的資源外,不做其他任何事情。 一、建立資源字典 下面是一個資源字典示例,它包含一個資源: <ResourceDictionary xmlns="http://schemas.microsoft.com/w
【WPF學習】第四十五章 視覺化物件
前面幾章介紹了處理適量適中的圖形內容的最佳方法。通過使用幾何圖形、圖畫和路徑,可以降低2D圖形的開銷。即使正在使用複雜的具有分層效果的組合形狀和漸變畫刷,這種方法也仍然能夠正常得很好。 然而,這樣設計不適合需要渲染大量圖形元素的繪圖密集型應用程式。例如繪圖程式、演示粒子碰撞的物理模型程式或橫向卷軸形式
【WPF學習】第六十五章 建立無外觀控制元件
使用者控制元件的目標是提供增補控制元件模板的設計表面,提供一種定義控制元件的快速方法,代價是失去了將來的靈活性。如果喜歡使用者控制元件的功能,但需要修改使其視覺化外觀,使用這種方法就有問題了。例如,設想希望使用相同的顏色拾取器,但希望使用不同的“面板”,將其更好地融合到已有的應用程
Java學習筆記——設計模式之五.工廠方法
strong scanner multipl 石頭 simple 決定 定義 opera 下使用 水邊一只青蛙在笑 ——石頭和水 工廠方法模式(Factory Method),定義了一個用於創建對象的接口,讓實現類決定實例化哪一個類。工廠方法使一個類的實
【機器學習】隨機初始化思想神經網絡總結
算法 代價函數 所有 -i 如果 中間 相同 決定 最小 之前在進行梯度下降時,通常我們讓Θ等參數為0,這樣的做法在邏輯回歸中還是可行的,但是在神經網絡中,如果你讓所有的參數都初始化為0,這將意味著第二層的所有的激活單元都會有相同的值,同理,如果我們初始化所有的參數都是一
【深度學習】三維點雲資料集總結
點雲資料集總結 三維點雲資料,三維深度學習 1.ShapeNet ShapeNet是一個豐富標註的大規模點雲資料集,其中包含了55中常見的物品類別和513000個三維模型。 2.ShapeNetSem 這是一個小的資料庫,包含了270類的12000個物
【GIT學習】GIT的安裝與使用方法
Git是什麼? Git是目前世界上最先進的分散式版本控制系統(沒有之一)。 工作原理 / 流程: Workspace:工作區 Index / Stage:暫存區 Repository:倉庫區(或本地倉庫) Remote:遠端倉庫 實際專案開發中,我們經常會用一些版本
【機器學習】人像分類(一)——過程總結
這個問題其實是上學期某門課的大作業的三個題目之一。公佈題目後我就對這個內容很感興趣,然而由於種種原因,和隊友商量之後仍然選擇了看起來最簡單的句子分類,對此我不無遺憾。 這個寒假裡計劃要乾的事情其實有很多,完成這個專案是其中之一;對CS的熱門方向——如機
【機器學習】影象中的降噪方法之一:低秩降噪
概述 近幾年,低秩矩陣恢復(LRMR)廣泛用於影象處理用途影象恢復,比如去噪、去模糊等。一幅清晰的自然影象其資料矩陣往往是低秩或者近似低秩的,但存在隨機幅值任意大但是分佈稀疏的誤差破壞了原有資料的低秩性。低秩矩陣恢復是將退化影象看做一組低維資料加上噪聲形成的,因此退化前的資料就可以通過低秩矩陣來
【機器學習】:Kmeans均值聚類演算法原理(附帶Python程式碼實現)
這個演算法中文名為k均值聚類演算法,首先我們在二維的特殊條件下討論其實現的過程,方便大家理解。 第一步.隨機生成質心 由於這是一個無監督學習的演算法,因此我們首先在一個二維的座標軸下隨機給定一堆點,並隨即給定兩個質心,我們這個演算法的目的就是將這一堆點根據它們自身的座標特徵分為兩類,因此選取了兩個質心,什麼時
【Objective-C】05-OC物件中類方法和物件方法的比較
一、類方法 1.1 噹噹前方法中不涉及類的成員變數時,可以把方法宣告成類方法。這樣做的好處是可以不用宣告類的例項物件,減少記憶體空間的佔用,提高執行效率。即類的方法不依賴於物件。 1.2 以加號 + 開頭 1.3 只能由類(名)來呼叫 1.4 類方法中不能訪問類的成員變
【spring源碼學習】spring的IOC容器之BeanFactoryPostProcessor接口學習
時機 process roc sta 自動 註解 lis nbsp factor 【一】org.springframework.beans.factory.config.BeanFactoryPostProcessor接口==>該接口實現方法的執行時機:該接口void
【spring源碼學習】spring的AOP面向切面編程的實現解析
內部 遠程調用 關註 add aps 文件 uem 連接 row 一:Advice(通知)(1)定義在連接點做什麽,為切面增強提供織入接口。在spring aop中主要描述圍繞方法調用而註入的切面行為。(2)spring定義了幾個時刻織入增強行為的接口??=>org.
【spring源碼學習】spring的遠程調用實現源碼分析
數據 編碼方式 ria date 技術 color nbsp mvc err 【一】spring的遠程調用提供的基礎類 (1)org.springframework.remoting.support.RemotingSupport ===>spring提供實現的遠程調
【spring源碼學習】spring配置的事務方式是REQUIRED,但業務層拋出TransactionRequiredException異常問題
uncaught easy lap api tee class odi lose gre (1)spring拋出異常的點:org.springframework.orm.jpa.EntityManagerFactoryUtils public static DataAc