程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> 關於JAVA >> 關於EJB返回值的解決方案

關於EJB返回值的解決方案

編輯:關於JAVA

相信很多人都有如此之困惑,得此解決方法不敢獨享,公之於眾,以利後來人。

聲明:此方法的至於彭璐大俠,彭大俠可能不常上網,這麽好的方法也不告訴我等之小蝦米,只好代勞了。

好了,不廢話了,有兩種方法:

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

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved