实体Bean教程

上传人:xx****x 文档编号:242963044 上传时间:2024-09-12 格式:PPT 页数:66 大小:506.50KB
返回 下载 相关 举报
实体Bean教程_第1页
第1页 / 共66页
实体Bean教程_第2页
第2页 / 共66页
实体Bean教程_第3页
第3页 / 共66页
点击查看更多>>
资源描述
单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,实体Bean教程,1,教程实例环境,Jbuilder 7 for Weblogic,Borland JDataStore,Weblogic7.01,一台速度比较快的电脑(512M内存,赛羊1G),2,实体的作用,实体Bean是用来代表数据的。,Session Bean可以通过JDBC直接存取数据库。为什么还要多加一层实体bean呢?,JDBC直接存取:,各种数据库操作方法不同,不利移植,各种数据库事务、安全方法不同,如果能统一处理事务、安全岂不更好?,3,实体Bean的位置,Database,Entity Bean,SessionBean,Other Clients,实体,bean,增加了一个,中间层。客户不直接,存取数据库,而是由,容器,存取,从而获得,容易使用的安全和事务,,并且跨平台易移植。,4,实体Bean和数据库表的关系,Id,Name,balance,0001,ZengHai,-300000,0002,TengGang,-200000,数据表,id,0001/0002,Name,balance,某个实体,Bean,5,实体Bean和数据库之间的同步,Entity bean,DB,load,store,数据库和bean同步由,容器自动完成!,容器,ejbLoad(自动调)ejbStore(自动调),6,实体bean的生成流程,Home,remote,Entity Bean Instance,database,Container,client,1 create,2 ejbCreate,3 取数据,4,返回,pk,值,5 EJBObject,6,返回,EJBObject,7,制作一个实际的BMP,任务:帐号管理,提款,存款,查余额,8,第一部份: 远程接口,Account.java,Interface Account extends EJBObject,public void deposit(xxx),public void withdraw(xxx),一批业务方法外加一堆的,get/set,方法。,9,第二部份:Home接口,AccountHome.java,用于创建对象,Interface AccountHome extends EJBHome,Account create(,帐号,用户名),Account findByPrimaryKey(AccountPK key),Collection findByOwnerName(,用户名),10,第三部份:主键类,主键类提供某,bean,的唯一标识,AccountPk.java,Public class AccountPK implements .,String id,构造方法+,toString()+hashCode()+equals(Object ob),方法。,11,第四部份:核心逻辑类,AccountBean.java,核心类分:,1 数据域部份,2 业务方法具体实现(在remote里指明),3 容器自动调用方法实现,4 查找方法的实现(在Home里有的),12,4.1数据域部份,Public EntityContext ctx;,Public String id;,Public string name;,Public double balance;,13,4.2业务方法部份,Public void deposit(double amt),balance+=amt,Public void withdraw(),Balance-=amt;,大家看到,bean的业务方法不直接写数据库,写是由ejbLoad/Store自动进行的,14,4.3容器自动调用的方法。,ejbLoad(),AccountPk pk= ctx.getPrimaryKey();,“Select id,name,balance from xxx where id = pk.getid();”,Id=rs.getString(“id”),Name=rs.getString(“name”);,Balance=rs.getDouble(“balance”);,15,4.3,ejbLoad中用户需要做以下事情:,使用jdbc直接打开数据表,用select语句取出所需要的记录,将记录装入当前bean。,关闭数据库连接,16,4.3,ejbStore,“Update xxx set name=? Balance= ? Where id=?”,其中的id当然也是从pk中得到的。也就是把指定pk的记录写库,17,4.3,setEntityContext(EntityContext ctx),This.ctx=ctx;,从容器取得本bean的上下文,然后从外面调用内部方法而取得容器的安全性,18,4.3,ejbRemove,只要用delete 方法把主键相应的记录直接删除就行了。用户打开连接,执行delete,然后返回,19,4.3,ejbCreate(id,name),连接数据表,使用insert语句插入数据库一条记录。,返回一个新的 pk值,20,Public AccountPk ejbFindByPrimaryKey,直接使用select 语句返回值。,Public Collection ejbFindByOwnerName(name),直接使用vector返回pk的集合,21,EJB,字段:和数据库中字段对应,业务方法,deposit,等,操作,ejb,字段,不直接存取,DB,ejbRemove-,用户调用,实际上是,delete,数据,ejbLoad,容器调用,实际上是,select,数据装入,bean,ejbStore,容器调用,实际上是,update,数据更新,ejbCreate,,用户调用,向表中新插入数据,insert,ejbFindBy,方法,用户调用,,select,返回,pk,22,客户端,Public class client,Context ctx = new InitialContext(.),Object obj=ctx.lookup(“AccountHome”);,AccountHome home=(AccountHome) PortableRemoteObject.narrow(obj,AccountHome.class),Account= Home.create(“0001”,”zenghai”);,Account.getPrimarykey,Account.getBalance,withdraw,remove,23,部署客户端,略,差不多的。, BEAN,表明是,bmp, .AccountPk, false,24,BMP的特性:,在用户和数据间加了一个中间层,用户看到某个,bean,,操作这个,bean,等于操作数据库,且安全可靠。,这个,bean,就是一个,bmp,的,bean。,实际的数据库操作由用户编写,容器调用。特别是,ejbCreate,ejbRemove,ejbLoad,ejbStore。,比较烦人啊。,25,CMP,更简单抽象的实体bean,26,本节操作任务:,创建一个,实体,bean,,,它代表一个雇员数据表。,再创建一个,会话,bean,,,它调用这个实体,bean,,向实体,bean,要数据。,再创建一个,客户端,,它调用这个会话,bean,,从而显示雇员表中的某个数据。,27,Step1准备工作,Jbuilder7和weblogic准备好。Jbuider7必须已经装好JDataStore。如果没有就用access,比较麻烦些。,启动jbuilder7,新建项目,比如叫eejb。然后在里面新建一个ejb模块。比如叫testEntMod,28,Step2 从外部倒入数据库,点击左侧窗口的,testEntMod,结点,在右窗口下选择,ejbDesigner,图形化编缉器。,在空白处右击,选择,import schema from database,Driver,在下拉中选择,com.borland.datastore.jdbc.DataStoreDriver,Url,选择,local,的,全称是,jdbc:borland:dslocal:D:JBuilder7samplesJDataStoredatastoresemployee.jds,用户名密码自己选,要记牢,等会用,Jndi,名字要记牢,等会用,29,Step3 创建cmp,点击确定,jbuilder左下角出现DataSource窗口,里面有一堆的数据表,现在点中Employee,然后右击。,选择create cmp entity bean 2.0,等一会儿,右边窗口出现图形化的CMP,,创建成功。请观察这个bean。,30,Step4 建立相应会话Bean,在设计器上右键,选择sessionBean,把这个sessionBean起名为EmployeeSes。,再加一个方法名字叫getEmpName,返回String,带个参数是Short empNo。,31,Step5 加入代码,在session中存取entity bean,String empName = name not found;,try ,javax.naming.Context context = new javax.naming.InitialContext();,Object object = context.lookup(java:comp/env/ejb/Employee);,EmployeeHome empHome = (EmployeeHome),javax.rmi.PortableRemoteObject.narrow(object,EmployeeHome.class);,Employee emp = empHome.findByPrimaryKey(empNo);,empName = emp.getFirstName() + + emp.getLastName();,return empName;,32,Step6 在Sessionbean中加入对entitybean的引用,双击左侧的,EmployeeSes,这个,bean,,在右窗口下面选择,ejb Local Reference,选择,add,新加一个引用。引用的名字取成,ejb/Employee。,如果不这么写,前面,getEmpName,方法就会出错。,33,Step7 创建客户端测试程序,为,EmployeeSes,建立一个客户端。,建立后请先改动,Main,方法为:,EmployeeSesTestClient client = new EmployeeSesTestClient();,try ,client.create();,String empName = client.getEmpName(new Short(2);,System.out.println(Employee Name from the Test Client is = + empName);,catch (Exception ex) ,ex.printStackTrace();,34,Step8启动相应服务器,在项目运行属性里加两个配置,Server配置运行weblogic,Client配置运行客户端程序TestClient,在jbuilder里启动weblogic,35,Step9 配置数据源的缓冲池,进7001/,console,的,weblogic,控制台,选择,service,的,jdbc,,配新的,jdbc pool,Url,就是一开始的,jdbc:borland:dslocal:D:JBuilder7samplesJDataStoredatastoresemployee.jds,Driver,就是,com.borland.datastore.jdbc.DataStoreDriver,36,Step9 配置数据源的缓冲池,在,properties,里输入,User=test,Password=test。,这段和您开始,import,时候的选择对应。,点击,apply,37,Step 10调节缓冲性能,进旁边的connection,初始设成2,最大设成5,增加设成1,启动jdatastore服务器,进旁边的targets,选择myserver到右边,点击apply。,38,Step11 应对意外情况,上节apply必然失败,因为jdatastore没有在weblogic里配置好。回到jbuilder。,在configserver里,在配置lib 里,weblogic启动时加上类库,D:/JBuilder7/lib/jdsserver.jar,重新启动weblogic,可以配置pool成功。,39,Step 12配置支持事务的数据源,进jdbc的txDataSource,新建数据源,名字是demoDataSource。这个名字必须和import时起的jndiName一样,否则等着出错。,Pool名就是你刚建的pool,比如demoPool,在target里把它应用到服务器上。,40,Step13测试数据源,回jbuilder,关掉weblogic,重新启动weblogic,控制台上没错的话,就okay。,有错就trouble shooting,41,Step 14运行客户端,天哪。终于运行出来了!,看看输出的结果是什么?,想想调用的过程?,42,CMP,BMP,的特点:,虽然,ejbLoad,ejbStore,是由容器自动调用的,但是一个实体,bean,怎么和数据库打交道还是需要“硬”编码。,Select update insert delete,实际上都得写上。,BMP,的东西实际上还是和具体数据库相关的。,43,引入CMP的考虑,Bmp编码中,逻辑和持久化表示混合,Cmp试图分离逻辑和持久化表示。,结论:,在实体bean类中,不写任何的jdbc具体语句。具体存取数据库代码由容器替您生成好。,44,CMP图示,实体,bean,超类,包含数据逻辑,自己写,一个子类,由容器生成,实现具体的存取代码,45,CMP的bean不包含字段定义,没有诸如String id,String Name之类的。这些东西在子类里由容器产生。,不包含字段的原因是容器可能会外加一些辅助的字段,您并不需要关心这些。,46,一个bmp的类可能是这样的,Class xxx ,public String id,public String getId(),return id,在,cmp,中,,get/set,代码由容器生成。在父类里,不需要硬编码,定义个,abstract,类就可以了。,47,Abstract的父类,public abstract class CartBean implements EntityBean ,public abstract float getXXX();,public abstract float getXXXX();,public float getTotal(),return this.getXXX()+this.getXXXX(),/,这里也可以有,abstract,的,set,方法。,48,实际代码从何而来?,类里用abstract方法描述set/get,实际代码由容器生成,容器怎么生成?,由您用部署文件进行描述,2.x, AccountBean, Id, id ,49,解释部署文件,部署文件说明了abstract的类和数据库字段的对应关系。,每个cmp-field域就是持久化域,每个域都要在子类中生成get/set方法,所以域名必须和get/set一致。,Abstract void setName()则cmp-field就应该是name。这样容器就知道对应关系了,50,Cmp中,查询怎么办?,Set/get方法由容器处理。自动调select/update方法,我们看不到。,查找方法怎么办?比如bmp中的,findBigAccounts()。容器不可能知道bigAccounts的具体逻辑。这样您就不得不再写具体jdbc代码,回到bmp的老路上。,51,解决方法:加入中间语言。,使用中间的,平台无关的EJB-QL语言,从而完成查询的通用性。,Select OBJECT(a) from Account as a where a.Id IS NOT NULL,SELECT OBJECT(a) FROM Account AS a WHERE a.balance?1,52,开发者要做些什么?,构建CMP实体bean,设计abstract的持久化模型,编写EJB-QL语句。,部署者:,设计数据库映射,使用容器工具编程,生成子类及编码。,53,Cmp结构实例,概述:,一个产品的实体bean,包括Name,description,basePrice productId等字段,CMP的实体bean,54,Cmp的远程接口Product,Public interface Product extends EJBObject,Public String getName()/setName()/getDescription/set/getBasePrice()/set/getProductId(),用户看得到的一系列get/set 方法。,55,Home接口ProductHome.java,Home,接口只让远程客户程序使用,Public interface ProductHome extends EJBHome,Product create(String productID),Public findByPrimaryKey/findByName/findByDescription.,这些,find,方法可以用,EJB-QL,实现,或者由容器工具来实现,56,主键类ProductPk.java,提供唯一的关键字,Public class ProductPk implements java.io.Serializable,public String ID;,Public ProductPK(String id),This.ID=id,再定义,toString,hashCode,和,equals,就可以,57,核心类productBean.java,public abstract class ProductBean implements EntityBean,public abstract void setName/get,public abstract void set/getBasePrice,public String ejbCreate(ProductPK id,name),一系列,set,语句调用,然后返回新的,PK,对象,58,部署描述文件:有哪些没做?,Set/get具体实现还没做,一系列的find方法的代码没有写,这些都由部署文件告诉容器,然后容器替你生成。,59,部署文件part I:bean总体描述, ,这些和普通的bmp一样。,60,部署文件part II:数据库映射,2.x productBean, name ,有几个字段写几个 cmp-field,这样set/get方法就由容器实现了,61,部署文件part III,实现查询, findByName , java.lang.String,62,部署文件,同样定义findByDescription,findByBasePrice findExpensiveProducts,findCheapProducts,findAllProducts,写相应的sql语句。,63,部署文件part 4组装描述, product,*,64,容器描述,数据库字段映射由xml和容器自动完成。,在jbuilder里能完成。,65,客户端,ProductHome home;,Home = .narrow(ctx.lookup(“ProductHome”),ProductHome.class,Home.create(),调用get/find方法。,66,
展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 图纸专区 > 大学资料


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!