Chinaunix首页 | 论坛 | 博客
  • 博客访问: 5544788
  • 博文数量: 763
  • 博客积分: 12108
  • 博客等级: 上将
  • 技术积分: 15717
  • 用 户 组: 普通用户
  • 注册时间: 2007-09-28 21:21
个人简介

业精于勤,荒于嬉

文章分类

全部博文(763)

文章存档

2018年(6)

2017年(15)

2016年(2)

2015年(31)

2014年(14)

2013年(87)

2012年(75)

2011年(94)

2010年(190)

2009年(38)

2008年(183)

2007年(28)

分类: Java

2008-05-27 08:24:07

Hiberndate概述:
  1.是连接java数据库和应用程序的中间件.
  2.Hiberndate对jdbc进行了轻量级的封装,并且在必要的时候用户还可以绕过Hiberndate,直接访问JDBC API
  3.在软件分层的架构中位于持久化层,封装了所有数据访问细节,使业务逻辑层可以专注实现业务逻辑
  4.是一种ORM映射工具,能够在建立面向对象的域模型和关系模型之间映射
 
  物理层和逻辑层:
   逻辑层为三层结构,物理层有两层(业务逻辑层和数据库层运行在同一台机器上,这台机器既是应用服务器,用是数据库服务器)

  软件分层的优点:
  1.伸缩性:
    指应用程序是否能支持更多的用户访问,如在双层的GUI应用程序中,通常对每个用户都提供一个数据库连接,而在三层的结构中
,可以采用数据库连接池机制,用少量的数据库连接支持多个用户,应用的层越少,可以增加资源的地方就越少,层数越多,可以将每层分布
在不同的机器上,比如:用一组服务器作为Web服务器,一组服务器处理业务逻辑,还有一组服务器作为数据库服务器.
  2.可维护性
     层数越多,修改起来某一部分的话,就直接可以修改某一层,这样不会影响到其他层.
  3.可扩展性:
     层数越少,修改起来就越容易破坏现有的程序,层数越多,就可以在每个层中提供扩展点,不会打破应用的整体框架.
  4.可重用性:
   指程序代码没有冗余,同一种程序能够满足多种需求,如:业务逻辑层可以被多种表述层共享,既支持基于GUI界面的表述层,也支持基于Web页面的表述层
  5.可管理性:
   分的层越多,这样项目小组中可以将工作分解给不同的人,便于管理.
 
  软件分层的缺点:
   分层越多,对软件设计人员的要求就越高,在设计阶段就要花费时间构思合理的体系结构,否则存在很多缺陷,层数越多,越难调试.
  

持久化层的加入使的层变为:  表述层->(业务逻辑层->持久层)->数据库层
     持久层封装了数据访问细节,为业务逻辑层提供了面向对象的API

 软件模型的概念:
    在软件开发领域,模型用来表示真实世界的实体,在开发的不同阶段,需要为目标系统创建不同类型的模型,在分析阶段,需要创建概念模型,在设计阶段,需要创建域模型和数据模型
    1.概念模型:用来模拟问题域中的真实实体,描述每个实体的概念和属性,和实体之间的关系,在这个阶段并没有实体的行为(也就是方法),
       目的是为了帮助更好的理解问题域,识别系统中的实体,这些实体在设计阶段很有可能变成类,实体和实体之间的关系,也就是类和类之间的关系,但是没有实体的方法

 域对象的持久化概念:
 当实体在内存中创建后,他们不可能永远存在,要么在内存中清除,要么被持久到数据库中,一旦对象被持久化,他们可以在应用再次运行时被重新读入到内存,重新构造出域对象,通常只有实体域对象才需要
 持久化,过程对象不需要持久化



