实体Bean教程

上传人:s9****2 文档编号:569925725 上传时间:2024-07-31 格式:PPT 页数:67 大小:239KB
返回 下载 相关 举报
实体Bean教程_第1页
第1页 / 共67页
实体Bean教程_第2页
第2页 / 共67页
实体Bean教程_第3页
第3页 / 共67页
实体Bean教程_第4页
第4页 / 共67页
实体Bean教程_第5页
第5页 / 共67页
点击查看更多>>
资源描述

《实体Bean教程》由会员分享,可在线阅读,更多相关《实体Bean教程(67页珍藏版)》请在金锄头文库上搜索。

1、实体Bean教程Stillwatersrundeep.流静水深流静水深,人静心深人静心深Wherethereislife,thereishope。有生命必有希望。有生命必有希望教程实例环境nJbuilder 7 for WeblogicnBorland JDataStorenWeblogic7.01n一台速度比较快的电脑(512M内存,赛羊1G)实体的作用n实体Bean是用来代表数据的。nSession Bean可以通过JDBC直接存取数据库。为什么还要多加一层实体bean呢?nJDBC直接存取:n各种数据库操作方法不同,不利移植n各种数据库事务、安全方法不同n如果能统一处理事务、安全岂不更好

2、?实体Bean的位置DatabaseEntity BeanSessionBeanOther Clients实体实体bean增加了一个增加了一个中间层。客户不直接中间层。客户不直接存取数据库,而是由存取数据库,而是由容器容器存取,从而获得存取,从而获得容易使用的安全和事务容易使用的安全和事务,并且跨平台易移植。,并且跨平台易移植。实体Bean和数据库表的关系IdNamebalance0001ZengHai-3000000002TengGang-200000数据表id0001/0002Namebalance某个实体Bean实体Bean和数据库之间的同步Entity beanDBloadstore数

3、据库和bean同步由容器自动完成!容器容器ejbLoad(自动调)ejbStore(自动调)实体bean的生成流程HomeremoteEntity Bean InstancedatabaseContainerclient1 create2 ejbCreate3 取数据4返回返回pk值值5 EJBObject6返回返回 EJBObject制作一个实际的BMPn任务:帐号管理,提款,存款,查余额第一部份: 远程接口n nAccount.javanInterface Account extends EJBObject public void deposit(xxx) public void with

4、draw(xxx) 一批业务方法外加一堆的get/set 方法。第二部份:Home接口AccountHome.java用于创建对象用于创建对象Interface AccountHome extends EJBHomeAccount create(帐号,用户名帐号,用户名)Account findByPrimaryKey(AccountPK key)Collection findByOwnerName(用户名用户名)第三部份:主键类n主键类提供某bean的唯一标识nAccountPk.javanPublic class AccountPK implements .nString idn构造方法+

5、toString()+hashCode()+equals(Object ob)方法。第四部份:核心逻辑类nAccountBean.javan核心类分:n1 数据域部份n2 业务方法具体实现(在remote里指明)n3 容器自动调用方法实现n4 查找方法的实现(在Home里有的)4.1数据域部份nPublic EntityContext ctx;nPublic String id;nPublic string name;nPublic double balance;4.2业务方法部份nPublic void deposit(double amt)n balance+=amtnPublic voi

6、d withdraw()nBalance-=amt;n大家看到,bean的业务方法不直接写数据库,写是由ejbLoad/Store自动进行的4.3容器自动调用的方法。nejbLoad()nAccountPk pk= ctx.getPrimaryKey();n“Select id,name,balance from xxx where id = pk.getid();”nId=rs.getString(“id”)nName=rs.getString(“name”);nBalance=rs.getDouble(“balance”);4.3nejbLoad中用户需要做以下事情:n使用jdbc直接打开

7、数据表n用select语句取出所需要的记录n将记录装入当前bean。n关闭数据库连接4.3nejbStoren“Update xxx set name=? Balance= ? Where id=?”n其中的id当然也是从pk中得到的。也就是把指定pk的记录写库4.3nsetEntityContext(EntityContext ctx)nThis.ctx=ctx;n从容器取得本bean的上下文,然后从外面调用内部方法而取得容器的安全性4.3 nejbRemoven只要用delete 方法把主键相应的记录直接删除就行了。用户打开连接,执行delete,然后返回4.3nejbCreate(id,

8、name)nn连接数据表,使用insert语句插入数据库一条记录。n返回一个新的 pk值nnPublic AccountPk ejbFindByPrimaryKeyn直接使用select 语句返回值。nPublic Collection ejbFindByOwnerName(name)n直接使用vector返回pk的集合EJB字段:和数据库中字段对应业务方法deposit等,操作ejb字段,不直接存取DBejbRemove-用户调用,实际上是delete数据ejbLoad容器调用,实际上是select数据装入beanejbStore容器调用,实际上是update数据更新ejbCreate,用户

