1、1. 调查JPQL如何使用原生SQL./创建EntityManager emList 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;jobject.length;j+) System.out.print(objectj+ ); System.out.println(); 原生SQL分页(网上资料)RowID :数据创建时生成Rownum: 查询时生
2、成1. 根据ROWID来分select * from t_xiaoxi where rowid in(select rid from (select rownum rn,rid from(select rowid rid,cid fromt_xiaoxi order by cid desc) where rownum9980) order by cid desc;执行时间0.03秒2.按分析函数来分select * from (select t.*,row_number() over(order by cid desc) rk from t_xiaoxi t) where rk9980;执行时
3、间1.01秒3.按ROWNUM来分select * from(select t.*,rownum rn from(select * from t_xiaoxi order by cid desc) t where rownum9980;执行时间0.1秒其中t_xiaoxi为表名称,cid为表的关键字段,取按CID降序排序后的第9981-9999条记录,t_xiaoxi表有70000多条记录个人感觉1的效率最好,3次之,2最差原生SQL实现对m_user分页select *from m_userwhere rowid in( select rid from( select rownum rn,r
4、id from( select rowid rid from m_user order by user_id )where rownum 4 )order by user_id2. 调查Oracle如何创建存储过程网上资料1CREATEORREPLACEPROCEDURE存储过程名2IS3BEGIN4NULL;5END;行1:CREATEORREPLACEPROCEDURE是一个SQL语句通知Oracle数据库去创建一个叫做skeleton存储过程,如果存在就覆盖它;行2:IS关键词表明后面将跟随一个PL/SQL体。行3:BEGIN关键词表明PL/SQL体的开始。行4:NULLPL/SQL语句
5、表明什么事都不做,这句不能删去,因为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
6、 order by user_id )where rownum (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的优缺点原生查询的缺点: 原生查询的缺点是结果绑定的复杂性。在实际中,您经常需要处理复杂类型的结果集。在这种情况下,您需
7、要声明一个可以将您的原生查询映射到的实体,或者定义一个映射到多个实体或实体和标量结果的组合的复杂结果集。原生查询的另一个缺点是Java 代码直接依赖于底层数据库结构。如果您修改该底层结构,您将需要在您的 servlet 和/或其他应用程序组件中调整相关的原生查询,然后再重新编译和部署这些组件。原生查询的优点: 原生SQL是多数关系数据库管理系统所支持的工业标准。使具有完全不同底层结构的不同数据库系统可以使用相同的结构化查询语言语言作为数据输入与管理的接口。它们与 JPQL 查询一样,返回实体实例而不是数据库表记录。原生SQL提供的许多JPQL不支持的重要特性,如JPQL 的SUM 聚合函数不能
8、将算术表达式当作参数,将 JPQL 替换为原生 SQL 将更加高效。存储过程的优点: 存储过程在运算时生成执行方式,所以,以后对其再运行时其执行速度很快。可以利用存储过程,将复杂的 SQL 查询移到在数据库内部存储和执行的程序中,然后调用这些存储的程序而非直接调用底层表。这在实践中意味着,存储过程可以免去直接从硬编码到您的 Java 代码中的查询处理底层表的麻烦。该方法的好处是,大多数情况下,您不必修改 Java 代码来顺应底层数据库结构中的更改,而只需修复存储过程。 存储过程可以用于降低网络流量,存储过程代码直接存储于数据库中,所以不会产生大量T-sql语句的代码流量。存储过程缺点: 不支持面向对象的设计,无法采用面向对象的方式将业务逻辑进行封装,从而无法形成通用的可支持复用的业务逻辑框架。