Eclipse3.2.1中使用EJB QL开发查询

         本例接上篇《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原创,转载请申明!
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值