Hibernate执行原生态SQL语句通用方法
最近在给系统(原系统是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://ibc.iteye.com/blog/247126
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
我的第一篇博客,记录一下学习过程。
分享到:
相关推荐
createSqlQuery 方法是 Hibernate 提供的一种查询机制,用于执行原生态的 SQL 语句。与 createQuery 方法不同的是,createSqlQuery 方法可以执行查询、修改和添加操作。 使用 createSqlQuery 方法可以执行以下操作...
与 Hibernate 相比,MyBatis 是一个半自动映射的框架,配置 Java 对象与 SQL 语句执行结果的对应关系,多表关联关系配置简单。Hibernate 是一个全表映射的框架,配置 Java 对象与数据库表的对应关系,多表关联关系...
程序员直接编写原生态 sql,可以严格控制 sql 执行性能,灵活度高。 MyBatis 的优点: 1. 基于 SQL 语句编程,相当灵活,不会对应用程序或者数据库的现有设计造成任何影响,SQL 写在 XML 里,解除 sql 与程序代码...
3. **查询语言**:JPA引入了一种名为JPQL(Java Persistence Query Language)的查询语言,这是一种面向对象的查询语言,可以用来执行各种查询操作,而不必直接编写SQL语句。这有助于降低应用与数据库之间的耦合度。...
* Mybatis 直接编写原生态 sql,可以严格控制 sql 执行性能,灵活度高,非常适合对关系数据模型要求不高的软件开发。 * Hibernate 对象/关系映射能力强,数据库无关性好,对于关系模型要求高的软件,如果用 ...
2. MyBatis 直接编写原生态 sql,可以严格控制 sql 执行性能,灵活度高,非常适合对关系数据模型要求不高的软件开发。 3. Hibernate 对象/关系映射能力强,数据库无关性好,对于关系模型要求高的软件,如果用 ...
MyBatis的编写原生态SQL特性赋予了开发者高度的灵活性,可以精确控制SQL的执行,适用于需求变化频繁的互联网项目。 MyBatis的优点主要体现在基于SQL语句编程带来的灵活性,消除了与数据库的耦合,便于统一管理SQL...
4. **原生SQL的支持**:尽管如此,Hibernate并没有完全放弃对原生SQL的支持,开发者仍然可以在必要时直接编写并执行原生SQL语句。而在iBatis中,所有的查询都必须以XML文件的形式定义,这在一定程度上降低了代码的...
MyBatis 可以让程序员直接编写原生态 SQL,可以手动映射结果到 Java 对象,同时它也提供了动态 SQL 的支持,极大地简化了 JDBC 编程的复杂性。 **2. MyBatis 的核心组件** - **SqlSessionFactoryBuilder**:用于...
- **灵活性**: MyBatis 允许开发者直接编写原生态 SQL,这使得其在面对需求频繁变更的情况下能够快速适应,同时也提供了更高的性能优化空间。 - **数据库无关性**: 由于 MyBatis 需要手动编写 SQL,因此在需要支持...
- 还涉及如何配置数据库方言(Database Dialect),以便Hibernate能够生成与特定数据库兼容的SQL语句。 6. **事务与并发控制**: - 介绍了物理事务的管理方式和Hibernate的事务API。 - 讨论了不同事务模式(如...
- **支持原生 SQL**:虽然 Hibernate 鼓励使用 HQL,但它同样支持使用原生 SQL,这对于需要执行复杂查询的情况非常有用。 - **XML 文件配置**:Hibernate 可以通过 XML 文件来配置映射关系,这使得整个系统的配置...
- **灵活性高**:MyBatis允许开发者编写原生态SQL,从而提供更高的灵活性。 - **易于上手**:对于简单的操作,只需配置少量XML即可实现数据访问。 - **性能优秀**:相比Hibernate等全ORM框架,MyBatis提供了更细粒度...
对于批量操作,JdbcTemplate提供了`batchUpdate(String[] sqls)`方法,可以一次执行多条SQL语句,提高效率。 8. **原创代码示例** 在压缩包中的"复件 SpringJDBC"文件可能包含一个简单的Spring整合JDBC的示例。...
- **强大的SQL语句控制**:允许开发者编写原生态的SQL语句,便于优化。 - **动态SQL**:支持if、choose、when、otherwise等元素,可以根据条件动态生成不同的SQL语句。 - **缓存机制**:提供了二级缓存机制,可以在...
4. **灵活性**:MyBatis允许开发者编写原生态SQL,并且能够灵活地控制SQL语句,适用于复杂的查询需求。 #### 三、MyBatis基本配置 1. **配置文件结构**: - `mybatis-config.xml`:MyBatis的核心配置文件,包括...
- **自动SQL生成**:Hibernate能够自动生成SQL语句,大大减少了手写SQL的需求。 - **透明性**:开发者可以通过简单的注解或XML配置文件来指定对象与数据库表之间的映射关系。 - **缓存机制**:Hibernate提供了内置的...
- **灵活性**:允许开发者编写原生态SQL并运用强大的动态SQL语句。 - **简洁性**:通过XML映射文件或注解实现声明式编程。 - **高效性**:通过缓存机制提高性能。 - **易于集成**:可以轻松地与Spring等其他Java...
Hibernate的优势在于它可以自动处理SQL语句,减少了手动编写SQL的工作量,并支持对象级的数据操作。 2. **Oracle教程**:Oracle是一种广泛应用的关系型数据库管理系统,游标.doc可能涵盖了如何在Oracle中使用游标...