Hibernate4調用SQL和存儲過程


最近使用了新的Struts2.20+spring4.0+hibernate4.0,新框架移除了HibernateSupportDao,所以重寫了下Hibernate4對SQL和存儲過程的操作,以備后查

以下的sessionFactory 對象是通過spring注入
1 private SessionFactory sessionFactory;
2     public void setSessionFactory(SessionFactory sessionFactory) {
3         this.sessionFactory = sessionFactory;
4     }

 

1、通過SQL查詢,以List的方式返回

 1     /**
 2      * 通過SQL查詢,結果集不作處理直接返回
 3      * @param queryString 查詢字符串
 4      * @param params 參數
 5      * @return
 6      */
 7     @SuppressWarnings("unchecked")
 8     public List<Object> find_sql(String queryString,Object[] params){
 9         Session session = sessionFactory.getCurrentSession();
10         Query query = session.createSQLQuery(queryString);
11         if(null!=params){
12             for(int i=0;i<params.length;i++){
13                 query.setParameter(i, params[i]);
14             }
15         }
16         List<Object> list = query.list();
17         return list;
18     }

2、SQL或存儲過程查詢,將返回的結果集轉換成Map,結果集列名作為鍵

 1     /**
 2      * 通過SQL查詢,將結果集轉換成Map對象,列名作為鍵(適用於有返回結果集的存儲過程或查詢語句)
 3      * @param queryString
 4      * @param params
 5      * @return
 6      */
 7     @SuppressWarnings("unchecked")
 8     public List<Map<String,Object>> find_sql_toMap(String queryString,Object[] params){
 9         Session session = sessionFactory.getCurrentSession();
10         Query query = session.createSQLQuery(queryString);
11         query.setResultTransformer(Transformers.ALIAS_TO_ENTITY_MAP);
12         if(null!=params){
13             for(int i=0;i<params.length;i++){
14                 query.setParameter(i, params[i]);
15             }
16         }
17         List<java.util.Map<String,Object>> list = query.list();
18         return list;
19     }

3、SQL執行增、刪、改操作,測試使用該方法執行存儲過程會報錯

 1 /**
 2      * 通過SQL執行無返回結果的語句,執行修改、刪除、添加等(適用於無結果集返回SQL語句,不能用於存儲過程)
 3      * @param queryString
 4      * @param params
 5      */
 6     public void executeSql(String queryString,Object[] params){
 7         Session session = sessionFactory.getCurrentSession();
 8         Query query = session.createQuery(queryString);
 9         if(null!=params){
10             for(int i=0;i<params.length;i++){
11                 query.setParameter(i, params[i]);
12             }
13         }
14         query.executeUpdate();
15     }

4、執行無結果集返回的存儲過程,是第3點的補充

 1 /**
 2      * 通過SQL執行無返回結果的存儲過程(僅限於存儲過程)
 3      * @param queryString
 4      * @param params
 5      */
 6     public void executeVoidProcedureSql(final String queryString,final Object[] params) throws Exception{
 7         Session session = sessionFactory.getCurrentSession();
 8         session.doWork(new Work(){
 9           public void execute(Connection conn) throws SQLException {
10             ResultSet rs = null;
11             CallableStatement call = conn.prepareCall("{" + queryString + "}");
12             if (null != params) {
13                 for (int i = 0; i <params.length; i++) {
14                     call.setObject(i+1, params[i]);
15                 }
16             }
17             rs = call.executeQuery();
18             call.close();
19             rs.close();
20           }
21        });
22     }

5、通過存儲過程查詢,返回的結果集必須為單結果集,與第2點方法效果一致

 1     /**
 2      * 通過存儲過程查詢(單結果集)
 3      * @param sql 查詢sql
 4      * @param params 參數
 5      * @param columnNum 返回的列數
 6      * @return
 7      */
 8     public List<Map<String, Object>> find_procedure(final String sql,final Object[] params){
 9         final List<Map<String, Object>> result = new ArrayList<Map<String, Object>>();
10         try {
11             Session session = sessionFactory.getCurrentSession();
12             session.doWork(new Work(){
13               public void execute(Connection conn) throws SQLException {
14                   CallableStatement cs=null;
15                   ResultSet rs=null;
16                   cs = conn.prepareCall(sql);
17                     for(int i=1;i<=params.length;i++){
18                         cs.setObject(i, params[i-1]);//設置參數
19                     }
20                     rs = cs.executeQuery();
21                     ResultSetMetaData metaData = rs.getMetaData();
22                     int colCount=metaData.getColumnCount();
23                     while(rs.next()){
24                         Map<String, Object> map = new HashMap<String, Object>();
25                         for(int i=1;i<=colCount;i++){
26                             String colName=metaData.getColumnName(i);
27                             map.put(colName, rs.getObject(colName));
28                         }
29                         result.add(map);
30                     }
31                     close( cs, rs);
32               }
33            });
34             return result;
35         } catch (Exception e) {
36             e.printStackTrace();
37         }
38         return null;
39     }

6、通過存儲過程查詢,適用返回的結果集有一個或多個

 1 /**
 2      * 通過存儲過程查詢(多結果集)
 3      * @param sql 查詢sql
 4      * @param params 參數
 5      * @param columnNum 返回的列數
 6      * @return
 7      */
 8     public List<List<Map<String, Object>>> find_procedure_multi(final String sql,final Object[] params){
 9         final List<List<Map<String, Object>>> result = new ArrayList<List<Map<String, Object>>>();
10         try {
11 //            conn = SessionFactoryUtils.getDataSource(sessionFactory).getConnection();
12             Session session = sessionFactory.getCurrentSession();
13             session.doWork(new Work(){
14                 public void execute(Connection conn) throws SQLException {
15                     CallableStatement cs=null;
16                     ResultSet rs=null;
17                     cs = conn.prepareCall(sql);
18                     for(int i=1;i<=params.length;i++){
19                         cs.setObject(i, params[i-1]);
20                     }
21                     boolean hadResults = cs.execute();
22                     ResultSetMetaData metaData = null;
23                     while(hadResults){//遍歷結果集
24                         List<Map<String, Object>> rsList = new ArrayList<Map<String, Object>>();//用於裝該結果集的內容
25                         rs = cs.getResultSet();//獲取當前結果集
26                         metaData=rs.getMetaData();
27                         int colCount=metaData.getColumnCount();//獲取當前結果集的列數
28                         while(rs.next()){
29                             Map<String, Object> map = new HashMap<String, Object>();
30                             for(int i=1;i<=colCount;i++){
31                                 String colName=metaData.getColumnName(i);
32                                 map.put(colName, rs.getObject(colName));
33                             }
34                             rsList.add(map);
35                         }
36                         result.add(rsList);
37                         close(null, rs);//遍歷完一個結果集,將其關閉
38                         hadResults=cs.getMoreResults();//移到下一個結果集
39                     }
40                     close(cs, rs);
41                 }
42             });
43             return result;
44         } catch (Exception e) {
45             e.printStackTrace();
46         }
47         return null;
48     }

代碼中的close方法,執行doWork的execute方法中不能關閉connection,connection連同session由spring管理

 1 private void close(CallableStatement cs,ResultSet rs){
 2         try {
 3             if(cs!=null){
 4                 cs.close();
 5             }
 6             if(rs!=null){
 7                 rs.close();
 8             }
 9         } catch (Exception e) {
10             e.printStackTrace();
11         }
12     }

 本文地址:http://www.cnblogs.com/wangjiajun/p/4208077.html 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM