免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2666 | 回复: 0
打印 上一主题 下一主题

实例详解spring中对hibernate的支持-HibernateTemplate [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-11-13 14:10 |只看该作者 |倒序浏览

spring中对hibernate的支持是非常强大的,从一个简单的例子就看得出来,从这个例子中我们还将对所谓的轻量级容器做一些讨论。
源自:
JavaFeng
(
个人网站
)   
  spring中对hibernate的支持是非常强大的,从一个简单的例子就看得出来,从这个例子中我们还将对所谓的轻量级容器做一些讨论。
  首先需要配置数据源,通常我们有两种方式获得Connection,一是自己编写代码获得连接,二是从JNDI环境中得到DataSource,然后产生一个Connection。无论怎样,既然是spring下面的对象,就应该注册到配置文件中。假设我们需要一个连接mysql下面一个叫做examer的数据库,手动方式的配置是:

  •   
  •     com.mysql.jdbc.Driver
  •   
  •   
  •     jdbc:mysql://localhost/examer
  •   
  •   
  •     root
  •   
  •   
  •     
  •   

  •   很好读是不是?假如我们使用JNDI数据源,那么dataSource的声明就应该是:

  •   
  •     java:compenvjdbcspringExamer
  •   

  •   你需要在JNDI环境中绑定一个名为jdbc/springExamer的东西,这段代码才有实际意义。另外需要提醒的是,所有的bean声明,它的id必须是唯一的。
      在本系统中,数据库操作是被hibernate封装起来的,所以dataSource是不需要注入到具体的逻辑类中,它只会被注给hibernate的sessionFactory。
      按照常规思路,我们需要在spring中注册hibernate的sessionFactory,它应该是我们自己编写的一个类,获得dataSource,返回sessionFactory,其他的逻辑类通过这个sessionFactory获得session进行数据库操作。
      但是我们有另外一种选择,spring直接提供了对sessionFactory的封装,你只需要注册一个spring自己的类,给它提供必须的属性,它会返回一个org.springframework.orm.hibernate.HibernateTemplate,这个类封装了add、del等操作,它的封装程度相当高,通过它来编写hibernate应用非常简单。但是问题出来了,我们该如何选择?
      表面上看,使用spring自己的库无疑更加简单,但是请注意,spring是一个轻量级的框架,所谓轻量级,一个重要特征就是无侵入性,也就是你使用这套框架,不会被它绑定,被spring管理的类,应该不需要使用它的接口和抽象类,这样你的系统不会对spring产生依赖。但是如果你使用了spring封装的方式去操作hibernate,就必须继承org.springframework.orm.hibernate.support.HibernateDaoSupport类,这导致了绑定。所以做这样的选择是有点痛苦的,如果有一天spring框架不存在了,你的代码怎么升级维护?具体问题只能具体分析,在我们的应用中,完全使用了spring封装的HibernateTemplate,它太好用了,所以容易上瘾
      假设我们有一张student表,结构很简单:
      
  • id      自动增长
  •   name     varchar(40)
  •   password   varchar(32)
  •   grade        int(4)      年级
  •   sex     
    Boolean
          性别(true为男,false为女)
      设计一个Student类来映射这张表:
  • /*
  • * 创建日期 2005-3-17
  • */
  • package net.bromon.spring.examer.pojo;

  • /**
  • * @author Bromon
  • */
  • public class Student  
  • {
  •     private int id;
  •     private
    String
    name;
  •     private
    String
    password;
  •     private int grade;//年级
  •     private boolean sex;
  •      
  •     getset方法……….
  • }
      编写Student.hbm.xml,让hibernate知道如何去关联student表和Student类,该文件和Student.java在同一目录:

  •   
  •     
  •       
  •     
  •          
  •     
  •     
  •     
  •     
  •   

  •   然后我们可以在spring中配置sessionFactory:

  •   
  •     
  •   
  •          
  •   
  •     
  •       net.sf.hibernate.dialect.MySQLDialect
  •     
  •   
  •          
  •   
  •     
  •       classpath:/netbromonspringexamerpojo
  •     
  •   

  •   其中引用了我们之前注册过的dataSource,mappingDirectoryLocations属性指明了.hbm.xml文件在哪里路径,该文件夹下面的.hbm.xml文件会被全部加载。
      一切都准备就绪,现在我们要加入一个StudentManager类,来进行增删查改的操作:
  • /*
  • * 创建日期 2005-3-17
  • */
  • package net.bromon.spring.examer.student;

  • import net.bromon.spring.examer.pojo.Student;

  • import org.springframework.orm.hibernate.HibernateTemplate;
  • import org.springframework.orm.hibernate.LocalSessionFactoryBean;
  • import org.springframework.orm.hibernate.support.HibernateDaoSupport;

  • /**
  • * @author Bromon
  • */
  • public class StudentManager extends HibernateDaoSupport
  • {
  •     private LocalSessionFactoryBean sessionFactory;
  •     private HibernateTemplate ht;
  •     public StudentManager()
  •     {
  •         this.ht=super.getHibernateTemplate();
  •     }
  •      
  •     public void add(Student s)
  •     {   
  •         ht.save(s);//插入一条数据只需要这一行代码
  •     }
  • }
      该类只演示了如何增加一个Student,HibernateTemplate还封装了很多有用的方法,请查阅spring文档。StudentManager中的sessionFactory是由spring注入的,但是StudentManager并没有对sessionFactory做任何的处理,这是因为所有的处理都被HibernateDaoSupport.getHibernateTemplate()封装。整个StudentManager中也看不到任何的异常处理,他们也都被基类封装了。
      最后一个步骤就是在spring中注册StudentManger,然后向它注入sessionFactory:

  •   
  •     
  •   

  •   所有的配置都完成了,下面做单元测试:
  • /*
  • * 创建日期 2005-3-17
  • */
  • package net.bromon.spring.examer.student.test;

  • import java.io.
    FileInputStream
    ;

  • import org.springframework.beans.factory.xml.XmlBeanFactory;
  • import org.springframework.context.ApplicationContext;
  • import org.springframework.context.support.ClassPathXmlApplicationContext;

  • import net.bromon.spring.examer.pojo.Student;
  • import net.bromon.spring.examer.student.StudentManager;
  • import junit.framework.
    TestCase
    ;

  • /**
  • * @author Bromon
  • */
  • public class TestStudentManager extends
    TestCase
    {

  •     public void testAdd()  
  •     {
  •         try
  •         {
  •             ApplicationContext context =new ClassPathXmlApplicationContext("springConfig.xml");
  •             
  •             Student s=new Student();
  •             s.setName("bromon");
  •             s.setPassword("123");
  •             s.setGrade(3);
  •             s.setSex(true);
  •             
  •             ((StudentManager)context.getBean("studentManager")).add(s);
  •         }catch(
    Exception
    e)
  •         {
  •             e.printStackTrace();
  •         }
  •     }

  • }
      Spring已经将hibernate的操作简化到了非常高的程度,最关键的是整个开发可以由设计来驱动,如果一个团队对spring有足够的熟悉,那么完全可以由设计师规划所有的类,整理清楚类之间的关系,写成配置文件,然后编写hibernate映射文件,将数据表与pojo关联,成员就可以完全在设计方案内工作,利用spring封装好的hibernate模版,开发起来速度非常快,调试也很容易。它能够解决如何在团队内贯彻设计方案的问题。
      由于本文不讲解hibernate的使用,所以相关内容请查阅hibernate文档。
       

    本文来自ChinaUnix博客,如果查看原文请点:http://blog.chinaunix.net/u1/35830/showart_2093592.html
  • 您需要登录后才可以回帖 登录 | 注册

    本版积分规则 发表回复

      

    北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
    未成年举报专区
    中国互联网协会会员  联系我们:huangweiwei@itpub.net
    感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

    清除 Cookies - ChinaUnix - Archiver - WAP - TOP