EJB3.0实例教程如何调用存储过程

来源:互联网 发布:祛痘美白的护肤品知乎 编辑:程序博客网 时间:2024/05/29 09:08

浪曦视频在线J2ee系列讲座

调用存储过程

 

要调用存储过程,我们可以通过 EntityManager 对象的 createNativeQuery()方法执行 SQL 语句(注意:这里说的是SQL 语句,不是 EJB3 QL),  调用存储过程的 SQL 格式如下:

{call  存储过程名称(参数 1,  参数 2, )}

EJB3 中你可以调用的存储过程有两种

1.无返回值的存储过程。

2.返回值为 ResultSet(以 select 形式返回的值)的存储过程,EJB3 不能调用以 OUT 参数返回值的存储过程

下面我们看看几种具有代表性的存储过程的调用方法.

 

 

1  调用无返回值的存储过程

 

 

我们首先创建一个名为 AddPerson 的存储过程,他的 DDL 如下(注:本例使用的是Sql2000 数据库):

CREATE PROCEDURE `AddPerson`() NOT DETERMINISTIC

SQL SECURITY DEFINER COMMENT ''

BEGIN

INSERT into person values( null,'存储过程',1,25,'1980');

END;

      

 

下面的代码片断展示了无返回值存储过程的调用方法:

 

@PersistenceContext

protected EntityManager em;

private String QueryNoneReturnValueStoreProcedure(){

 

//调用无返回参数的存储过程

Query query = em.createNativeQuery("{call AddPerson()}");

query.executeUpdate();

StringBuffer out = new StringBuffer("*************** QueryNoneReturnValueStoreProcedure  结果打印  ****************<BR>");

return out.toString();

}

 

 

2  调用返回单值的存储过程

我们首先创建一个名为 GetPersonName 的存储过程,他有一个  INTEGER 类型的输入参数,存储过程的 DDL 下(注:本例使用的是Sql2000数据库):

CREATE PROCEDURE `GetPersonName`(IN Pid INTEGER(11)) NOT DETERMINISTIC

SQL SECURITY DEFINER COMMENT ''

BEGIN

select personname from person where `personid`=Pid;

 END;

上面的 select 语句不一定要从表中取数据,你也可以这样写:select foshanren

下面的代码片断展示了返回单值的存储过程的调用方法:

@PersistenceContext protected EntityManager em;

private String QuerySingleObjectStoreProcedure(){

//调用返回单个值的存储过程

Query query = em.createNativeQuery("{call GetPersonName(?)}");

query.setParameter(1, new Integer(1));

String result = query.getSingleResult().toString();

StringBuffer out = new StringBuffer("*************** QuerySingleObjectStoreProcedure  结果打

  ****************<BR>"); out.append("返回值(人员姓名)为:"+ result+ "<BR>"); return out.toString();

}

3  调用返回表全部列的存储过程

我们首先创建一个名为 GetPersonList 的存储过程,他的 DDL 如下(注:本例使用的是Sql2000数据库):

CREATE PROCEDURE `GetPersonList`() NOT DETERMINISTIC

SQL SECURITY DEFINER COMMENT ''

BEGIN

select * from person;

END;

 

下面的代码片断展示了返回表全部列的存储过程的调用方法,我们可以让 EJB3  Persistence 运行环境将列值直接

 

填充入一个 Entity 的实例(本例填充进 Person 对象),并将实例作为结果返回.

@PersistenceContext protected EntityManager em;

private String QueryStoreProcedure(){

//调用返回 Person 全部列的存储过程

Query query = em.createNativeQuery("{call GetPersonList()}", Person.class); List result = query.getResultList();

StringBuffer out = new StringBuffer("*************** QueryStoreProcedure  结果打印

****************");

if (result!=null){

Iterator iterator = result.iterator();

while( iterator.hasNext() ){

Person person= (Person)iterator.next();

out.append(person.getName()+ "<BR>");

}

}

return out.toString();

}

 

4  调用返回部分列的存储过程

我们首先创建一个名为 GetPersonPartProperties 的存储过程,他的 DDL 如下(注:本例使用的是Sql2000数据库):

CREATE PROCEDURE `GetPersonPartProperties`() NOT DETERMINISTIC

SQL SECURITY DEFINER

COMMENT '' BEGIN

SELECT personid, personname from person;

END;

 

上面的 select 语句不一定要从表中取数据,你也可以这样写:select 3000, foshanren

下面的代码片断展示了返回部分列的存储过程的调用方法.

@PersistenceContext protected EntityManager em;

private String QueryPartColumnStoreProcedure(){

//调用返回部分列的存储过程

Query query = em.createNativeQuery("{call GetPersonPartProperties()}"); List result = query.getResultList();

StringBuffer out = new StringBuffer("*************** QueryPartColumnStoreProcedure  结果打印

****************");

if (result!=null){

Iterator iterator = result.iterator();

while( iterator.hasNext() ){

//取每一行

Object[] row = ( Object[]) iterator.next();

//数组中的第一个值是 personid

int personid = Integer.parseInt(row[0].toString()); String PersonName = row[1].toString();

out.append("人员 ID="+ personid+ ";  姓名="+PersonName+ "<BR>");

}

}

return out.toString();

}

SQL2000的存储过程调用

 

create table person(

personid  int primary key ,

personname varchar(10) not null,

age varchar(10) not null,

sex varchar(10) not null

)

select * from person

create procedure addperson

       as

begin

INSERT into person values( 1,'存储过程',1,25);

end

 

create procedure getperson

@pid int

       as

begin

select personname from person where personid=@pid;

end

 

create procedure getonepart

 

       as

begin

select personid ,personname from person ;

end

 

create procedure getAllperson

 

       as

begin

select * from person ;

end

 

原创粉丝点击