首页 > 代码库 > 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和存储过程
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。