EJB3 JPA 调用原生SQL 和 函数 存储过程

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

1. 调查JPQL如何使用原生SQL

…………….//创建EntityManager em

List users = em.createNativeQuery("SELECT * FROM USER").getResultList();

for(int i=0;i< users.size();i++){

Object[] object = (Object[])users.get(i);

for(int j=0;j

System.out.print(object[j]+" ");

}

System.out.println();

}

原生SQL分页(网上资料)

RowID :数据创建时生成

Rownum: 查询时生成

1.根据ROWID来分

select * from t_xiaoxi where rowid in(select rid from (select rownum rn,rid from(select rowid rid,cid from t_xiaoxi order by cid desc) where rownum<10000) where rn>9980) order by cid desc;

执行时间0.03秒

2.按分析函数来分

select * from (select t.*,row_number() over(order by cid desc) rk from t_xiaoxi t) where rk<10000 and rk>9980;

执行时间1.01秒

3.按ROWNUM来分

select * from(select t.*,rownum rn from(select * from t_xiaoxi order by cid desc) t where rownum<10000) where

rn>9980;执行时间0.1秒

其中t_xiaoxi为表名称,cid为表的关键字段,取按CID降序排序后的第9981-9999条记录,t_xiaoxi表有70000多条记录

个人感觉1的效率最好,3次之,2最差

原生SQL实现对m_user分页

select *

from m_user

where

rowid in(

select rid

from(

select rownum rn,rid

from(

select rowid rid

from

m_user

order by user_id

)where rownum <10

)where rn >4

)order by user_id

2.调查Oracle如何创建存储过程

网上资料

1 CREATE OR REPLACE PROCEDURE 存储过程名

2 IS

3 BEGIN

4 NULL;

5 END;

行1:

CREATE OR REPLACE PROCEDURE 是一个SQL语句通知Oracle数据库去创建一个叫做skeleton存储过程, 如果存在就覆盖它;

行2:

IS关键词表明后面将跟随一个PL/SQL体。

行3:

BEGIN关键词表明PL/SQL体的开始。

行4:

NULL PL/SQL语句表明什么事都不做,这句不能删去,因为PL/SQL体中至少需要有一句;

行5:

END关键词表明PL/SQL体的结束

用函数实现分页

create or replace function f_test(page number, pageSize number) return sys_refcursor is

users sys_refcursor;

begin

open users for

select *

from m_user

where

rowid in(

select rid

from(

select rownum rn,rid

from(

select rowid rid

from

m_user

order by user_id

)where rownum <=((page-1)*pageSize+pageSize)

)where rn >((page-1)*pageSize)

)order by user_id;

return(users);

end f_test;

3. 调查JPQL如何调用存储过程

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

…………….//创建EntityManager em

Query query = em.createNativeQuery("{call p_test2('48','106')}");

query.executeUpdate();

4.说明调用存储过程和用原生SQL的优缺点

原生查询的缺点:

原生查询的缺点是结果绑定的复杂性。在实际中,您经常需要处理复杂类型的结果集。在这种情况下,您需要声明一个可以将您的原生查询映射到的实体,或者定义一个映射到多个实体或实体和标量结果的组合的复杂结果集。

原生查询的另一个缺点是Java 代码直接依赖于底层数据库结构。如果您修改该底层结构,您将需要在您的servlet 和/或其他应用程序组件中调整相关的原生查询,然后再重新编译和部署这些组件。

原生查询的优点:

原生SQL是多数关系数据库管理系统所支持的工业标准。使具有完全不同底层结构的不同数据库系统可以使用相同的结构化查询语言语言作为数据输入与管理的接口。它们与JPQL 查询一样,返回实体实例而不是数据库表记录。原生SQL提供的许多JPQL不支持的重要特性,如JPQL 的SUM 聚合函数不能将算术表达式当作参数,将JPQL 替换为原生SQL 将更加高效。

存储过程的优点:

存储过程在运算时生成执行方式,所以,以后对其再运行时其执行速度很快。可以利用存储过程,将复杂的SQL 查询移到在数据库内部存储和执行的程序中,然后调用这些存储的程序而非直接调用底层表。这在实践中意味着,存储过程可以免去直接从硬编码到您的Java 代码中的查询处理底层表的麻烦。该方法的好处是,大多数情况下,您不必修改Java 代码来顺应底层数据库结构中的更改,而只需修复存储过程。

存储过程可以用于降低网络流量,存储过程代码直接存储于数据库中,所以不会产生大量T-sql语句的代码流量。

存储过程缺点:

不支持面向对象的设计,无法采用面向对象的方式将业务逻辑进行封装,从而无法形成通用的可支持复用的业务逻辑框架。

相关文档
最新文档