用JDBC API的方法来实现数据库的访问有下面的缺点:
     业务逻辑的代码和数据库的访问代码杂在一起,使程序结构不清晰,可读性差
     在程序代码中嵌入面向关系的SQL语句,使开发人员不能完全运用面向对象的思想来编写程序
     业务逻辑和关系数据模型绑定,如果关系数据模型发生变化,如:修改了表的结构,那么必须手动修改程序
     中的代码和相关的SQL语句

   为了使业务逻辑和数据库访问细节分离,在JAVA中已经出现下面模式:
    ORM,主动域对象模式,JDO模式,CMP模式

  对象关系映射的概念:
  域模型和关系模型都是分别建立在概念模型的基础之上,域模型是面向对象的,而关系模型是面向关系的
  一般情况下,一个持久化的类和一个表对应,类的每个实力对象对应表中的一条记录

  对象持久化技术:
  Session接口向业务逻辑层提供了读,写和删除域对象的方法,它不公开任何数据访问细节,SessionImpl实现了该接口
  ,SessionFactory类负责创建Session实例,Hibernate在初始化阶段把对象-关系映射文件中的映射元数据读入到SessionFactory的
  缓存

  主动域对象模式的优点:
   BMP就是一个主动域对象模式,由EJB实现本身的访问细节,   在实体域对象中封装自身的数据访问细节,过程域对象完全负责逻辑,使程序结构更加清晰,
   如果关系数据模型发生改变,只需要修改主动域对象的代码,不需要修改过程域对象的业务方法.
  主动域对象的缺点:
   在实体对象中仍然包含SQL语句,每个实体域对象都负责自身的数据访问实现,把这一职责分散到对个对象中,这会导致实体域对象重复实现一些共同的数据访问操作m
   造成重复代码.
   ‌因为主动域对象本身是业务逻辑层,因此采用主动域对象模式时,整个应用仍然是三层结构,并没有从业务逻辑层分离出独立的持久化层
  

  JDO(Java Data Objects)模式:
   是SUN公司指定的描述对象持久化语义的标准API,因此,采用JDO模式时,整个应用为四层应用结构,表述层->业务逻辑层->JDO API,JDO实现,JDBC API,数据库层,
   严格的说 JDO并不是对象-关系映射的接口,因为它支持把对象持久化到任意一种存储系统中,包括(关系数据库,面向对象的数据库,基于XML的数据库,其他专有存储系统)
  
  EJB:
    EJB容器封装了对象-关系映射及数据访问细节,CMP和ORM的相似在于,两者都提供对象-关系映射服务,都把对象持久化的任务从业务逻辑程序中分离出来,区别在于CMP持久化
    实体EJB组件,ORM持久吧POJO(Plain Old Java Object(普通又古老的JAVA对象)),它是普通的基于Java Bean形式的实体域对象, 用JDBC API的方法来实现数据库的访问有下面的缺点:
     业务逻辑的代码和数据库的访问代码杂在一起,使程序结构不清晰,可读性差
     在程序代码中嵌入面向关系的SQL语句,使开发人员不能完全运用面向对象的思想来编写程序
     业务逻辑和关系数据模型绑定,如果关系数据模型发生变化,如:修改了表的结构,那么必须手动修改程序
     中的代码和相关的SQL语句

   为了使业务逻辑和数据库访问细节分离,在JAVA中已经出现下面模式:
    ORM,主动域对象模式,JDO模式,CMP模式

  对象关系映射的概念:
  域模型和关系模型都是分别建立在概念模型的基础之上,域模型是面向对象的,而关系模型是面向关系的
  一般情况下,一个持久化的类和一个表对应,类的每个实力对象对应表中的一条记录

  对象持久化技术:
  Session接口向业务逻辑层提供了读,写和删除域对象的方法,它不公开任何数据访问细节,SessionImpl实现了该接口
  ,SessionFactory类负责创建Session实例,Hibernate在初始化阶段把对象-关系映射文件中的映射元数据读入到SessionFactory的
  缓存

  主动域对象模式的优点:
   BMP就是一个主动域对象模式,由EJB实现本身的访问细节,   在实体域对象中封装自身的数据访问细节,过程域对象完全负责逻辑,使程序结构更加清晰,
   如果关系数据模型发生改变,只需要修改主动域对象的代码,不需要修改过程域对象的业务方法.
  主动域对象的缺点:
   在实体对象中仍然包含SQL语句,每个实体域对象都负责自身的数据访问实现,把这一职责分散到对个对象中,这会导致实体域对象重复实现一些共同的数据访问操作m
   造成重复代码.
   ‌因为主动域对象本身是业务逻辑层,因此采用主动域对象模式时,整个应用仍然是三层结构,并没有从业务逻辑层分离出独立的持久化层
  

  JDO(Java Data Objects)模式:
   是SUN公司指定的描述对象持久化语义的标准API,因此,采用JDO模式时,整个应用为四层应用结构,表述层->业务逻辑层->JDO API,JDO实现,JDBC API,数据库层,
   严格的说 JDO并不是对象-关系映射的接口,因为它支持把对象持久化到任意一种存储系统中,包括(关系数据库,面向对象的数据库,基于XML的数据库,其他专有存储系统)
  
  EJB:
    EJB容器封装了对象-关系映射及数据访问细节,CMP和ORM的相似在于,两者都提供对象-关系映射服务,都把对象持久化的任务从业务逻辑程序中分离出来,区别在于CMP持久化
    实体EJB组件,ORM持久吧POJO(Plain Old Java Object(普通又古老的JAVA对象)),它是普通的基于Java Bean形式的实体域对象,




