在Web项目中一般会把各个web框架结合在一起使用,比如spring+hibernate,spring+ibatis等,如此以来将其他的框架整合到spring中来,便有些少许的不便,当然spring已经把这种整合变得很简单了。本人结合在项目中使用过的spring和ibatis,以及和mybatis的整合,进而小测了一下和hibernate的整合,望批评指正。

一、spring、hibernate整合

Spring中不但可以选择SpringJDBC作为持久化技术,还可以选择Hibernate、iBatis、JPA、JDO等多种类型的持久化技术。Spring提供了方便的模板类对原ORM进行简化封装。让我们先回忆一下单独使用Hibernate时的过程,我们需要编写好一个对象关系的映射文件命名形式如xxx.hbm.xml,然后通过Hibernate的配置文件hibernate.cfg.xml 将所有的xxx.hbm.xml 映射文件组装起来,最后通过两行经典的代码得到SessionFactory的实例,如

Configuration cfg = new Configuration().configure("hiberante.cfg.xml");

SessionFactory sessionFactory = cfg.buildSessionFactory();

如果使用注解的话使用AnnotationConfiguration对象,现在Spring为创建SessionFactory提供了一个好用的FactoryBean工厂类:org.springframework.orm.hibernate3.LocalSessionFactoryBean,通过配置一些必要的属性,即可获取一个SessionFactoryBean。

1.使用HibernateTemplate

Hibernate.cfg.xml文件中配置了数据源、对象关联映射文件以及Hibernate控制属性信息。因此集成到spring中以后要把该文件中内容都拿过来如下:

<context:componet-scan base-package="com.demo" />

    <context:property-placeholder location="classpath:jdbc.properties" />
    <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close" >
     <property name="driverClassName" value="${jdbc.driverClassName}"/>
     <property name="url" value="${jdbc.url}"/>
     <property name="username" value="${jdbc.username}"/>
     <property name="password" value="${jdbc.password}"/>
    </bean>
    <bean id="sessionFactory" class="org.springframework.org.hiberante3.LocalSessionFactoryBean" >
     <property name="dataSource" ref="dataSource"/>
     <property name="mappingResources" >
         <list>
                <value>com.demo.hibernate.domain/xxx.hbm.xml</value>
            </list>
     </property>
     <property name="hiberanteProperties">
             <props>
                 <prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect</prop>
                 <prop key="hibernate.show_sql">true</prop>
         </props>
     </property>
     </bean>      <bean id="hiberanteTemplate" class="org.springframework.orm.hiberante3.HibernateTemplate">
     <property name="sessionFactory" ref="sessionFactory"/>
     </bean>      <bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">
     <property name="sessionFactory" ref="sessionFactory"/>
     </bean>
     <tx:annotation-driven transaction-manager="transactionManager"/> 

如上面的配置所示,基于模板类使用hibernate比较简单,spring提供了使用模板的支持类HibernateDaoSupport类,并通过getHibernateTemplate()方法向子类开放模板类实例的调用。如果不想在每个dao里面都加上HibernateTemplate,可以将其放在一个BaseDao里面,然后通过扩展该类创建一个使用HibernateTemplate的Dao,使用时直接getHibernateTemplate().op(obj) 就可以了。也可以将我们自己的Dao实现直接继承HibernateDaoSupport类同时实现Dao接口,该方式也很简单。剩下的就和单独使用Hibernate区别很小了。

对于lob类型的数据,我们还需要在Spring配置文件重定一个Lob数据处理器,让SessionFactory拥有处理Lob数据的能力。在SessionFactory里引用该bean:

<bean id="lobHandler" class="org.springframework.jdbc.support.lob.DefaultLobHandler" lazy-init="true" />

2.使用原生Hibernate API

我们可以通过注入SessionFactory 直接通过getCurrentSession()能够获取和当前线程绑定的Session。Hibernate自身具备了获取和事务线程绑定的Session对象的功能,这与在Spring的HibernateTemplate中使用和事务绑定的Session相同。因此使用原生的API,同样和spring和事务管理器一起工作。和使用template不同的是原生API抛出的异常是Hibernate异常。

3.使用注解

Hibernate通过AnnotationConfiguration的addAnnotatedClass和addPackage方法加载使用JPA注解的实体类,获取映射的元数据信息,并在此基础上创建SessionFactory实例。spring专门提供了一个配套的AnnotationSessionFactoryBean,用以创建基于JPA注解的SessionFactory,该类扩展了LocalSessionFactoryBean类,增强的功能是可以根据实体类的注解获取ORM的配置信息。也允许混合使用XML配置和注解配置对象关系映射,Hibernate内部自动整合这些元数据信息,并不会产生冲突。

