最近使用了新的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 }
