技术开发 频道

关于EJB返回值的最好的解决方案

  【IT168技术文档】

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

  声明:此方法的至于彭璐大侠,彭大侠可能不常上网,这麽好的方法也不告诉我等之小虾米,只好代劳了。

  好了,不废话了,有两种方法:

  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.4\jre\rowset.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

0
相关文章