Hibernate API 简介:

  访问数据库操作的接口包括:Session,Transaction,和Query
  配置Hibernate的接口:Configuration
  同调接口,使应用程序接受Hibernate内部发生的事件,做出相应的回应,这些接口包括:Interceptor,Lifecycle,Validatable接口
  用于扩展Hibernate的功能的接口,UserType,CompositeUserType和IdentifierGenerator接口,需要的话,应用程序可以扩展这些接口

  Hibernate内部封装了JDBC,JTA(JAVA Transaction(交易) API)和JNDI(Java Naming and Directory(目录) Interface)
   JDBC提供底层的数据访问操作,只要用户提供了相应的JDBC驱动程序,Hibernate可以访问任何一个数据库系统,JNDI和JTA使Hibernate能后和J2EE
   应用服务器集成
 
   所谓轻量级的封装是因为Hibernate并没有完全封装JDBC,Java应用既可以通过Hibernate API访问数据库,还可以绕过Hibernate API,直接通过JDBC API来访问数据库
 Hibernate的核心接口:
  所有的Hibernate应用都会访问Hibernate的5个核心接口:
   Configuration接口: 配置Hibernate且根启动Hibernate,Hibernate应用通过Configuration实例来指定对象-关系映射文件的位置或者动态 配置Hibernate的属性,创建SessionFactory对象
   SessionFactory接口:初始化Hibernate,充当数据存储源的代理,一个SessionFactory实例对应一个数据存储源,SessionFactory有以下特点:它是线程安全的,也就是说它的同一个
   实例可以被应用的多个线程共享,  SessionFactory是一个重量级的,是因为它需要一个很大的缓存,用来存放预定义的SQL语句以及映射元数据等,创建Session对象
   Session接口:Session也被称为持久化管理器,负责保存,更新,删除,加载和查询对象.(Hibernate中的Session和JAVA Web中的HttpSession 是没有任何关系的)
   Transaction:管理事务,是Hibernate的数据库事务接口,它对底层的事务接口做了封装,底层的事务接口包括: JDBC API,JTA,CORBA(Common Object Request Broker Architecture) API
   Query和Criteria接口:执行数据库查询,以及控制执行查询的过程,Query实例包装了一个HQL查询语句,但是HQL查询语句是面向对象的,它引用类名及类的属性名,而不是表名及表的字段名,
   Cruterua接口完全封装了基于字符串形式的查询语句,比Query接口更加面向对象,Criteria接口擅长执行动态查询
 
 回调接口:
   当一个对象发生了特定的事件,如删除,保存 等,Hibernate应用可以通过回调来响应,回调接口实现方式可以分为两类:
     Lifecycle和Validatable接口:由持久化类来实现这两个接口,Lifecycle接口使持久化类的实例能够响应删除,保存等事件, Validatable接口使持久化类的实例在被保存之前进行数据验证,
     而Validatable接口不用由持久化类来实现,应用程序可以定义专门实现Interceptor接口的类,Interceptor实现类负责响应持久化类的实例能够删除,保存等事件

 Hibernate映射类型接口:
    Type接口:表示Hibernate映射类型,用于把域对象映射为数据库的关系数据,Hibernate为Type接口提供了各种实现类,它们代表具体的Hibernate映射类型:
      PrimitiveType类:映射JAVA基本类型,DateType映射JAVA日期类型,BinaryType映射JAVA Byte[]类型

 可扩展的接口:
     Hibernate提供的多数功能是可配置的,允许用户选择适当的Hibernate内置,如果Hibernate访问XXX数据库,可配置为:
       hibernate.dialect=net.sf.hibernate.dialect.XXXDialect
     可见,当Hibernate内置策略不能满足需求时,Hibernate循序用户实现接口或扩展特定类的方式,定义客户化的策略.Hibernate的扩展包括以下内容:
          定制主键的生成策略:IdentifierGenerator接口.
          定制本地SQL方言:Dialect抽象类.
          定制JDBC连接管理:ConnectionProvider接口.
          定制事务管理:TransactionFactory,Transaction和TransactionManagerLookup接口.
          定制ORM策略:ClassPersister接口.
          定制属性访问策略:PropertyAccessor接口.
          创建代理:ProxyFactory接口.
          定制客户化映射类型:UserType和CompositeUserType接口.



Hibernate基础知识:
 Hibernate中持久化类符合JavaBean的规范,如果把get方法写成getname()或者getNAME(),会导致Hibernate在运行时抛出以下异常:
  net.sf.hibernate.PropertyNotFoundException:Could not find a getter for property name in class mypack.XXXXXXX
 如果持久化类的属性是boolean类型,那么他的get方法名可以用getXXX(),也可以用isXXXX()

无论是基于CMP的实体EJB,还是基于BMP的实体EJB,它们的共同特点都是在EJB容器中,而Hibernate支持的持久化类不过是普通的JAVA类,
它能够运行在任何一种Java环境中