9、调用,向表中新插入数据insertejbFindBy方法,用户调用,select返回pk客户端nPublic class clientn Context ctx = new InitialContext(.)nObject obj=ctx.lookup(“AccountHome”);nAccountHome home=(AccountHome) PortableRemoteObject.narrow(obj,AccountHome.class)nAccount= Home.create(“0001”,”zenghai”);nAccount.getPrimarykeynAccount.getBa

10、lance,withdraw,remove部署客户端n略,差不多的。n BEAN表 明 是bmpn .AccountPkn falseBMP的特性:n在用户和数据间加了一个中间层n用户看到某个bean,操作这个bean等于操作数据库,且安全可靠。n这个bean就是一个bmp的bean。实际的数据库操作由用户编写,容器调用。特别是ejbCreate,ejbRemove,ejbLoad,ejbStore。n比较烦人啊。CMP更简单抽象的实体bean本节操作任务:n创建一个实体实体bean,它代表一个雇员数据表。n再创建一个会话会话bean,它调用这个实体bean,向实体bean要数据。n再创建一个

11、客户端客户端,它调用这个会话bean,从而显示雇员表中的某个数据。Step1准备工作nJbuilder7和weblogic准备好。Jbuider7必须已经装好JDataStore。如果没有就用access,比较麻烦些。n启动jbuilder7,新建项目,比如叫eejb。然后在里面新建一个ejb模块。比如叫testEntModStep2 从外部倒入数据库n点击左侧窗口的testEntMod结点,在右窗口下选择ejbDesigner图形化编缉器。n在空白处右击,选择import schema from databasenDriver在下拉中选择com.borland.datastore.jdbc.

12、DataStoreDrivernUrl选择local的,全称是jdbc:borland:dslocal:D:JBuilder7samplesJDataStoredatastoresemployee.jdsn用户名密码自己选,要记牢,等会用nJndi名字要记牢,等会用Step3 创建cmpn点击确定,jbuilder左下角出现DataSource窗口,里面有一堆的数据表,现在点中Employee,然后右击。n选择create cmp entity bean 2.0n等一会儿,右边窗口出现图形化的CMP,n创建成功。请观察这个bean。Step4 建立相应会话Beann在设计器上右键,选择sess

13、ionBean,把这个sessionBean起名为EmployeeSes。n再加一个方法名字叫getEmpName,返回String,带个参数是Short empNo。Step5 加入代码,在session中存取entity beannString empName = name not found;ntry njavax.naming.Context context = new javax.naming.InitialContext();nObject object = context.lookup(java:comp/env/ejb/Employee);nEmployeeHome empHo

14、me = (EmployeeHome) njavax.rmi.PortableRemoteObject.narrow(object,EmployeeHome.class);nEmployee emp = empHome.findByPrimaryKey(empNo);n nempName = emp.getFirstName() + + emp.getLastName();empName = emp.getFirstName() + + emp.getLastName();nnreturn empName;Step6 在Sessionbean中加入对entitybean的引用n双击左侧的Emp

