Linux中国 Linux中国门户站!
设为主页 设为主页
收藏本站 收藏本站
 
当前位置 :首页 ->Linux技术 ->系统管理 ->正文

关于EJB返回值的解决方案

来源:Linux-cn.com 作者:Webmaster 时间:2007-05-05 点击: [收藏] [投稿]

  相信很多人都有如此之困惑,得此解决方法不敢独享,公之于众,以利后来人。

  声明:此方法的至于彭璐大侠,彭大侠可能不常上网,这麽好的方法也不告诉我等之小虾米,只好代劳了,彭大侠的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()); 
   } 
   } 
} 


 如果您对本文有任何疑问或者建议,请到讨论区发表您的意见: >> 论坛入口 <<



上一篇:Jboss下MS SQL Server配置指导   下一篇:Jb5 & Wls6.1:开发Entity Bean

文章评论】 【收藏本文】 【推荐好友】 【打印本文】 【我要投稿】 【论坛讨论
更多相关文章