- 浏览: 483825 次
- 性别:
- 来自: 武汉
最新评论
-
zyzyzy123:
请问有工程吗,我现在正在实现打电话的功能,但是一直不通,怀疑是 ...
实用的java 串口通信程序 -
wuhaitong:
引用[img][/img][*][url][/url] ...
jbpm -
迷糊_le:
maven命令, 蛮好的,谢谢
maven eclipse -
Wuaner:
不错的文章 , 谢谢分享!
Hadoop -
yuqihengsheng:
strong 很细
HighLighter
将Hibernate和iBatis两Orm框架整合,取长补短
由于Hibernate比较适合对数据进行增,删,改的操作,而iBatis适合进行数据 查询,批量操作,而且方便利用DB底层的功能,因此我尝试着持久层同时使用Hibernate和iBatis。
以下是我BaseDaoImpl的代码:
package mypack.dao;
import org.hibernate.SessionFactory;
import org.springframework.orm.hibernate3.HibernateCallback;
import org.springframework.orm.hibernate3.HibernateTemplate;
import org.springframework.orm.ibatis.SqlMapClientTemplate;
import com.ibatis.sqlmap.client.SqlMapClient;
public abstract class BaseDaoImpl implements BaseDAO
{
//iBatis的Template
private SqlMapClientTemplate sqlMapClientTemplate ;
//Hibernate的Template
private HibernateTemplate hibernateTemplate ;
//设置Hibernate
public final void setSessionFactory(SessionFactory sessionFactory); {
if(this.hibernateTemplate == null);{
this.hibernateTemplate = new HibernateTemplate(sessionFactory);;
}else{
this.hibernateTemplate.setSessionFactory(sessionFactory);;
}
}
//设置ibatis
public final void setSqlMapClient(SqlMapClient sqlMapClient); {
if(this.sqlMapClientTemplate == null);{
this.sqlMapClientTemplate = new SqlMapClientTemplate();;
}
this.sqlMapClientTemplate.setSqlMapClient(sqlMapClient);;
}
//获取Hibernate的模板
protected HibernateTemplate getHibernateTemplate();{
return hibernateTemplate
}
//获取iBatis的模板
protected SqlMapClientTemplate getSqlMapClientTemplate(); {
return sqlMapClientTemplate;
}
//一些Hibernate 的通用方法,
//当然也可不必声明,子类通过hibernateTemplate来操作
protected void save(Object object); {
hibernateTemplate.save(object);;
}
protected void saveOrUpdate(Object object); {
hibernateTemplate.saveOrUpdate(object);;
}
protected void update(Object object); {
hibernateTemplate.update(object);;
}
protected void delete(Object object);{
hibernateTemplate.delete(object);;
}
protected Object getObject(Class clazz, Serializable id);{
return hibernateTemplate.get(clazz, id);;
}
//子类通过iBatis 的sqlMapClientTemplate来操作
}
package mypack.dao;import org.hibernate.SessionFactory;
import org.springframework.orm.hibernate3.HibernateCallback;
import org.springframework.orm.hibernate3.HibernateTemplate;
import org.springframework.orm.ibatis.SqlMapClientTemplate;
import com.ibatis.sqlmap.client.SqlMapClient;
public abstract class BaseDaoImpl implements BaseDAO{
//iBatis的Template
private SqlMapClientTemplate sqlMapClientTemplate ;
//Hibernate的Template
private HibernateTemplate hibernateTemplate ;
//设置Hibernate
public final void setSessionFactory(SessionFactory sessionFactory); {
if(this.hibernateTemplate == null);{
this.hibernateTemplate = new HibernateTemplate(sessionFactory);
}else{ this.hibernateTemplate.setSessionFactory(sessionFactory);; }
} //设置ibatis public final void setSqlMapClient(SqlMapClient sqlMapClient); {
if(this.sqlMapClientTemplate == null){
this.sqlMapClientTemplate = new SqlMapClientTemplate();
}
this.sqlMapClientTemplate.setSqlMapClient(sqlMapClient);
} //获取Hibernate的模板
protected HibernateTemplate getHibernateTemplate(){
return hibernateTemplate
}
//获取iBatis的模板
protected SqlMapClientTemplate getSqlMapClientTemplate()
{ return sqlMapClientTemplate; }
//一些Hibernate 的通用方法, //当然也可不必声明,子类通过hibernateTemplate来操作
protected void save(Object object){
hibernateTemplate.save(object);}
protected void saveOrUpdate(Object object){
hibernateTemplate.saveOrUpdate(object);
} protected void update(Object object){
hibernateTemplate.update(object);}
protected void delete(Object object)
{ hibernateTemplate.delete(object);}
protected Object getObject(Class clazz, Serializable id){
return hibernateTemplate.get(clazz, id); }
//子类通过iBatis 的sqlMapClientTemplate来操作
}
即以组合方式,将HibernateTemplate和sqlMapClientTemplate集成起来,完成类似SqlMapClientDaoSupport和HibernateDaoSupport的工作,由于Java无法多类继承,所以只得以组合方式来做。不过Spring的两个Support代码不多,自己做满好,满好--记得这是梁家辉在《棋王》上最爱说说的:)
在Spring中的主要配置是这样的:
首先配置Hibernate的SessionFactory:
<bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
<!-- 引用上述定义的数据源 -->
<property name="dataSource">
<ref local="dataSource"/>
</property>
<!-- 定义Hibernate映射文件(资源) -->
<property name="mappingDirectoryLocations">
<list>
<value>classpath:/mypack</value>
</list>
</property>
<!-- 定义Hibernate配置属性 -->
<property name="hibernateProperties">
<props>
<prop key="hibernate.dialect">${hibernate.dialect}</prop>
<prop key="hibernate.show_sql">${hibernate.show_sql}</prop>
<prop key="hibernate.cglib.use_reflection_optimizer">${hibernate.cglib.use_reflection_optimizer}</prop>
</props>
</property>
<property name="useTransactionAwareDataSource" value="true"></property>
</bean>
<bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean"> <!-- 引用上述定义的数据源 --> <property name="dataSource"> <ref local="dataSource"/> </property> <!-- 定义Hibernate映射文件(资源) --> <property name="mappingDirectoryLocations"> <list> <value>classpath:/mypack</value> </list> </property> <!-- 定义Hibernate配置属性 --> <property name="hibernateProperties"> <props> <prop key="hibernate.dialect">${hibernate.dialect}</prop> <prop key="hibernate.show_sql">${hibernate.show_sql}</prop> <prop key="hibernate.cglib.use_reflection_optimizer">${hibernate.cglib.use_reflection_optimizer}</prop> </props> </property> <property name="useTransactionAwareDataSource" value="true"></property> </bean>
再是iBatis的sqlMapClient
<bean id="sqlMapClient" class="org.springframework.orm.ibatis.SqlMapClientFactoryBean">
<property name="configLocation" value="sql-map-config.xml"/>
<property name="dataSource" ref="dataSource"/>
<property name="useTransactionAwareDataSource" value="true"></property>
</bean>
<bean id="sqlMapClient" class="org.springframework.orm.ibatis.SqlMapClientFactoryBean"> <property name="configLocation" value="sql-map-config.xml"/> <property name="dataSource" ref="dataSource"/> <property name="useTransactionAwareDataSource" value="true"></property> </bean>
两者是useTransactionAwareDataSource属性都设置为ture,看Spring的Javadoc,说这可以在多Orm框架中保持事务的一致性,即通过DataSource关联,果真如此否?我还没有确定出来。
事务管理器,用Hibernate的
<!-- 事务处理的AOP配置 -->
<bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">
<property name="sessionFactory">
<ref local="sessionFactory"/>
</property>
</bean >
<bean id="txProxyTemplate" abstract="true"
class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">
<!-- 指定事务管理器 -->
<property name="transactionManager" >
<ref local="transactionManager"/>
</property>
<!-- 指定业务策略 -->
<property name="transactionAttributes">
<props>
<prop key="get*">PROPAGATION_REQUIRED,readOnly</prop>
<prop key="add*">PROPAGATION_REQUIRED</prop>
<prop key="update*">PROPAGATION_REQUIRED</prop>
<prop key="delete*">PROPAGATION_REQUIRED</prop>
</props>
</property>
</bean>
<!-- 事务处理的AOP配置 --> <bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager"> <property name="sessionFactory"> <ref local="sessionFactory"/> </property> </bean > <bean id="txProxyTemplate" abstract="true" class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean"> <!-- 指定事务管理器 --> <property name="transactionManager" > <ref local="transactionManager"/> </property> <!-- 指定业务策略 --> <property name="transactionAttributes"> <props> <prop key="get*">PROPAGATION_REQUIRED,readOnly</prop> <prop key="add*">PROPAGATION_REQUIRED</prop> <prop key="update*">PROPAGATION_REQUIRED</prop> <prop key="delete*">PROPAGATION_REQUIRED</prop> </props> </property> </bean>
然后做两个Dao,一个是CustomerDao,这个走Hibernate,直接看其实现:
package mypack.dao;
import mypack.Customer;
public class CustomerDaoImpl extends BaseDaoImpl implements CustomerDao {
public void update(Customer customer); {
super.save(customer);;
}
}
package mypack.dao;import mypack.Customer;public class CustomerDaoImpl extends BaseDaoImpl implements CustomerDao { public void update(Customer customer); { super.save(customer);; }}
再看OrderDao的实现,这个走iBatis(先分道扬镳,再殊途同归):
package mypack.dao;
import java.sql.SQLException;
import org.springframework.orm.ibatis.SqlMapClientCallback;
public class OrderDaoImpl extends BaseDaoImpl implements OrderDao {
/**
* update ibatis
*/
public void updateOrderPrice(float rate);
{
getSqlMapClientTemplate();.update("updateOrderPrice",null);;
}
}
package mypack.dao;import java.sql.SQLException;import org.springframework.orm.ibatis.SqlMapClientCallback;public class OrderDaoImpl extends BaseDaoImpl implements OrderDao { /** * update ibatis */ public void updateOrderPrice(float rate); { getSqlMapClientTemplate();.update("updateOrderPrice",null);; }}
再在一个Service中同时用这两上Dao完成一个事务:
package mypack.service;
import mypack.Customer;
import mypack.dao.CustomerDao;
import mypack.dao.OrderDao;
public class CustomerServiceImpl implements CustomerService {
private CustomerDao customerDao;
private OrderDao orderDao;
public void updateCustomerAndOrder(Customer customer, float rate); {
customerDao.update(customer);;
orderDao.updateOrderPrice(rate);;
}
public CustomerDao getCustomerDao(); {
return customerDao;
}
public void setCustomerDao(CustomerDao customerDao); {
this.customerDao = customerDao;
}
public OrderDao getOrderDao(); {
return orderDao;
}
public void setOrderDao(OrderDao orderDao); {
this.orderDao = orderDao;
}
}
package mypack.service;import mypack.Customer;
import mypack.dao.CustomerDao;
import mypack.dao.OrderDao;
public class CustomerServiceImpl implements CustomerService {
private CustomerDao customerDao;
private OrderDao orderDao;
public void updateCustomerAndOrder(Customer customer, float rate)
{ customerDao.update(customer);
orderDao.updateOrderPrice(rate);
} public CustomerDao getCustomerDao(); { return customerDao; } public void setCustomerDao(CustomerDao customerDao); { this.customerDao = customerDao; } public OrderDao getOrderDao(); { return orderDao; } public void setOrderDao(OrderDao orderDao); { this.orderDao = orderDao; }}
插入一条Customer记录,再Update所有Order(纯粹研究,没有实际意义)
走:
package test.service;
import org.apache.log4j.PropertyConfigurator;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class SysInit
{
public static ApplicationContext factory = null;
private static String[] filepath = {"applicationContext_service.xml"};
public static void init();
{
PropertyConfigurator.configure("D:\\personalWork\\proGroup\\hiTestPro\\src\\log4j.properties");;
if (factory == null);
{
try
{
factory = new ClassPathXmlApplicationContext(filepath);;
} catch (Exception e);
{
e.printStackTrace();;
}
}
try
{
} catch (Exception e);
{
e.printStackTrace();;
}
}
public static Object getBean(String name);
{
if (factory == null);
{
init();;
}
return factory.getBean(name);;
}
public static void main(String[] args);
{
SysInit.init();;
}
}
package test.service;
import junit.framework.TestCase;
import mypack.Customer;
import mypack.service.CustomerService;
public class CustomerServiceTest extends TestCase {
protected void setUp(); throws Exception {
super.setUp();;
SysInit.init();;
}
protected void tearDown(); throws Exception {
super.tearDown();;
}
public void testupdateCustomerAndOrder();
{
CustomerService customerService = (CustomerService);SysInit.getBean("customerService");;
Customer customer = new Customer();;
customer.setId(3L);;
customer.setFirstname("xiong");;
customer.setLastname("hua");;
customer.setSex('F');;
customerService.updateCustomerAndOrder(customer, 2);;
}
}
package test.service;import org.apache.log4j.PropertyConfigurator;import org.springframework.context.ApplicationContext;import org.springframework.context.support.ClassPathXmlApplicationContext;public class SysInit{ public static ApplicationContext factory = null; private static String[] filepath = {"applicationContext_service.xml"}; public static void init(); { PropertyConfigurator.configure("D:\\personalWork\\proGroup\\hiTestPro\\src\\log4j.properties");; if (factory == null); { try { factory = new ClassPathXmlApplicationContext(filepath);; } catch (Exception e); { e.printStackTrace();; } } try { } catch (Exception e); { e.printStackTrace();; } } public static Object getBean(String name); { if (factory == null); { init();; } return factory.getBean(name);; } public static void main(String[] args); { SysInit.init();; }} package test.service;import junit.framework.TestCase;import mypack.Customer;import mypack.service.CustomerService;public class CustomerServiceTest extends TestCase { protected void setUp(); throws Exception { super.setUp();; SysInit.init();; } protected void tearDown(); throws Exception { super.tearDown();; } public void testupdateCustomerAndOrder(); { CustomerService customerService = (CustomerService);SysInit.getBean("customerService");; Customer customer = new Customer();; customer.setId(3L);; customer.setFirstname("xiong");; customer.setLastname("hua");; customer.setSex('F');; customerService.updateCustomerAndOrder(customer, 2);; }}
我测试了一下,如果iBatis的操作有问题,Customer也是没有办法插入了,所以基本上判断,这两个框架是可以做事务的。
Hibernate的缓存确实是一个问题,不过可以通过合理分配两者的工作来解决,比如Hibernate负责增删改,而ibatis只负责查询。
目前我的应用就是简要列表查询的数据由iBatis负责获取,从简要列表进入后的操作由Hibernate负责。
不过,如果这样限定后,也就没有必须管事务的事了。整合的目的只是为了提高Dao的内聚性并屏蔽掉具体实现。
iBatis主要是可以将Sql和代码解耦,使Java代码更纯一些,而Hibernate有在查询数据时有一个不好的地方是,结果集中的记录要对应Domain Class,这就限制了结果集字段的灵活性,数据库中的结果集构造是很灵活的,而不是仅对应Domain Classs。另外Hibernate还要为每条结果集构造对象,数据缓存等工作,如果仅是查询,这种工作是没有必要而费时的。
总之,我觉得Hibernate不太适合于构造简要列表时的查询,它的强项在于对一个Domain Class的增,删,改,查,而非业务数据查询。
发表评论
-
安装和使用memcached
2014-04-16 16:24 641如何将 memcached 融入到 ... -
applicationContext.xml
2013-08-09 09:05 941<?xml version="1.0&quo ... -
注释驱动的 Spring cache 缓存介绍
2013-08-08 07:04 659概述 Spring 3.1 引入了激动人心的基于注释(an ... -
Spring2.5 Annotations
2013-08-08 06:33 854完成setXxxx功能,即配置文件的 <propert ... -
Spring基于注解的缓存配置--EHCache AND OSCache
2013-08-07 23:21 1026本文将构建一个普通工程来说明spring注解缓存的使用方式, ... -
Ehcache 整合Spring 使用页面、对象缓存
2013-08-07 22:51 893Ehcache 整合Spring 使用页面、对象缓存 ... -
javassist教程和示例
2013-05-18 08:57 2008Javassist是一个执行字节 ... -
ZooKeeper官方文档
2013-05-16 17:09 1559介绍(源自ZooKeeper官方文档) 学习HBase过程 ... -
ZooKeeper -例子
2013-05-16 17:08 1206ZooKeeper ZooKeepe ... -
Spring整合Hessian访问远程服务
2013-05-15 13:44 853Spring整合Hessian访问远程服务 目录 1.1 ... -
redis
2013-05-14 11:44 767redis是一个key-value存储系统。和Memcach ... -
spring 资源访问
2013-05-13 08:26 996spring在java基础上封装了资源访问,简单易用。 R ... -
ZooKeeper——入门
2013-05-08 16:12 909ZooKeeper——入门 博客分类: ZooK ... -
分布式服务框架 Zookeeper -- 管理分布式环境中的数据(IBM)
2013-05-08 14:07 784安装和配置详解 本文 ... -
分布式协调服务---Zookeeper
2013-05-08 14:05 7741、Zookeeper overview Zookee ... -
Hibernate
2013-03-28 13:04 923一、简述 Hibernate 和 JD ... -
Apache+Tomcat集群配置详解
2013-02-01 10:52 890Apache + Tomcat集群配置详解(1) 一、 ... -
Apache+Jboss集群基于反向代理的负载均衡
2013-02-01 10:40 2490假设三台机器IP分别为172.29.128.100、172. ... -
spring + ibatis 多数据源事务(分布式事务)管理配置方法
2012-12-17 15:18 1265spring + ibatis 多数据源事务(分布式事务 ... -
Hessian序列化不设SerializerFactory性能问题
2012-10-31 09:47 1492Hessian序列化不设SerializerFactor ...
相关推荐
与Hibernate不同,iBatis不提供完整的ORM解决方案,而是将SQL和Java代码分离,使开发者有更大的灵活性来定制SQL查询。 这四个框架的集成通常按照以下步骤进行: 1. 配置Struts1:设置struts-config.xml,定义...
Spring作为容器,可以管理Hibernate和Ibatis的生命周期,通过Spring的DataSource、SessionFactory和SqlSessionFactoryBean等组件,实现对这两个数据访问层框架的配置和管理。 在压缩包子文件的文件名称列表中,我们...
这四者在实际项目中经常结合使用,Spring可以整合Hibernate和iBatis作为数据访问层,而WebWork(或Struts2)则可以与Spring结合,形成强大的Web应用架构。`Manning@2007 - Spring in Action(2nd Edition).pdf`和`...
Struts2、Hibernate和iBatis是Java Web开发中三个非常重要的开源框架,它们分别用于MVC(模型-视图-控制器)架构、对象关系映射(ORM)和SQL映射。将这三个框架整合在一起可以构建高效、灵活的Web应用程序。 **...
标题中的"springmvc_hibernate_ibatis_jdbc"指的是一个整合了SpringMVC、Hibernate、iBatis和JDBC这四种关键技术的Java应用框架。这个框架旨在提供一个全面且强大的解决方案,便于开发人员进行Web应用程序的构建。 ...
Spring MVC、Hibernate和iBatis是Java开发中常用的三大框架,它们在Web应用程序开发中各自承担着不同的职责。本教程将深入探讨这三个框架的核心概念、使用方法以及它们之间的协同工作。 **Spring MVC** 是Spring...
其中,Hibernate与iBATIS作为两种最为知名的ORM框架,各有特点与应用场景。本文将深入探讨这两种框架的主要差异,并分析其各自的优缺点。 #### 二、概念介绍 1. **Hibernate**:当前最流行的ORM框架之一,提供了一...
Struts2、Spring和iBatis是Java Web开发中常用的三大框架,它们分别负责MVC模式中的Action层、业务逻辑层和服务数据访问层。本文将详细介绍这三个框架如何整合,以及在实际项目中如何运用。 首先,Struts2作为表现...
Struts2+Spring+Hibernate和Struts2+Spring+Ibatis是两种常见的Java Web应用程序集成框架,它们分别基于ORM框架Hibernate和轻量级数据访问框架Ibatis。这两种框架结合Spring,旨在提供一个强大的、可扩展的、易于...
在Java开发中,ibatis和Hibernate都是常见的对象关系映射(ORM)框架,它们简化了数据库操作,将Java对象与数据库表之间的映射关系抽象出来,使得开发人员可以使用面向对象的方式处理数据。然而,两者在设计理念和...
iBatis与Hibernate都是Java领域内流行的ORM(Object-Relational Mapping,对象关系映射)框架,用于简化Java应用程序与数据库之间的交互。尽管它们有着相似的目标,但在实现方式、设计理念等方面存在显著差异。 ###...
struts2+ibatis+spring框架整合
本篇文章将深入探讨三个流行的Java框架:Spring、Hibernate和iBatis,它们都提供了对数据库操作的高效封装,使得开发人员能够更便捷地处理数据库事务。 首先,Spring框架以其强大的依赖注入和面向切面编程闻名,它...
在Java Web开发中,Spring、Struts、Hibernate和iBatis是四个非常重要的框架,它们分别负责不同层面的任务。Spring作为一个全面的轻量级框架,提供了依赖注入、AOP(面向切面编程)、MVC(模型-视图-控制器)等核心...
SSH整合是指将Spring、Hibernate和iBatis三个开源框架集成在一起,以实现高效、灵活的Web应用程序开发。Spring是核心的依赖注入(DI)和面向切面编程(AOP)框架,Hibernate则是一个强大的对象关系映射(ORM)工具,...