關於EJB查詢返回值的解決方法 (轉)
多少天來,為此問題寢食難安,我曾發誓若我能解決這個問題就要把它貼滿各大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/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 關於mysql查詢字符集不匹配問題的解決方法MySql
- 關於innodb中查詢的定位方法
- 求救:關於EJB單步除錯的方法除錯
- Java中關於OOM的場景及解決方法(轉)JavaOOM
- 有沒有用EJB(CMP)實現動態查詢的方法?
- Dreamweaver關於媒體查詢命令的使用方法
- 關於查詢轉換的一些總結
- Hibernate綜合查詢解決方案 (轉)
- VS 返回值被忽略的解決方法
- asm例項查詢asm相關檢視hang住解決方法ASM
- 關於Mysql 4.1語言問題的完美解決方法(轉)MySql
- 關於SQL Server資料查詢基本方法的總結SQLServer
- ORACLE 鎖表的解決方法及查詢引起鎖表SQL語句[轉]OracleSQL
- php查詢mssql出現亂碼的解決方法PHPSQL
- 關於oracle的空間查詢Oracle
- Oracle:優化方法總結(關於連表查詢)Oracle優化
- SQL查詢的轉義方法(一)SQL
- 關於查詢轉換的一些簡單分析(一)
- 關於查詢轉換的一些簡單分析(二)
- 關於查詢轉換的一些簡單分析(三)
- 關於樹型結構資料遞迴查詢,轉非遞迴查詢的實現遞迴
- 關於字串匹配查詢的總結字串匹配
- 關於Hibernate的查詢問題
- 關於RHEL 5 下scsi_id 無返回值的問題解決(1)
- 關於批次分頁查詢
- 關於查詢塊query blockBloC
- 關於npm install失敗的解決方法NPM
- 關於監聽不能啟動的解決方法
- MyBatis 多表聯合查詢,欄位重複的解決方法MyBatis
- 【轉】有關dataguard的幾個查詢
- ORACLE 鎖表的解決方法及查詢引起鎖表SQL語句方法OracleSQL
- 關於MySQL8的WITH查詢學習MySql
- 關於dataguard需要查詢的資料字典
- 關於 mysql 中的 rand () 查詢問題MySql
- 關於分頁查詢的優化思路優化
- 關於index檔案呼叫查詢Index
- 閃回(關於閃回查詢)
- 關於禁止ipad的home鍵解決方法iPad