`

Hibertnate与JDBC混合使用

    博客分类:
  • JAVA
阅读更多

Hibernate与JDBCtemplate如何混用?
一开始在项目中使用的是Hibernate,但是发现Hibernate在做批量操作时,效率不是很理想。所以现在采用JDBCTemplate和Hibernate混用,现在问题是如何配置他们的事务?
两者都用同一个datasource ,同一spring管理事务就没有问题。

 

另外要注意两点:

1. 由于Spring JDBC 框架,它没有采用服务层缓存技术,所以可以使用 DAO 类返回数据库中的数据。如果采用 Hibernate 等 ORM 框架,由于它们采用了服务层缓存的技术,为了获取数据库中的相应数据,需要在业务方法执行后调用 HibernateTemplate.flush() 方法,将缓存中的对象同步到数据库中,这时才可以通过 SimpleJdbcTemplate 在数据库中访问业务方法的执行情况。

2. 使用hibernateTransaction manager ,才可以保证混用时候的事务。

 

补充:HibernateTransactionManager实际上是可以同时管理由JdbcTemplate或JdbcDaoSupport实现的dao以及HibernateTemplate或HibernateDaoSupport实现的事务的。

 


Spring 提供了一个能从当前事务上下文中获取绑定的数据连接的工具类,那就是 DataSourceUtils。Spring 强调必须使用 DataSourceUtils 工具类获取数据连接,Spring 的 JdbcTemplate 内部也是通过 DataSourceUtils 来获取连接的。DataSourceUtils 提供了若干获取和释放数据连接的静态方法,说明如下:

  • static Connection doGetConnection(DataSource dataSource) : 首先尝试从事务上下文中获取连接,失败后再从数据源获取连接;
  • static Connection getConnection(DataSource dataSource) : 和 doGetConnection 方法的功能一样,实际上,它内部就是调用 doGetConnection 方法获取连接的;
  • static void doReleaseConnection(Connection con, DataSource dataSource) :释放连接,放回到连接池中;
  • static void releaseConnection(Connection con, DataSource dataSource) :和 doReleaseConnection 方法的功能一样,实际上,它内部就是调用 doReleaseConnection 方法获取连接的;

来看一下 DataSourceUtils 从数据源获取连接的关键代码:

public abstract class DataSourceUtils {
    …
    public static Connection doGetConnection(DataSource dataSource) throws SQLException {
        
		Assert.notNull(dataSource, "No DataSource specified");

        //①首先尝试从事务同步管理器中获取数据连接
        ConnectionHolder conHolder = 
            (ConnectionHolder) TransactionSynchronizationManager.getResource(dataSource);
        if (conHolder != null && (conHolder.hasConnection() || 
            conHolder.isSynchronizedWithTransaction())) { 
            conHolder.requested();
            if (!conHolder.hasConnection()) {
                logger.debug(
                    "Fetching resumed JDBC Connection from DataSource");
                conHolder.setConnection(dataSource.getConnection());
            }
			return conHolder.getConnection();
		}
        
		//②如果获取不到,则直接从数据源中获取连接
        Connection con = dataSource.getConnection();

        //③如果拥有事务上下文,则将连接绑定到事务上下文中
        if (TransactionSynchronizationManager.isSynchronizationActive()) {
            ConnectionHolder holderToUse = conHolder;
            if (holderToUse == null) {
				holderToUse = new ConnectionHolder(con);
			}
			else {holderToUse.setConnection(con);}
            holderToUse.requested();
			TransactionSynchronizationManager.registerSynchronization(
                new ConnectionSynchronization(holderToUse, dataSource));
			holderToUse.setSynchronizedWithTransaction(true);
			if (holderToUse != conHolder) {
				TransactionSynchronizationManager.bindResource(
                dataSource, holderToUse);
			}
		}
		return con;
	}
    …
}


 

另外还有hibernate的SessionFactoryUtils(iBatis同Jdbc).

 

关于JdbcTemplate的使用可以参考下面的一篇文章:

使用 freemarker 创建动态 SQL

 


 

 

 

分享到:
评论
8 楼 JetMah 2010-07-15  
可以考虑在每个Dao依然作为HibernateDao的子类,然后在需要的时候直接使用JDBC的DAO中注入一个SimpleJdbcTemplate
7 楼 tivan 2010-06-08  
左看右看 写道
菜菜菜 写道
为什么不用ibatis呢

同意,既然都使用了这种搭配为什么不使用ibatis呢?


项目中还是尽量使用Hibernate的,只有一些非常必要的场合才使用了JDBC,
而且Spring的JDBCTemplate已经提供了很好的封装,还可以写一些动态的SQL文(使用freemarker创建动态SQL:http://tivan.iteye.com/blog/686297);
另外还有就是这个是在维护的时候添加的JDBC功能,也就没有添加ibatis。

如果是项目初期的话应该考虑ibatis与JDBCTemplate做个比较。
6 楼 tivan 2010-06-08  
joinsky 写道
还不如 Hibernate 的 SQLQuery 呢?

性能紧要而Hibernate又无法满足要求时,才使用JDBCTemplate。
5 楼 wm920 2010-06-08  
封装jdbc方法 在继承了 HibernateTemplate  方法
4 楼 huatu122 2010-06-08  
给你帖一个我写的方法
public Object excuteBySql(final String sql,final Object[] para){
return this.getHibernateTemplate().execute(new HibernateCallback(){
public Object doInHibernate(Session session) {
SQLQuery sqlQuery=session.createSQLQuery(sql);
if(null!=para&&para.length!=0)  bindProperties(sqlQuery,para);
return sqlQuery.executeUpdate();
}
});
}

这样不就能用JDBC进行批量操作了么
3 楼 左看右看 2010-06-08  
菜菜菜 写道
为什么不用ibatis呢

同意,既然都使用了这种搭配为什么不使用ibatis呢?
2 楼 菜菜菜 2010-06-08  
为什么不用ibatis呢
1 楼 joinsky 2010-06-08  
还不如 Hibernate 的 SQLQuery 呢?

相关推荐

    Spring+mybatis+jdbc结合使用教程

    本文档主要讲解Spring与mybatis与jdbc结合使用的方法和例子。

    Spring Data JDBC与JDBC的区别

    Spring Data JDBC与JDBC是两种不同的数据库访问方式,它们在Java开发中有着广泛的应用。JDBC(Java Database Connectivity)是Java平台的标准API,用于与各种数据库进行交互。它提供了低级别的数据库操作,如建立...

    jdbc连接使用jar包 Access_JDBC40.jar

    本主题聚焦于使用`Access_JDBC40.jar`这个特定的JDBC驱动包来与Microsoft Access数据库进行交互。`Access_JDBC40.jar`是针对Java 6及以上版本的JDBC 4.0驱动,提供了对Access数据库的支持。 首先,我们需要理解为...

    JDK版本与JDBC版本的关系

    ### JDK版本与JDBC版本的关系 在探讨JDK(Java Development Kit)版本与JDBC(Java Database Connectivity)版本之间的关系之前,我们先简单了解一下这两者的基本概念。 #### 1. JDK简介 JDK是Java开发工具包,...

    jdbc详细使用过程

    jdbc教案jdbc教案jdbc教案jdbc教案jdbc教案jdbc教案jdbc教案jdbc教案jdbc教案,JDBC详细使用过程

    sqljdbc和sqljdbc4 sqlserver最新驱动

    这两个版本都是JDBC(Java Database Connectivity)驱动,允许Java开发者在应用程序中与SQL Server进行交互。下面将详细介绍这两个驱动以及如何使用它们。 1. SQLJDBC驱动: SQLJDBC是微软发布的早期版本的JDBC...

    sqljdbc41、sqljdbc42的官方jar包

    在Java编程语言中,JDBC(Java Database Connectivity)是一个核心的API,用于连接Java应用程序与各种类型的数据库。这里我们关注的是两个特定版本的Microsoft SQL Server的JDBC驱动:sqljdbc41.jar和sqljdbc42.jar...

    自学jdbc心得体会

    * JDBC对于使用者要有一致性,对不同的数据库其使用方法都是相同的。 * 驱动开发必须要实现Driver接口。 二、JDBC的API * java.sql包和javax.sql包 * Driver接口(驱动):在加载某一Driver类时,它应该创建自己的...

    在使用jdbc连接数据库(sqljdbc4)

    在IT行业中,数据库是存储和管理数据的核心组件,而Java应用程序常常通过Java Database Connectivity (JDBC) API来与各种数据库进行交互。`sqljdbc4`是Microsoft SQL Server针对Java平台提供的一个驱动,使得Java...

    Dm7JdbcDriver16.jar Dm7JdbcDriver17.jar Dm7JdbcDriver18.jar

    JDBC驱动是连接Java应用程序与数据库之间的桥梁,通常分为四种类型:Type 1(纯Java API,依赖于数据库厂商提供的ODBC桥)、Type 2(混合API,Java与本地数据库API)、Type 3(完全基于网络的API,不依赖于数据库...

    JDBCDriver3.0.rar_jdbc driver 3.0_sql jdbc 3.0_sql server jdbc_s

    在IT行业中,数据库连接是应用程序与数据存储之间的桥梁,而JDBC(Java Database Connectivity)则是Java平台中用于访问数据库的标准API。JDBC Driver 3.0是针对Java开发者的重要组件,它允许Java应用程序与各种...

    关键技术——JSP与JDBC应用详解(电子版)

    - JDBC连接池的配置与使用,提高数据库连接的效率。 - SQL语言基础,包括DML(数据操纵语言)、DDL(数据定义语言)和DQL(数据查询语言)。 - JSP与Servlet的关系,以及如何在JSP中调用Servlet。 - 数据库事务的...

    jdbc.zip_java jdbc_java+jdbc_jdbc_jdbc Java_zip

    客户端可能会使用JDBC API建立与服务器的连接,创建Statement或PreparedStatement对象,然后执行SQL语句。这些语句可以是SELECT、INSERT、UPDATE或DELETE,用于获取、添加、修改或删除数据库中的数据。 `Server....

    jdbc实现与线程池

    jdbc 实现与线程池 jdbc 是 Java Database Connectivity 的缩写,用于 Java 语言与数据库之间的交互。jdbc 实现可以对数据库进行增删改查操作,并可以与线程池相结合,提高数据库操作的效率和安全性。 一、jdbc ...

    sqljdbc4.jar, sqljdbc41.jar, sqljdbc42.jar三个包

    总的来说,sqljdbc4.jar, sqljdbc41.jar, 和sqljdbc42.jar是Microsoft SQL Server与Java应用程序交互的重要工具,它们提供了在不同Java版本下的JDBC连接支持。正确选择和使用这些驱动,可以确保你的Java应用能够顺利...

    JAVA使用JDBC进行insert操作添加信息到数据库

    JAVA 使用 JDBC 进行 insert 操作添加信息到数据库 一、 JDBC 概述 JDBC(Java Database Connectivity)是一种 Java 应用程序用来与数据库进行交互的 API。它提供了一组标准的接口,允许 Java 应用程序与各种...

    jdbc基础的详解与总结

    "jdbc 基础的详解与总结" jdbc 是一套协议,由 Sun 公司定义的一组接口,由数据库厂商来实现,并规定了 Java 开发人员访问数据库所使用的方法的调用规范。jdbc 的实现是由数据库厂商提供,以驱动程序形式提供。jdbc...

    sqlserver驱动包 jdbc驱动 sqljdbc.jar和sqljdbc4.jar

    SQL Server驱动包是用于Java应用程序通过JDBC(Java Database Connectivity)接口与Microsoft SQL Server数据库进行交互的必备组件。本文将详细介绍这两个重要的驱动文件——sqljdbc.jar和sqljdbc4.jar,以及如何...

    Java使用Jdbc连接Oracle执行简单查询操作示例

    Java使用Jdbc连接Oracle执行简单查询操作示例 Java使用Jdbc连接Oracle执行简单查询操作,是指使用Java语言通过Jdbc(Java Database Connectivity)连接Oracle数据库并执行简单查询操作的过程。本文将通过实例形式...

    JDBC 4.3规范文档

    JDBC规范定义了Java程序如何与数据库交互的规则,其主要目的是让程序员能够使用统一的方法连接并操作数据库。 在本规范文档中,我们可以了解到JDBC 4.3版本所支持的特性,其中API的版本号和维持状态信息表明了当前...

Global site tag (gtag.js) - Google Analytics