业精于勤,荒于嬉
全部博文(763)
分类: Java
2008-05-27 08:24:07
软件分层的优点:
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实例占有的资源.
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 该文件包含:
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();