Hibernate 调用查询存储过程,以及持久化存储过程

<!-- /* Font Definitions */ @font-face {font-family:宋体; panose-1:2 1 6 0 3 1 1 1 1 1; mso-font-alt:SimSun; mso-font-charset:134; mso-generic-font-family:auto; mso-font-pitch:variable; mso-font-signature:3 135135232 16 0 262145 0;} @font-face {font-family:"Cambria Math"; panose-1:2 4 5 3 5 4 6 3 2 4; mso-font-charset:1; mso-generic-font-family:roman; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:0 0 0 0 0 0;} @font-face {font-family:Calibri; panose-1:2 15 5 2 2 2 4 3 2 4; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:-1610611985 1073750139 0 0 159 0;} @font-face {font-family:"/@宋体"; panose-1:2 1 6 0 3 1 1 1 1 1; mso-font-charset:134; mso-generic-font-family:auto; mso-font-pitch:variable; mso-font-signature:3 135135232 16 0 262145 0;} /* Style Definitions */ p.MsoNormal, li.MsoNormal, div.MsoNormal {mso-style-unhide:no; mso-style-qformat:yes; mso-style-parent:""; margin:0cm; margin-bottom:.0001pt; text-align:justify; text-justify:inter-ideograph; mso-pagination:none; font-size:10.5pt; mso-bidi-font-size:11.0pt; font-family:"Calibri","sans-serif"; mso-fareast-font-family:宋体; mso-bidi-font-family:"Times New Roman"; mso-font-kerning:1.0pt;} .MsoChpDefault {mso-style-type:export-only; mso-default-props:yes; font-size:10.0pt; mso-ansi-font-size:10.0pt; mso-bidi-font-size:10.0pt; mso-ascii-font-family:Calibri; mso-fareast-font-family:宋体; mso-hansi-font-family:Calibri; mso-font-kerning:0pt;} /* Page Definitions */ @page {mso-page-border-surround-header:no; mso-page-border-surround-footer:no;} @page Section1 {size:595.3pt 841.9pt; margin:36.0pt 36.0pt 36.0pt 36.0pt; mso-header-margin:42.55pt; mso-footer-margin:49.6pt; mso-paper-source:0; layout-grid:15.6pt;} div.Section1 {page:Section1;} /* List Definitions */ @list l0 {mso-list-id:182019087; mso-list-template-ids:-1240400606;} ol {margin-bottom:0cm;} ul {margin-bottom:0cm;} -->

Hibernate 调用查询存储过程,以及持久化存储过程

hibernate 提供了在*.hbm.xml 中配置调用存储过程,并通过向用户提供session.getNamedQuery("…") 方法来调用配置的调用查询相关的 存储过程的方法,另外,hibernate 还提供了取得sqlconnection 的方法,从而能够通过connection 中存储过程调用相关的方法 来实现存储过程的调用。
注意这两种存储过程的调用方式是不同的,在Hiberante 是方便了查询,它可以在*.hbm.xml 中配置存储过程返 回值的信息,然后通过配置,就可以把返回值封装成对象的集合。而使用持久化的存储过程,那就还是要直接使用到JDBC 调用存储过程的API 即使用到 CallableStatement 对象。
下面我就使用代码来介绍这两种存储过程的调用

调用返回对象集合的存储过程

1
、创建person

create table person

(

 id int identity primary key,

 [name] varchar(50),

 age int 

)

2 、创建查询person 表中的信息的存储过程和插入数据的存储过程

CREATE PROC proc_getlist_per @name VARCHAR(50) AS

 SELECT * FROM  person WHERE [name]=@name

GO

 

create proc proc_inert_per @name varchar(30),@age int as

 insert into person(name,age) values(@name,@age)

go

 

3 、在你的工程中生成Hibernate 映射,这里就不介绍了,下面重点介绍映射文件中的配置信息

4
Person 对象的映射配置文件 Person.hbm.xml 中的映射信息是:

<?xml version="1.0"?>

<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"

"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">

<!-- 

    Mapping file autogenerated by MyEclipse - Hibernate Tools

-->

<hibernate-mapping>

    <class name="model.Person" table="Person" schema="dbo" catalog="testDB">

        <id name="id" type="java.lang.Integer">

            <column name="id" />

            <generator class="identity" />

        </id>

        <property name="name" type="java.lang.String">

            <column name="Name" length="32" not-null="true" />

        </property>

        <property name="age" type="java.lang.Integer">

            <column name="age" not-null="true" />

        </property>

    </class>

    

<!--   下面   sql-query   节点是你自己添加的要调用的存储过程的信息 -->

<!-- name="proc_getlist"   是在代码中  session.getNamedQuery("pro_insert")  要使用的名称    

     callable="true"  表示要调用的是存储过程,

      下面的  return  节点是要配置   要封装   存储过程中的返回的数据集    的对象信息

      class="model.Person"  表示要封装到哪个对象,

      其中   alias="person"  是这个要封装的对象的别名,可以随便取名

      后面的 return-property  是要对应存储过程返回的数据集中对应的列要对应到   封装对象的那个属性字段

     

     {call proc_getlist_per(?)}  这就是要调用存储过程的语法     是你的参数占位符

     

      随后配置存储过程中的要输入的参数信息   则使用

     <query-param name="name" type="String"/>

 -->

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

  <return alias="person" class="model.Person">

   <return-property name="id" column="id"/>

   <return-property name="name" column="name"/>

   <return-property name="age" column="age" />

  </return>

  {call proc_getlist_per(?)}

  <query-param name="name" type="String"/>

 </sql-query>

</hibernate-mapping>

  1.  


下面是DAO 中调用的方法

    public List<Person> listPerson(){

        session = HibernateSessionFactory.getSession();

        Query query= null;

        // 使用存储过程获取数据

        query=session.getNamedQuery("proc_getlist");

        query.setString(0, " 小强 ");

        return query.list();

    }

main 方法中调用

     List<Person> list=dao.listPerson();

        for(Person person:list){

            System.out.println(person);

         }

即可

下面介绍持久化的存储过程,不返回数据集的 。
没有返回数据集的存储过程就不能在*.hbm.xml 文件中配置了,那么它可以直接在DAO 中这样写

         session=HibernateSessionFactory.getSession();

        Transaction tx=null;

        try{

        tx = session.beginTransaction();

        Connection con=session.connection();

 

        String procedure = "{call proc_inert_per(?,?) }";

        CallableStatement cstmt = con.prepareCall(procedure);

        cstmt.setString(1,per.getName());

        cstmt.setInt(2, per.getAge());

        cstmt.executeUpdate();

        tx.commit();

        con.setAutoCommit(true);

        }catch(Exception e){

            e.printStackTrace();

        }


这样就可以了

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值