Network Security Internet Technology Development Database Servers Mobile Phone Android Software Apple Software Computer Software News IT Information

In addition to Weibo, there is also WeChat

Please pay attention

WeChat public account

Shulou

What is the solution to the returned value of EJB query?

2025-01-18 Update From: SLTechnology News&Howtos shulou NAV: SLTechnology News&Howtos > Development >

Share

Shulou(Shulou.com)06/02 Report--

这期内容当中小编将会给大家带来有关EJB查询返回值的解决方法是什么呢,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。

关于EJB查询返回值的解决方法

多少天来,为此问题寝食难安,我曾发誓若我能解决这个问题就要把它贴满各大BBS,如今得偿所愿。

csdn的Java版还需努力,最好分一下,如:javaunion

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

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

JDBCTutorial/chapter5.html">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.4jrerowset.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

12/27/2001

Any question .NET">mailto:myvrml@263.net

上述就是小编为大家分享的EJB查询返回值的解决方法是什么呢了,如果刚好有类似的疑惑,不妨参照上述分析进行理解。如果想知道更多相关知识,欢迎关注行业资讯频道。

Welcome to subscribe "Shulou Technology Information " to get latest news, interesting things and hot topics in the IT industry, and controls the hottest and latest Internet news, technology news and IT industry trends.

Views: 0

*The comments in the above article only represent the author's personal views and do not represent the views and positions of this website. If you have more insights, please feel free to contribute and share.

Share To

Development

Wechat

© 2024 shulou.com SLNews company. All rights reserved.

12
Report