1. 程式人生 > >在java的hibernate3框架中呼叫oracle資料庫中帶遊標引數的儲存過程

在java的hibernate3框架中呼叫oracle資料庫中帶遊標引數的儲存過程

Calendar cal=Calendar.getInstance();
String  curyear=Integer.toString(cal.get(GregorianCalendar.YEAR));
Map<String, Object> rootMap = new HashMap<String, Object>();
//拼接呼叫儲存過程的sql語句,“?”號代表該儲存過程的引數包括in型別和out型別
String sql="{call chart_base_myWorkMain(?,?)}";
//從hibernate中獲取資料庫連線
Connection connection = SessionFactoryUtils.getDataSource
(sessionFactory).getConnection();
//建立資料庫呼叫的Statement
CallableStatement sp=connection.prepareCall(sql);
//設定引數1表示引數的位置和第一個“?”對應,
//registerOutParameter是設定輸出型別引數的所呼叫的方法,OracleTypes.CURSOR 是遊標型別
sp.registerOutParameter(1,OracleTypes.CURSOR);
//普通型別的引數和值就用下面這種設定
sp.setString(2, curyear);
//引數設定好了以後,執行
sp.execute();
// 獲取返回的物件,再將物件轉為記錄集  1代表第一個引數
ResultSet rs = (ResultSet) sp.getObject(1); 
//因為第一個返回型別為遊標,裡面儲存的是返回的結果集,獲取遊標的元資料,本質是list
ResultSetMetaData metaData = rs.getMetaData();
//再獲取元資料的(list)的大小
int columnCount = metaData.getColumnCount();
List<Map<String,Object>> list=new ArrayList();
//遍歷該元資料
while(rs.next()){
    Map<String,Object> map=new 
HashMap<>(); for (int i = 1; i <= columnCount; i++) {
        //columnName就是對應欄位的名字 
        String columnName =metaData.getColumnLabel(i);
       //value就是該欄位對應的值
        String value = rs.getString(columnName);
        if(value.length()>6){
            value=value.substring(0,6);
        }
        //把欄位和值放在自己的map中
        map.put(columnName, value);
    }
    //把map放到list中,每一個map就相當於結果集中的一條記錄
    list.add(map);
}
rootMap.put("dataList",list);
rootMap.put("year", curyear);