此外,Spring以防Web层访问Service层延迟加载的对象,专门提供了一个OpenSessionInViewFilter过滤器,它的主要功能是使每个请求过程绑定一个Hibernate Session,即使最初的事务已经完成了,也可以在Web层进行延迟加载的操作。OpenSessionInViewFilter过滤器将HibernateSession绑定到请求线程中,它将自动被Spring的事务管理器探测到,因此其使用与使用HibernateTransactionManager或JtaTransactionManager进行事务管理的环境,也可以用于非只读事务的数据操作中。

二、spring集成ibatis/mybatis

ibatis的后续版本改名叫mybatis,现在两者都被大家经常使用。两者的最大不同个人感觉是mybatis提供了接口绑定,你不需要再去实现Dao接口,而直接可在Service层调用,将注意力集中在映射文件上即可。ibatis的核心类是SqlMapClient,XmlSqlMapClientFactoryBean通过读取文件中的sqlMapConfig(当然包括很多的sqlMap),构建一个SqlMapClient,其通过sqlMap来执行映射的每个SQL语句;mybatis的核心类是SqlSessionFactory,SqlSessionFactoryBuilder读取配置文件(或注解)创建一个SqlSessionFactory,其通过SqlSession来执行已经映射的SQL语句。下面是两者和spring集成的配置:

1.Ibatis需要自己在单独注入各个DAO文件,如

    <bean id= "xxxDao" class ="com.demo.ibatis.dao.impl.xxxDaoImpl">
             <property name ="sqlMapClient" ref="sqlMapClient" />
    </bean >
      <bean id ="yyyDao" class= "com.demo.ibatis.dao.impl.yyyDaoImpl" >
             <property name ="sqlMapClient" ref="sqlMapClient" />
    </bean >   
    <bean id ="zzzDao" class= "com.demo.ibatis.dao.impl.zzzDaoImpl" >
             <property name ="sqlMapClient" ref="sqlMapClient" />
    </bean >
    在spring-prop.xml文件中配置sqlMapClient,如
    <bean id= "sqlMapClient" class= "org.springframework.orm.ibatis.SqlMapClientFactoryBean" > 
        <property name ="configLocation" value= "classpath:ibatis/ibatis-config.xml" />  
        <property name ="dataSource" ref="clopsDataSource" />
        <property name ="lobHandler" ref="lobHandler"/>
    </bean >     如property指定的configuration的位置一样,要有<sqlMapConfig>的配置,并将各个xml文件引入进来,ibatis-config.xml如下:
    <sqlMapConfig>
         <settings  useStatementNamespaces= "true"   cacheModelsEnabled= "true"   enhancementEnabled= "true"
             lazyLoadingEnabled= "true"  maxRequests= "32" maxSessions= "10" maxTransactions= "5"  />
         <sqlMap resource ="ibatis/xxx.xml" />
         <sqlMap resource ="ibatis/yyy.xml" />
         <sqlMap resource ="ibatis/zzz.xml" />
......
    </sqlMapConfig>     2.而在Mybatis中则不需要这样配置:
      在spring-prop中指定sqlSessionFactory,如,
      <bean id= "sqlSessionFactory" class= "org.mybatis.spring.SqlSessionFactoryBean" >
             <property name ="dataSource" ref="dataSource" />
             <property name ="typeAliasesPackage" value= "com.demo.mybatis.model" />
             <property name ="mapperLocations" value= "classpath*:mapper/**/*.xml" />
      </bean >
      <bean id ="sqlSession" class= "org.mybatis.spring.SqlSessionTemplate" >
             <constructor-arg index ="0" ref="sqlSessionFactory" />
             <constructor-arg index ="1" value="BATCH" />
      </bean >
      <bean class ="org.mybatis.spring.mapper.MapperScannerConfigurer">
             <property name ="basePackage" value= "com.demo.mybatis.dao" />
             <property name ="sqlSessionTemplate" ref= "sqlSession" />
      </bean >
      其中各种mapper文件在由mapperLocations指定。mybatis相对简单些。

使用时类似上面的Hibernate,ibatis可将sqlMapClientTemplate直接注入,或者继承SqlMapClientDaoSupport类同时实现Dao接口,通过getSqlMapClientTemplate()方法或者sqlMapClient进行操作。注意上述ibatis直接注入的是sqlMapClient,其实sqlMapClientTemplate的构造函数引入了一个sqlMapClient,其使用的方法均来自sqlMapClient。

Mybatis与spring的集成因对数据处理的不同方式而不同,上述方式是采用MapperScannerConfigurer的处理方式,且采用了注解形式,还可以使用MapperFactoryBean、SqlSession、SqlSessionDaoSupport的数据处理方式,使用后两种方式时需要自己实现Dao接口,而对于MapperFactoryBean其直接指定Dao接口mapperInterface。

