黑马程序员技术交流社区

标题: Java技术分享六:JavaEE的13种核心技术规范-EJB(1) [打印本页]

作者: li745547    时间: 2018-3-25 13:18
标题: Java技术分享六:JavaEE的13种核心技术规范-EJB(1)
本帖最后由 li745547 于 2018-3-25 13:31 编辑

一个实体Bean的实现
JPA和实体Bean的应用

EJB:
Enterprice JavaBeans
EJB是一个用于分布式业务应用的标准服务端组件模型。采用EJB架构编写的应用是可伸缩的、事务性的、多用户安全的。采用ejb编写的这些应用,可以部署在任何支持EJB规范的服务器平台,如jboss、weblogic等。

EJB用来干什么?
EJB实际上是用于编写业务层代码。如果大家对于MVC (model-view-controller)结构的应用有所了解的话,我们知道一个基于MVC结构的应用应包含显示层、控制层和业务层, 假设我们采用ejb开发基于MVC结构的应用,那么ejb就是用于开发应用的业务层.

EJB的好处
EJB为我们提供了很多在企业开发中需要使用到的服务,如事务管理/安全/持久化/分布式等,因为这些服务由容器提供,无需我们自行开发,这样大大减少了我们的开发工作量.另外EJB提供了强制式分层解耦设计方法

EJB3 VS Spring2.5
估计有同学会问,除了EJB,像spring+hibernate同样提供了事务管理/持久化服务,好像没有必要使用ejb.
   如果你的应用不需要分布式能力,确实没有必要使用ejb, 因为spring+hibernate提供了大部分原来只有ejb才有的服务,而且spring提供的有些服务比ejb做的更细致,更周到。
   那么是不是有了spring,EJB3就没有必要存在了?这种说法是不正确的,因为ejb设计的初衷是用于分布式场合,而spring一开始就没有打算提供分布式功能。所以两者看似有竞争的关系,但实际上两者的偏重点不一样,像ejb比较适合用于大型企业,因为大型企业一般都会存在多个信息系统,而这些信息系统又相互关联。为了避免业务功能重复开发,实现最大程度的重用,有必要把业务层独立出来,让多个信息系统共享一个业务中心,这样应用就需要具备分布式能力。


EJB3的运行环境
EJB3.0应用需要运行在EJB容器里,下面是一些JavaEE应用服务器,JavaEE应用服务器包含Web容器和EJB容器。

Jboss(4.2.x以上版本)
  是一个成熟的开源的准JavaEE应用服务器,在开源JavaEE应用服务器中所占市场份额第一。如果你打算选用开源的JavaEE应用服务器,那么jboss是最值得选择的。
Glassfish
  是一个开源的JavaEE应用服务器,对JavaEE规范的支持非常好,其运行性能比较高。因为发展时间相对较短,市场占有率比较低。另外,它能否提供稳定的运行性能,还有待时间的考验。但本人对其后期的发展非常看好。绝对跟jboss有的一拼。
  
Weblogic(10以上版本)
  是商业市场占有率第一的商业JavaEE应用服务器,它具有出色的稳定性,并提供了人性化的管理界面,还有企业需要使用到的众多功能。但在ejb3.0领域,本人认为它做的比jboss差些,bug比较多。
  
Sun Application Server(9.0以上版本)
  商业JavaEE应用服务器,如果你打算选用商业应用服务器运行ejb3,这个是不错的选择。
  
Oracle Application Server(10g以上版本)
  商业JavaEE应用服务器,如果你的数据库是oracle,要想兼容性更好,这个是不错的选择。
  
apusic应用服务器  这是国内的商业JavaEE应用服务器,主要在政府中占有一定的市场份额。要批评的是,其向开发人员提供的文档实在太少了

注意:Tomcat目前只是Web容器,它不能运行EJB应用。


EJB中的三种bean
1.会话bean(session bean)
   负责与客户端交互,是编写业务逻辑的地方,在会话bean中可以通过jdbc直接操作数据库,但大多数情况下都是通过实体bean来完成对数据库的操作.

2.实体bean(entity bean)
   它实际上属于java持久化规范(简称JPA)里的技术, JPA的出现主要是为了简化现有的持久化开发工作和整合ORM技术,结束现在Hibernate、TopLink等ORM框架各自为营的局面。

3.消息驱动bean(message-driven bean)
   它是专门用于异步处理java消息的组件.具有处理大量并发消息的能力.
   
什么是持久化
   在程序退出后信息可以长期保存的一种数据存储技术。
   
存储Java对象的流行方式之一是使用传统的RDBMS。
主流的关系数据库存取技术有如下四类:  
JDBC直接访问数据库
EJB entity bean
JDO技术(Java Data Objects)
第三方O/R工具,如Hibernate, 其它如IBATIS,Castor,Toplink.
   
   
实体bean
它属于java持久化规范(简称JPA)里的技术,实体bean通过元数据在javabean和数据库表之间建立起映射关系,然后Java程序员就可以随心所欲的使用面向对象的编程思想来操纵数据库。 JPA的出现主要是为了简化现有的持久化开发工作和整合ORM技术,目前实现的JPA规范的主流产品有Hibernate、TopLink和OpenJPA,在jboss中采用了Hibernate 作为其持久化实现产品。

添加JPA的配置文件persistence.xml

根据JPA规范的要求:
在实体bean应用中,我们需要在应用的类路径下的META-INF目录加入持久化配置文件persistence.xml
Xml代码  [url=][/url]

  • <?xml version="1.0"?>  
  • <persistence xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
  • xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd" version="1.0">  
  •    
  • </persistence>  
  •   
  • <property name="hibernate.hbm2ddl.auto" value="create-drop"/>  
  • <property name="hibernate.show_sql" value="true"/>  
  • <property name="hibernate.format_sql" value="true"/>  


实体bean只有持久化之后,才可以使用EntityManager对象访问数据库

项目使用:
Java代码  [url=][/url]

  • @PersistenceContext  
  •     private EntityManager em;  
  •       
  •     @Override  
  •     public void init() {  
  •          
  •         StringBuilder sql = new StringBuilder();  
  •         sql.append("SELECT DISTINCT S.SERVICE_NAME_EN, I.BOUND_IP");  
  •         sql.append("  FROM ESB_SERVICE      S,");  
  •         sql.append("       ESB_SERVICE_AUTH SA,");  
  •         sql.append("       ESB_APPLICATION  A,");  
  •         sql.append("       ESB_APP_BOUND_IP I");  
  •         sql.append(" WHERE S.ID = SA.SERVICE_ID");  
  •         sql.append("   AND SA.APPLICATION_ID = A.ID");  
  •         sql.append("   AND A.ID = I.APPLICATION_ID");  
  •         sql.append("   AND S.ENABLED_FLAG = 'Y'");  
  •         sql.append("   AND SA.ENABLED_FLAG = 'Y'");  
  •         sql.append("   AND A.ENABLED_FLAG = 'Y'");  
  •         sql.append("   AND I.ENABLED_FLAG = 'Y'");  
  •          
  •         Query query = em.createNativeQuery(sql.toString());  
  •         List<Object[]> result = query.getResultList();  
  •         for(Object[] oa : result){  
  •             logger.debug(oa[0].toString() + ":" + oa[1].toString());      
  •             ...  
  •         }  
  •     }  
  •     ...  
  • }  








欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2