本例接上篇《Eclipse3.2.1中利用XDoclet Enterprise JavaBean创建Container Managed Entity Bean》开发的Book实体Bean基础上增加一个finder方法,对author进行查询。
开发查询步骤:
1) 在Home接口中增加finder方法,其参数为查询条件用到的参数。
2) 在ejb-jar.xml文件的<query>项定义EJBQL语句。
本文讲述是的根椐author信息,查找对应出版的书名,因为一个作者可能出版多本书,实际应用中,查询结果是不惟一的,finder方法必须返回一个Collection。本文将分别讲述返回一个Bean的实例和返回一个Collection的实例。
一,返回一个Bean实例
具体操作步骤如下:
1, 打开BookBean.java文件,在注释行加入@ejb.finder,保存文件。XDoclet自动会在远程Home接口和本地Home接口中生成相应的方法。@ejb finder完整代码如下:
*@ejb.finder
* signature="test.BookfindByAuthor(java.lang.Stringauthor)"
* query="selectobject(b)fromBookSCHEMAasbwhereb.author=?1"
注:1)此处有个技巧,当在*空格后键入@ejb时,通过代码辅助选择finder时,XDoclet会自动生成相关项。
2)参数author类型不能简写成String,一定要写完整的java.lang.String,否则在ejb-jar.xml文件也是String,项目导出成功后,启动JBOSS,发现MyEntityEJB.ear文件不能deploy。
2, 远程Home接口文件BookHome.java自动生成的方法代码如下:
public test.Book findByAuthor(String author)
throws javax.ejb.FinderException,java.rmi.RemoteException;
3,本地Home接口文件BookLocalHome.java自动生成的方法代码如下:
public test.BookLocal findByAuthor(String author)
throws javax.ejb.FinderException;
4, XDoclet会自动更新ejb-jar.xml文件的<query>项,具体该项代码如下:
<query>
<query-method>
<method-name>findByAuthor</method-name>
<method-params>
<method-param>java.lang.String</method-param>
</method-params>
</query-method>
<ejb-ql><![CDATA[select object(b) from BookSCHEMA as b where b.author=?1]]></ejb-ql>
</query>
注意:EJB QL语句由select、where、orderby三个子句构成,其中后两个子句是可选的。创建query时,一定要用CMP的对象和字段,此处BookSCHEMA为表Book的抽象模式名,?1代表相应的finder方法的输入参数。还有select 后一定要用object()将实体括起来,这点不同于在Jbuilder2006。
5, 创建EJB Client Test。仿照前面的TestClient示图,创建TestClient2.java客户端测试程序,添加main()方法,具体main()方法代码如下:
publicstaticvoid main(String[] args){
TestClient2 client=new TestClient2();
try {
String message=new String(client.getHome().findByAuthor("Benson").getName().getBytes("ISO-8859-1"),"GB2312");
System.out.println("书名:"+message);
} catch (UnsupportedEncodingException e) {
// TODO自动生成 catch 块
e.printStackTrace();
} catch (RemoteException e) {
// TODO自动生成 catch 块
e.printStackTrace();
} catch (FinderException e) {
// TODO自动生成 catch 块
e.printStackTrace();
} catch (Exception e) {
// TODO自动生成 catch 块
e.printStackTrace();
}
}
6, 照前篇重新将项目导出为MyEntityEJB.ear文件。
7, 启动MySQL服务器,在Servers视图启动JBOSS 4.0启动成功后,右击TestClient2.java文件,选择“运行方式”-“Java应用程序”,在控制台可以看见到输出信息:书名:家常菜1000例
二,返回一个集合(Collection)
具体操作步骤如下:
1,打开BookBean.java文件,(删除先前定义的@ejb.finder findByAuthor方法,保存文件,XDoclet自动会清除远程Home接口、本地Home接口和ejb-jar.xml相关代码)在注释行加入@ejb.finder,保存文件。XDoclet自动会在远程Home接口和本地Home接口中生成相应的方法。@ejb finder完整代码如下:
*@ejb.finder
* signature="java.util.CollectionfindByAuthor(java.lang.Stringauthor)"
* query="selectobject(b)fromBookSCHEMAasbwhereb.author=?1"
注:1)此处有个技巧,当在*空格后键入@ejb时,通过代码辅助选择finder时,XDoclet会自动生成相关项。
2)参数author类型不能简写成String,一定要写完整的java.lang.String,否则在ejb-jar.xml文件也是String,项目导出成功后,启动JBOSS,发现MyEntityEJB.ear文件不能deploy。
2, 远程Home接口文件BookHome.java自动生成的方法代码如下:
public java.util.Collection findByAuthor(java.lang.String author)
throws javax.ejb.FinderException,java.rmi.RemoteException;
3,本地Home接口文件BookLocalHome.java自动生成的方法代码如下:
public java.util.Collection findByAuthor(java.lang.String author)
throws javax.ejb.FinderException;
4,XDoclet会自动更新ejb-jar.xml文件的<query>项,具体该项代码如下:
<query>
<query-method>
<method-name>findByAuthor</method-name>
<method-params>
<method-param>java.lang.String</method-param>
</method-params>
</query-method>
<ejb-ql><![CDATA[select object(b) from BookSCHEMA as b where b.author=?1]]></ejb-ql>
</query>
注意:EJB QL语句由select、where、orderby三个子句构成,其中后两个子句是可选的。创建query时,一定要用CMP的对象和字段,此处BookSCHEMA为表Book的抽象模式名,?1代表相应的finder方法的输入参数。还有select 后一定要用object()将实体括起来,这点不同于在Jbuilder2006。
5, 创建EJB Client Test。仿照前篇的TestClient示图,创建TestClient3.java客户端测试程序,添加main()方法,具体main()方法代码如下:
publicstaticvoid main(String[] args){
TestClient3 client=new TestClient3();
java.util.Collection books;
try {
books=client.getHome().findByAuthor("Benson");
Iterator it=books.iterator();
while (it.hasNext()) {
Book book=(Book)it.next();
System.out.println(“书名:”+new String(book.getName().getBytes("ISO-8859-1"),"GB2312"));
}
}catch (FinderException e) {
// TODO自动生成 catch 块
e.printStackTrace();
} catch (Exception e) {
// TODO自动生成 catch 块
e.printStackTrace();
}
}
6, 照前篇重新将项目导出为MyEntityEJB.ear文件。
7, 启动MySQL服务器,在数据库bookdb的表book中,用下面语句插入一条记录:
insert into book values(‘1005’,’Benson’,’自助旅行365天’,32);
8,在Servers视图启动JBOSS 4.0。启动成功后,右击TestClient2.java文件,选择“运行方式”-“Java应用程序”,在控制台可以看见如下两行输出信息:
书名:家常菜1000例
书名:自助旅行365天
小结:上述实体Bean实例都是通过EJB Client Test客户端程序直接访问实体Bean,在实际开发中能通常不采用这种方法,通常采用建立一个会话Bean,该会话Bean中封装对实体Bean的访问,而且通过本地接口进行访问,能够提高性能。
BLUE_FIRE2008
二OO八年六月十四日于南昌
本文由BLUE_FIRE2008原创,转载请申明!