首页 > 代码库 > Hibernate4调用SQL和存储过程

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 =http://www.mamicode.com/ 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 = http://www.mamicode.com/null;23                     while(hadResults){//遍历结果集24                         List<Map<String, Object>> rsList = new ArrayList<Map<String, Object>>();//用于装该结果集的内容25                         rs = cs.getResultSet();//获取当前结果集26                         metaData=http://www.mamicode.com/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     }

 

Hibernate4调用SQL和存储过程