關於EJB查詢返回值的解決方法 (轉)

worldblog發表於2007-12-11
關於EJB查詢返回值的解決方法 (轉)[@more@]

多少天來,為此問題寢食難安,我曾發誓若我能解決這個問題就要把它貼滿各大BBS,如今得償所願。
csdn的版還需努力,最好分一下,如:javaunion
相信很多人都有如此之困惑,得此解決方法不敢獨享,公之於眾,以利後來人。
宣告:此方法的至於彭璐大俠,彭大俠可能不常上網,這麼好的方法也不告訴我等之小蝦米,只好代勞了,彭大俠的e不便公開,應該是金蝶的人吧。
好了,不廢話了,有兩種方法:
1、用vector:
/**
>  * Finds all eans 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 ejbFinigAccounts(double balanceGreaterThan) {
>  log("ejbFindBigAccounts (balance > " + balanceGreaterThan + ")");
>  Connection con = null;
>  PreparedStatement ps = null;
>
>  try {
>  con = getConnection();
>  ps = con.prepareStatement(" 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 (Exception sqe) {
>  log("SQLException: " + sqe);
>  throw new EJBException (sqe);
>  } finally {
>  cleanup(con, ps);
>  }
>  }
結論:不爽,不方便。

2、RowSet
RowSet tutorial chapter :
JDBCTutorial/chapter5.html">http://developer.java.sun.com/developer/Books/JDBCTutorial/chapter5.html

rowset是個interface,需要有東西去實現它,sun的規範中給了三個class:cachedrowset,jdbcrowset,rowset,如果去查1.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.4rowset.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 Data 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", "webPass");
  Statement stmt = con.createStatement();
  rs =  stmt.executeQuery("select * from coffees");
 
  crs = new CachedRowSet();
  crs.populate(rs);
  // the writer needs this because JDBC s
  // don't prov 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..*;

class CoffeesClient {

  public static void main(String[] args) {

  try {
  // init the bean
  Context ctx = new InitialContext();
  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
12/27/2001

Any question ">mailto:myvrml@263.net

 


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10752043/viewspace-991343/,如需轉載,請註明出處,否則將追究法律責任。

相關文章