15、loyeeSes这个bean,在右窗口下面选择ejb Local Reference,选择add,新加一个引用。引用的名字取成ejb/Employee。如果不这么写,前面如果不这么写,前面getEmpName方法就会出错。方法就会出错。Step7 创建客户端测试程序n为EmployeeSes建立一个客户端。n建立后请先改动Main方法为:nEmployeeSesTestClient client = new EmployeeSesTestClient();ntry nclient.create();nString empName = client.getEmpName(new Short(2)

16、;nSystem.out.println(Employee Name from the Test Client is = + empName);nncatch (Exception ex) nex.printStackTrace();nStep8启动相应服务器n在项目运行属性里加两个配置nServer配置运行weblogicnClient配置运行客户端程序TestClientn在jbuilder里启动weblogicStep9 配置数据源的缓冲池n进7001/console的weblogic控制台n选择service的jdbc,配新的jdbc poolnUrl就是一开始的jdbc:borlan

17、d:dslocal:D:JBuilder7samplesJDataStoredatastoresemployee.jdsnDriver就是com.borland.datastore.jdbc.DataStoreDriverStep9 配置数据源的缓冲池n在properties里输入nUser=testnPassword=test。n这段和您开始import时候的选择对应。n点击applyStep 10调节缓冲性能n进旁边的connectionn初始设成2,最大设成5,增加设成1n启动jdatastore服务器n进旁边的targets,选择myserver到右边,点击apply。Step11 应

18、对意外情况n上节apply必然失败,因为jdatastore没有在weblogic里配置好。回到jbuilder。n在configserver里,在配置lib 里,weblogic启动时加上类库nD:/JBuilder7/lib/jdsserver.jarn重新启动weblogic,可以配置pool成功。Step 12配置支持事务的数据源n进jdbc的txDataSourcen新建数据源,名字是demoDataSource。这个名字必须和import时起的jndiName一样,否则等着出错。nPool名就是你刚建的pool,比如demoPooln在target里把它应用到服务器上。Step13

19、测试数据源n回jbuilder,关掉weblogicn重新启动weblogic,控制台上没错的话n就okay。n有错就trouble shootingStep 14运行客户端n天哪。终于运行出来了!n看看输出的结果是什么?n想想调用的过程?CMPnBMP的特点:n 虽然ejbLoad,ejbStore是由容器自动调用的,但是一个实体bean怎么和数据库打交道还是需要“硬”编码。nSelect update insert delete实际上都得写上。nBMP的东西实际上还是和具体数据库相关的。引入CMP的考虑nBmp编码中,逻辑和持久化表示混合nCmp试图分离逻辑和持久化表示。n结论:n 在实体

20、bean类中,不写任何的jdbc具体语句。具体存取数据库代码由容器替您生成好。CMP图示实体bean超类,包含数据逻辑,自己写一个子类,由容器生成,实现具体的存取代码CMP的bean不包含字段定义n没有诸如String id,String Name之类的。这些东西在子类里由容器产生。n不包含字段的原因是容器可能会外加一些辅助的字段,您并不需要关心这些。一个bmp的类可能是这样的nClass xxx n public String idn public String getId()n return idnn在cmp中,get/set代码由容器生成。在父类里,不需要硬编码,定义个abstract类

21、就可以了。Abstract的父类public abstract class CartBean implements EntityBean n public abstract float getXXX();n public abstract float getXXXX();n public float getTotal()n return this.getXXX()+this.getXXXX()n/这里也可以有abstract的set方法。实际代码从何而来?n类里用abstract方法描述set/getn实际代码由容器生成,容器怎么生成?n由您用部署文件进行描述n2.xn AccountBean

22、n Idn id 解释部署文件n部署文件说明了abstract的类和数据库字段的对应关系。n每个cmp-field域就是持久化域,每个域都要在子类中生成get/set方法,所以域名必须和get/set一致。nAbstract void setName()则cmp-field就应该是name。这样容器就知道对应关系了Cmp中,查询怎么办?nSet/get方法由容器处理。自动调select/update方法,我们看不到。n查找方法怎么办?比如bmp中的nfindBigAccounts()。容器不可能知道bigAccounts的具体逻辑。这样您就不得不再写具体jdbc代码,回到bmp的老路上。解决方

23、法:加入中间语言。n使用中间的,平台无关的EJB-QL语言,从而完成查询的通用性。nSelect OBJECT(a) from Account as a where a.Id IS NOT NULLnSELECT OBJECT(a) FROM Account AS a WHERE a.balance?1开发者要做些什么?n构建CMP实体bean,设计abstract的持久化模型,编写EJB-QL语句。n部署者:n设计数据库映射,使用容器工具编程,生成子类及编码。Cmp结构实例n概述:n一个产品的实体bean,包括Name,description,basePrice productId等字段nC

24、MP的实体beanCmp的远程接口ProductnPublic interface Product extends EJBObjectnPublic String getName()/setName()/getDescription/set/getBasePrice()/set/getProductId()nn用户看得到的一系列get/set 方法。Home接口ProductHome.javanHome接口只让远程客户程序使用接口只让远程客户程序使用nPublic interface ProductHome extends EJBHomen Product create(String prod

25、uctID)nPublic findByPrimaryKey/findByName/findByDescription.n这些这些find方法可以用方法可以用EJB-QL实现,或者由容实现,或者由容器工具来实现器工具来实现主键类ProductPk.javan提供唯一的关键字nPublic class ProductPk implements java.io.Serializablen public String ID;nPublic ProductPK(String id)nThis.ID=idn再定义toString,hashCode和equals就可以核心类productBean.java

26、npublic abstract class ProductBean implements EntityBeann public abstract void setName/getn public abstract void set/getBasePricen public String ejbCreate(ProductPK id,name)n一系列set语句调用,然后返回新的PK对象部署描述文件:有哪些没做?nSet/get具体实现还没做n一系列的find方法的代码没有写n这些都由部署文件告诉容器,然后容器替你生成。部署文件part I:bean总体描述n, n这些和普通的bmp一样。部署

27、文件part II:数据库映射n2.x productBeannn name nn有几个字段写几个 cmp-field,这样set/get方法就由容器实现了部署文件part III,实现查询nn findByName nn java.lang.Stringnnnn部署文件n同样定义findByDescriptionnfindByBasePrice findExpensiveProducts,findCheapProducts,findAllProducts,写相应的sql语句。部署文件part 4组装描述nnn productnn*nn容器描述n 数据库字段映射由xml和容器自动完成。n在jbuilder里能完成。客户端nProductHome home;nHome = .narrow(ctx.lookup(“ProductHome”),ProductHome.classnHome.create()n调用get/find方法。

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 资格认证/考试 > 自考

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号