Spring与Hibernate、Mybatis整合的更多相关文章

  1. spring jpa和mybatis整合

    spring jpa和mybatis整合 前一阵子接手了一个使用SpringBoot 和spring-data-jpa开发的项目 后期新加入一个小伙伴,表示jpa相比mybatis太难用,多表联合的查 ...

  2. spring和hibernate的整合

    阅读目录 一.概述 二.整合步骤 1.大致步骤 2.具体分析 一.概述 Spring整合Hibernate有什么好处? 1.由IOC容器来管理Hibernate的SessionFactory 2.让H ...

  3. SSH(Spring SpringMVC Hibernate)框架整合

    项目说明: 使用SSH(Spring SpringMVC Hibernate)框架整合添加部门功能 项目结构   1.导入依赖jar包 <!--单测--> <dependency&g ...

  4. 转载 Spring、Spring MVC、MyBatis整合文件配置详解

    Spring.Spring MVC.MyBatis整合文件配置详解   使用SSM框架做了几个小项目了,感觉还不错是时候总结一下了.先总结一下SSM整合的文件配置.其实具体的用法最好还是看官方文档. ...

  5. Spring MVC、MyBatis整合文件配置详解

    Spring:http://spring.io/docs MyBatis:http://mybatis.github.io/mybatis-3/ Building a RESTful Web Serv ...

  6. Spring+Struts2+Hibernate的整合

    这篇主要采用Maven搭建Spring+Struts2+Hibernate的整合项目,复习一下SSH框架,虽然spring提供自己的MVC框架, 但是Spring也提供和其他框架的无缝整合,采用组件形 ...

  7. Mybaits-从零开始-Spring、Spring MVC、MyBatis整合(未万待续)

    Spring.Spring MVC.MyBatis整合(未万待续)

  8. Spring+Struts2+Hibernate框架整合流程

    一:基本步骤 新建Maven项目,导入相关依赖(推荐) 在WEB-INF的web.xml中进行配置 ————–Hibernate配置 —————- 创建entity包,创建数据库相关实体类 根据实体类 ...

  9. Spring、Spring MVC、MyBatis整合文件配置详解

    原文  http://www.cnblogs.com/wxisme/p/4924561.html 主题 MVC模式MyBatisSpring MVC 使用SSM框架做了几个小项目了,感觉还不错是时候总 ...

  10. 【转】Spring、Spring MVC、MyBatis整合文件配置详解

    见:http://www.tuicool.com/articles/eyINveF web.xml的配置 web.xml应该是整个项目最重要的配置文件了,不过servlet3.0中已经支持注解配置方式 ...

随机推荐

  1. bzoj 3629 [JLOI2014]聪明的燕姿(约数和,搜索)

    [题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=3629 [题意] 给定S,找出所有约数和为S的数. [思路] 若n=p1^a1*p2^a ...

  2. Hierarchical cluster算法介绍

    突然想记录几个聚类算法,由于实力有限就先介绍一下层次聚类算法(Hierarchical cluster algorithm),这个聚类算法思想简单,但实现起来感觉复杂度挺大:以前看过<集体智慧编 ...

  3. 安装 RabbitMQ C#使用-摘自网络(包括RabbitMQ的配置)

    1.什么是RabbitMQ.详见 http://www.rabbitmq.com/ . 作用就是提高系统的并发性,将一些不需要及时响应客户端且占用较多资源的操作,放入队列,再由另外一个线程,去异步处理 ...

  4. js滑动门及对像的使用

    function scrollDoor() { } scrollDoor.prototype = { sd: function (menus, divs, openClass, closeClass) ...

  5. B+树|MYSQL索引使用原则

    MySQL一直了解得都不多,之前写sql准备提交生产环境之前的时候,老员工帮我检查了下sql,让修改了一下存储引擎,当时我使用的是Myisam,后面改成InnoDB了.为什么要改成这样,之前都没有听过 ...

  6. New full duplex HTTP tunnel implementation (client and server)

    https://issues.jboss.org/browse/NETTY-246?page=com.atlassian.jirafisheyeplugin:fisheye-issuepanel —— ...

  7. Spring4整合Hibernate4详细示例

    1. Spring整合Hibernate,主要是解决什么问题? a.让Spring提供的IOC容器来管理Hibernate的SessionFactory b.让Hibernate使用Spring提供的 ...

  8. UVALive 7274 Canvas Painting (优先队列)

    Canvas Painting 题目链接: http://acm.hust.edu.cn/vjudge/contest/127406#problem/C Description http://7xjo ...

  9. HDU 5510 Bazinga (2015沈阳现场赛,子串判断)

    Bazinga Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total Sub ...

  10. [iOS基础控件 - 6.9] 聊天界面Demo

    A.需求 做出一个类似于QQ.微信的聊天界面 1.每个cell包含发送时间.发送人(头像).发送信息 2.使用对方头像放在左边,我方头像在右边 3.对方信息使用白色背景对话框,我方信息使用蓝色背景对话 ...