DTD(Document Type Definition  文档类型定义)
  它对XML文件的语法和格式做了定义,Hibernate的XML解析器将根据DTD来核对XML文件的语法.
  每一个XML文件都有独立的DTD文件


文件映射:
 映射文件xml一般以.hbm.xml结束,如果需要映射多个持久化类,那么既可以映射在同一个XML文件中,也可以为每一个类单独创建一个映射文件
 ,映射文件名和类同名,一般用一个类映射一个文件,因为在团队开发中,有利于管理和维护映射文件.

Hibernate采用XML文件来配置对象-关系映射,有以下优点:
  Hibernate既不会影响到上层域模型,也不会影响到下层数据库模型
  软件开发人员可以独立设计域模型,不必强迫遵守任何规范
  数据库设计人员可以独立设计数据库模型,不必强迫遵守任何规范
  对象-关系映射不依赖任何程序代码,如果需要修改对象-关系映射,只需要修改XML文件,不需要修改任何程序,维护更加方便


SessionFactory的内置缓存中存放了Hibernate配置信息和映射元数据信息等

Hibernate中的Session:
  Session是一个轻量级对象,通常将每一个Session实例和一个数据库事务绑定,也就是说,每执行一个数据库事务,都应该先创建一个新的
  Session实例,无论事务执行成功与否,最后都应该调用Session的close()方法,从而释放Session实例占有的资源.



bm2java和hbm2ddl工具:
  为了简单开发,Hibernate提供了一些实用工具,用于映射文件,Java源文件和数据库Schema之间的转化
   hbm2java:根据映射文件自动生成java源文件. (位于Hibernate的扩展包中)
   hbm2ddl:根据映射文件自动生成数据库Schema.  (位于Hibernate软件包中)
   XDoclet:根据带有XDoclet标记的java源文件生成映射文件.
   Middlegen:根据数据库Schema自动生成映射文件.


Ant 中build.xml文件target的含义:
 prepare target:如果存在classes子目录,先将它删除,接着重新创建classes子目录,把src目录下的所扩展名
 为properties,hbm.xml或者cfg.xml的文件拷贝到classes目录下.
 codegen target:利用hbm2java工具生成java源代码,这些java源代码村放在src子目录中.
 compile target:编译src子目录下的所有java源文件,编译生成的类文件村放在class子目录下.
 schema target:利用hbm2ddl工具生成数据库Schema,数据库Schema的脚本文件村放在schema子目录下,文件名为XXXXX.sql
 run target:运行.


 hbm2java工具除了能根据XX.xml生成.java源文件,还能为类生成相关的查询类
 hbm2java工具的配置文件codegen.hbm.xml  该文件包含:
   
         
                        siffix="YYY" package="PP"/>
   

   
    元素的子元素子元素设定具体的代码生成器,BasicRender生成器用于生成持久化类的源文件,
    FinderRednder生成器用于生成相关的查询类的源文件,suffix属性和package属性,其中suffix属性指定查询类的名字
    的后缀,当suffix属性为"YYY",表明查询类的名字的形式为"XYYY".
 
 hbm2ddl工具:
  从映射文件到数据库Schema的转换工具,名为SchemaExport或hbm2ddl工具,执行改任务的java类为net.sf.hibernate.tool.hbm2ddl.SchemaExportTask

 Middlegen工具:
  根据已经存在的数据库Schema自动生成映射文件.
 
 XDoclet工具:
  根据已有的java源文件自动生成映射文件



hibernate查询方式举例

1 单个对象

a) Query query=session.createQuery("from ConsortBean a where a.person.id=?");
    query.setString(0,pb.getId());//参数从零开始
    List list=query.list();

b) Query query=session.createQuery("from ConsortBean a where a.person.id=:id");
    query.setString("id",pb.getId());
   List list=query.list();

c) List list =session.find(
 "from ConsortBean a where a.person.id=?",
 pb.getId(),
 Hibernate.STRING);

2 分页

int pagecount = 10;//每页数量


..
q =
session.createQuery(
"from FootPayRequestBean as fprb where fprb.state=? order by fprb.contractID");
q.setString(0, type);

q.setFirstResult(page * pagecount);//page从0开始
q.setMaxResults(pagecount);
l = q.list();
 

3 求count()

((Integer) session.iterate("select count(*) from ConsortBean").next() ).intValue();

4 联合查询

Query query=session.createQuery("select a from ConsortBean a,PersonBean b where a.person.id=b.id and b.name like ?");//对象别名
query.setString(0,"%管%");
List list=query.list();

阅读(1467) | 评论(0) | 转发(0) |
0

上一篇:日记 [2008年05月25日]

下一篇:框架

给主人留下些什么吧!~~