manbucy 2010-03-03
最近在给系统(原系统是Hibernate做的持久层)加一些统计方面的功能,一般用Hihbernate都是用DAO类继承org.springframework.orm.hibernate.support.HibernateDaoSupport类的getHibernateTemplate()方法来获取链接执行HQL语句。可是有时(如做一些统计功能时)一些比较复杂的SQL在转换成HQL比较麻烦时就希望Hibernate能直接SQL(不想在系统外再去加一个JDBC拉链)。
注:对参数cls(VO对象)的要求:cls对象的setter方法名get后的字母全大写(如:setMAXACCEPTDATE)
/** * @author crsystem * @param sql SQL语句 * @param cls 查询结果集(ResultSet)转换成ArrayList时要用到的VO对象(如:GatherNodeVO.class) * @return ResultSet * 通过Hibernate 执行原生态的SQL语句通用方法 * 对参数cls(VO对象)的要求:cls对象的setter方法名get后的字母全大写(如:setMAXACCEPTDATE) */ @SuppressWarnings("unchecked") public List getListBysql(String sql,Class cls){ List list=new ArrayList(); Connection conn=null; Statement stm=null; ResultSet rs=null; try { conn=this.getHibernateTemplate().getSessionFactory().openSession().connection(); stm = conn.createStatement(); rs=stm.executeQuery(sql); ResultSetMetaData rsmd = rs.getMetaData(); //取得数据表中的字段数目,类型等返回结果 //是以ResultSetMetaData对象保存 int columnCount = rsmd.getColumnCount(); //列的总数 while(rs.next()){ Object obj=Class.forName(cls.getName()).newInstance();//类的实例化 for (int i = 1; i <= columnCount; i++) { //取得ActionForm或VO中的set方法 String colName=rsmd.getColumnName(i); //获取字段名 (全大写) //System.out.println("AAA "+colName); colName=colName.replace(colName.charAt(0)+"", new String(colName.charAt(0)+"").toUpperCase()); //将字段名字母全大写 String methodName="set"+colName; //拼出setter方法名 //System.out.println("bbb "+methodName); Object value=rs.getObject(i);//获取字段值 //获得Model类的set方法,获取字段的类型设置为set方法的参数类型 Method method=obj.getClass().getMethod(methodName, value.getClass()); //调用set方法,将获取到的字段值设置到obj对象中 method.invoke(obj, value); } list.add(obj); } } catch (HibernateException e) { e.printStackTrace(); } catch (SQLException e) { e.printStackTrace(); } catch (InstantiationException e) { e.printStackTrace(); } catch (IllegalAccessException e) { e.printStackTrace(); } catch (ClassNotFoundException e) { e.printStackTrace(); } catch (SecurityException e) { e.printStackTrace(); } catch (NoSuchMethodException e) { e.printStackTrace(); } catch (IllegalArgumentException e) { e.printStackTrace(); } catch (InvocationTargetException e) { e.printStackTrace(); }finally{ try { // if(null != rs){ // rs.close(); // } if(null != stm){ stm.close(); } if(null != conn){ conn.close(); } } catch (SQLException e) { e.printStackTrace(); } } return list; }
http://blog.csdn.net/alexjjf/archive/2007/02/07/1504876.aspx
http://www.blogjava.net/jrkui188/archive/2007/12/23/169757.html
http://lavasoft.blog.51cto.com/62575/15433
我的第一篇博客,记录一下学习过程。