您的位置:首页 > 其它

Hibernate学习_002_web开发中一些剪不断、理还乱的关系总结(持续更新)

2014-08-06 22:55 369 查看
掐指一算,从大二开始学习java,到用MVC servlet开发学校简单的web,再到用SSH开发一些web项目,学到了不少技术,但是也许是很长一段时间,都是通过学习视频,马上将所学用在项目中,也有不少项目中框架是前人搭建好了,我仅仅是完成一些简单业务逻辑,所有很多细节,以前并没有在意。最近反思,发现很多东西以前都是模糊的,现在在学习新知识的同时,开始慢慢的总结。希望自己早日将自己所学的零零散散的知识形成一个完整的体系。

其实我们不管是在用MVC开发时,还是用SSH,常常会不自觉的用到了一种模式,这种模式就是Facade模式,也就是我们常常说到的门面模式。

那么究竟什么是门面模式呢?其实,这里举一个简单的例子,大家就能很清晰的知道什么是门面模式了,想想看,我们在用MVC模式进行web开发的时候,我们总是会构建三层 。Model层,我觉得可以理解为我们所说的Java Bean把,Visual层,可以理解为视图层,还有一个Control层,这个可以理解为Servlet,一般我们会在Servlet中调用dao来操作数据库。现在我们设想一种情景,假设现在我们有一个操作,要调用Dao中的两个方法,这个时候我们一般是不会在servlet中通过dao来调用两次dao中的方法的,对吧,那一般会怎么实现呢?其实一般的实现可能是这样一种情景,在Dao中定义了一个方法methodA(),通过这个方法再去调用我们原本要调用的那两个方法。这样我们在servlet中只需要去调用methodA()即可。从而将实际调用的两个方法对外部隐藏。这个时候,这个methodA()其实就是充当那原本要调用的两个方法的门面。这就是门面模式。说到这里,是不是感觉有点和有那么点AOP的感觉,其实我也觉得,其实,我觉得AOP中,那个接口就相当于是后面具体实现类的门面。

纵观J2SE,J2EE,有哪些技术中隐藏了这种模式的影子呢?下面是我的一点小小的总结。

1:JDBC

在这里,JDBC其实相当于一套使用JAVA操作数据库的标准,应用程序面向JDBC接口编程,这个时候,我们程序后台依据实际情况可以使MySQL,也可以是Oracle。我们只需要面向JDBC这一套标准来编写业务逻辑,具体操作由后端数据库决定。

2:JPA

JPA,这是由SUN继Hibernate后在J2EE 5.0中提出来的一套JAVA持久化对象的业界标准,准确的说,JPA本身并不可以完成数据库的持久化,仅仅是一套接口标准而已,这个时候,后端具体实现,我们可以使用Hibernate,TopLink ,Ibatis,OpenJPA等等均可以。换句话说,当我们的应用程序是面向我们的JPA接口编程,后端的数据源可以实现方便的切换,如果分层良好,我们程序迁移的时候,仅仅需要修改的是我们的Dao层,保证了程序良好的移植性。在者,就是JPA与传统ORM框架使用xml文件来配置实体类和关系数据库的映射关系不同,它使用的是Annotation的方式。因为JPA底层采用的还是关系数据库,所以,它同时具备事务性,数据完整性,并发性等特性。目前,Hibernate,topLink等主流框架都提供了JPA的实现。



(其实,在学习hibernate的时候,我一直被一个问题困扰着,EJB,JPA这两者到底什么关系?为什么我们使用hibernate的时候,还会导入一个ejb相关的包?其实,在EJB2.x中,总共有三大类型的bean,会话bean<Session Bean >、实体Bean<Entity Bean >、消息驱动Bean<Message Driven Bean>,在EJB升级到EJB3.X的时候,其中的实体Bean就被JPA所取代,所以说,JPA是源自于EJB3.X的。JPA不仅仅在J2EE中使用广泛,在J2EE中同样也很广泛。)

3:SLF4J

Simple Logging Facade for Java,单单从名字就可以看出,这个一定是使用的门面设计模式实现的框架,,slf4j本身也是一套日志标准,在这套标准之后也有各种各样的实现方式,比如有slf4j自己本身的实现方式(slf4f-nop.jar),也有log4j的实现,同时也可有apache的commons-logging.jar的实现,还可以有java自身的实现。其中Hibernate内部就是使用的slf4j自己的实现,而我们在工程开发中主要是使用的log4j实现。在针对不同的具体日志实现的时候,大家是否想过一个问题,现在假设我们有了slf4j的接口,也有了log4j的实现,那么,如果将接口和实现类关联起来呢?这个其实在slf4j中已经为我们考虑到了,观察slf4j中提供的lib目录下的jar文件,我们发现,它已经为我们提供了相互关联的中间JAR文件,这样我们就可以通过这些文件将接口和具体实现关联起来,这也就是大家所熟知的适配器设计模式(adaptor)。



4:JTA

其实java本身有一套自己的Transaction API,但在J2EE中,SUN又提出了一套事物API,这就是JTA这个标准,简单理解,JTA最大区别于JAVA本身事物API地方在于JTA是基于WEB container的。所以,一般在web中涉及到事物时,一般都会选择JTA,JTA本身还支持跨数据库的事物,但是一定要注意,这与外部使用的是什么服务器有关,并不是所有容器面向JTA编程都可以支持跨越数据库的事物的。

以上总结会不断的更新,希望大家多多交流,如果不对,敬请指正。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: