博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Hibernate如何调用存储过程
阅读量:4220 次
发布时间:2019-05-26

本文共 2414 字,大约阅读时间需要 8 分钟。

Connection   con   =   session.connect();    
  CallableStatement   proc   =   null;    
  con   =   connectionPool.getConnection();    
  proc   =   con.prepareCall("{   call   set_death_age(?,   ?)   }");    
  proc.setString(1,   XXX);    
  proc.setInt(2,   XXx);    
  ...  
  proc.execute();    
  session.close(); 

在Hibernate中调用存储过程的示范代码- -

                                      

如果底层数据库(如Oracle)支持存储过程,也可以通过存储过程来执行批量更新。存储过程直接在数据库中运行,速度更加快。在Oracle数据库中可以定义一个名为batchUpdateStudent()的存储过程,代码如下:

create or replace procedure batchUpdateStudent(p_age in number) as

begin
update STUDENT set AGE=AGE+1 where AGE>p_age;
end;

以上存储过程有一个参数p_age,代表学生的年龄,应用程序可按照以下方式调用存储过程:

tx = session.beginTransaction();

Connection con=session.connection();

String procedure = "{call batchUpdateStudent(?) }";

CallableStatement cstmt = con.prepareCall(procedure);
cstmt.setInt(1,0); //把年龄参数设为0
cstmt.executeUpdate();
tx.commit();

在以上代码中,我用的是Hibernate的 Transaction接口来声明事务,而不是采用JDBC API来声明事务。

 存储过程中有一个参数p_age,代表客户的年龄,应用程序可按照以下方式调用存储过程:    
  代码内容  
  tx   =   session.beginTransaction();      
  Connection   con=session.connection();      
  String   procedure   =   "{call   batchUpdateCustomer(?)   }";      
  CallableStatement   cstmt   =   con.prepareCall(procedure);      
  cstmt.setInt(1,0);   //把年龄参数设为0      
  cstmt.executeUpdate();      
  tx.commit();      

 

CREATE  procedure selectAllUsers 

DYNAMIC RESULT SETS 1
BEGIN 
      DECLARE temp_cursor1 CURSOR  WITH RETURN TO CLIENT  FOR 
      SELECT * FROM  test;   
      OPEN temp_cursor1;
END;

映射文件中关于存储过程内容如下

<hibernate-mapping package="com.unmi.vo">

    <class name="Test" table="TEST">
     ............
    </class>

    <sql-query callable="true" name="selectAllUsers">

<return alias="aa" class="Test">
    <return-property name="oborqt" column="OBORQT"/>
    <return-property name="moorqt" column="MOORQT"/>
    <return-property name="roschn" column="ROSCHN"/>
    <return-property name="plandate" column="PLANDATE"/>
</return>
{ ? = call selectAllUsers() }
    </sql-query>
</hibernate-mapping>

{ ? = call selectAllUsers() } 也可以写成{ call selectAllUsers() },

如果有参数就写成
{ ? = call selectAllUsers(?,?,?) }
代码中对query设置相应位置上的值就OK

Java调用关键代码如下

      
  Session session = HibernateUtil.currentSession();
  Query query = session.getNamedQuery("selectAllUsers");
  List list = query.list();
  System.out.println(list);

要求你的存储过程必须能返回记录集,否则要出错

如果你的存储过程是完成非查询任务就应该在配置文件用以下三个标签
  <sql-insert callable="true">{call createPerson (?, ?)}</sql-insert>
  <sql-delete callable="true">{? = call deletePerson (?)}</sql-delete>
  <sql-update callable="true">{? = call updatePerson (?, ?)}</sql-update>

有一点不好的地方就是调用存储过程获取记录集时,不能对Query使用

setFirstResult(int)和setMaxResults(int)方法来分页

转载地址:http://pclmi.baihongyu.com/

你可能感兴趣的文章
C++内存分配秘籍—new,malloc,GlobalAlloc详解
查看>>
Code Review 代码审查 不完全整理
查看>>
结构体内存对齐详解
查看>>
关于C++兼容C,C++在linux程序设计API的调用等问题
查看>>
Linux下如何编译并运行C程序
查看>>
在linux下编译运行c语言程序
查看>>
C++/CLI,摘自百度的基本概念
查看>>
浅议C /CLI的gcnew关键字
查看>>
浅议C /CLI的gcnew关键字(2)
查看>>
CR, LF, CR/LF 回车 换行
查看>>
回车(CR)与换行(LF), '\r'和'\n'的区别
查看>>
对C标准中空白字符(空格、回车符(\r)、换行符(\n)、水平制表符(\t)、垂直制表符(\v)、换页符(\f))的理解
查看>>
ASCII码表_全_完整版
查看>>
DLL导出STL模板类和成员变量
查看>>
C++ STL 一般总结
查看>>
谷歌微软等科技巨头数据科学面试107道真题:你能答出多少?
查看>>
漫画赏析:Linux 内核到底长啥样
查看>>
Json解析的四种方法
查看>>
C/C++预编译头的概念
查看>>
C++程序员必读:让你的代码更强大
查看>>