关于EJB返回值的解决方案

<script type="text/javascript"> google_ad_client = "pub-8800625213955058"; /* 336x280, 创建于 07-11-21 */ google_ad_slot = "0989131976"; google_ad_width = 336; google_ad_height = 280; // </script> <script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js"> </script> 相信很多人都有如此之困惑,得此解决方法不敢独享,公之于众,以利后来人。 声明:此方法的至于彭璐大侠,彭大侠可能不常上网,这麽好的方法也不告诉我等之小虾米,只好代劳了,彭大侠的email不便公开,应该是金蝶的人吧。 好了,不废话了,有两种方法: 1、用vector:


/** 

> * Finds all EJBeans with a balance greater than a given amount. 

> * Returns an Enumeration of found EJBean primary keys. 

> * 

> * @param balanceGreaterThan double Test Amount 

> * @return Enumeration EJBean Primary Keys 

> * @exception javax.ejb.EJBException 

> * if there is a communications or systems failure 

> */ 

> public Enumeration ejbFindBigAccounts(double balanceGreaterThan) { 

> log("ejbFindBigAccounts (balance > "   balanceGreaterThan   ")"); 

> Connection con = null; 

> PreparedStatement ps = null; 

> 

> try { 

> con = getConnection(); 

> ps = con.prepareStatement("select id from ejbAccounts where bal > ?"); 

> ps.setDouble(1, balanceGreaterThan); 

> ps.executeQuery(); 

> ResultSet rs = ps.getResultSet(); 

> Vector v = new Vector(); 

> String pk; 

> while (rs.next()) { 

> pk = rs.getString(1); 

> v.addElement(pk); 

> } 

> return v.elements(); 

> } catch (SQLException sqe) { 

> log("SQLException: "   sqe); 

> throw new EJBException (sqe); 

> } finally { 

> cleanup(con, ps); 

> } 

> } 

结论:不爽,不方便。 2、RowSet RowSet tutorial chapter : http://developer.java.sun.com/developer/Books/JDBCTutorial/chapter5.html rowset是个interface,需要有东西去实现它,sun的规范中给了三个class:cachedrowset,jdbcrowset,webrowset, 如果去查jdk1.4 doc和j2skee1.2,有rowset,却没有那三个class,一般的开发工具(至少我的wsad)中也是这样, 所以需要下jdbc2.0 opt-pack: http://developer.java.sun.com/developer/earlyAccess/crs/ 下下来了再怎么办呢? 装呗! 怎么装呢? setup呀! 没有呀? 啊,没setup呀,sun干什么吃的,连setup都不做个,也太懒了吧。 ///////////////////////////////// 哎,我们确实是都被ms惯坏了,看到只有jar,没setup就没辙了,大家好好想想,java最大的特性是什么,就是它的类库 可以自由扩充呀,现在明白该怎么做了吧: 1、解包,得到rowset.jar,放在哪随您的意,别丢了就行。 2、在您的开发工具中增加一个路径,如:ROWSET_PATH对应:d:jdk1.4jre owset.jar(和1的路径对应就行)。 3、右键您的工程文件,出现:property(大多数工具应该都有吧),加上rowset_path。 4、在您的源文件中:import sun.jdbc.rowset.*; OK,搞定!下面就看您的了。(当然也可以把rowset压到jre里去) 应该说rowset(其实主要是CachedRowSet)真的是个好东西,和ms ado的resultset和borland的tclientset非常相似, 最大的好处是Cache功能! 好了,看例子吧:


/////////////server端///////////// 

package example4; 



import java.sql.*; 

import javax.sql.*; 

import sun.jdbc.rowset.*; 

import javax.naming.*; 

import javax.ejb.*; 



public class CoffeesBean implements SessionBean { 



   private SessionContext sc = null; 

   private Context ctx = null; 

   private DataSource ds = null; 

    

   public CoffeesBean () {} 

    

   public void ejbCreate() throws CreateException { 



       try { 

           ctx = new InitialContext(); 

           ds = (DataSource)ctx.lookup("jdbc/CoffeesDB"); 

       } 

       catch (Exception e) { 

           System.out.println(e.getMessage()); 

           throw new CreateException(); 

       } 

   } 



   public RowSet getCoffees() throws SQLException { 

        

       Connection con = null; 

ResultSet rs; 

       CachedRowSet crs; 



       try { 

           con = ds.getConnection("webCustomer", "webPassword"); 

           Statement stmt = con.createStatement(); 

           rs = stmt.executeQuery("select * from coffees"); 

            

           crs = new CachedRowSet(); 

           crs.populate(rs); 

           // the writer needs this because JDBC drivers 

           // don't provide this meta-data. 

           crs.setTableName("coffees"); 

            

           rs.close(); 

           stmt.close(); 

       } finally { 

           if (con != null) 

               con.close(); 

       } 

       return rset; 

   } 

    

   public updateCoffees(RowSet rs) throws SQLException { 



       Connection con = null; 



       try { 

           CachedRowSet crs = (CachedRowSet)rs; 

           con = ds.getConnection("webCustomer", "webPassword"); 

           // moves the changes back to the database 

           crs.acceptChanges(con); 

       } finally { 

           if (con != null) 

               con.close(); 

       } 

   } 



   // 

   // Methods inherited from SessionBean 

   // 

    

   public void setSessionContext(SessionContext sc) { 

       this.sc = sc; 

   } 

    

   public void ejbRemove() {} 

   public void ejbPassivate() {} 

   public void ejbActivate() {} 



    

} 





//////////////////client端////////////// 

package example4; 



import java.sql.*; 

import javax.sql.*; 

import sun.jdbc.rowset.*; 

import javax.naming.*; 

import javax.ejb.*; 

import javax.rmi.*; 



class CoffeesClient { 



   public static void main(String[] args) { 



       try { 

           // init the bean 

           Context ctx = new InitialContext(); 

           Object obj = ctx.lookup("ejb/Coffees"); 

           CoffeesHome coffeesHome = (CoffeesHome) 

               PortableRemoteObject.narrow(obj, CoffeesHome.class); 

           Coffees coffees = coffeesHome.create(); 

            

           // get the rowset from the bean 

           CachedRowSet rset = (CachedRowSet)coffees.getCoffees(); 



           // find the Columbian coffee 

           while (rset.next()) { 

               String coffeeName = rset.getString("COF_NAME"); 

               if (coffeeName.equalsIgnoreCase(new String("Columbian"))) { 

                   // columbian coffee has gone up 10% 

                   rset.updateFloat("PRICE", 

                                    (float)(rset.getFloat("PRICE") * 1.10)); 

                   rset.updateRow(); 

               } 

           } 



           // finally send the updated back to the bean... 

           System.out.println("Calling update method"); 

           coffees.updateCoffees((RowSet)rset); 

       } 

       catch (Exception e) { 

           System.out.println(e.getMessage()); 

       } 

   } 

} 

例子很简单就不多讲了。 cheers. Robin Any question mailto:myvrml@263.net
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值