`

Hibernate3.x调用存储过程大揭密

阅读更多

Hibernate3.x调用存储过程大揭密

作者:IT168 Amigo  2007-05-14
<script>init_Nav();</script>

    【IT168 专稿】本文以详尽的实例展示了hibernate3.x中调用存储过程各步骤,从建立测试表、存储过程的建立、工程的建立以及类的编写和测试一步一步引导用户学习hibernate3.x中调用存储过程的方法。
如果底层数据库(eg. Oracle、mysql、sqlserver)等支持存储过程,可通过存储过程执行批量删除、更新等操作。本文以实例说明在hibernate3.x中如何调用存储过程。
   说明:本例hibernate所用版本为3.0,mysql所用版本为5.0,所用数据库驱动为mysql-connector-java-5.0.4-bin.jar。

一. 建表与初始化数据
  在mysql的test数据库中建立一张新表:tbl_user,建表语句如下:
  DROP TABLE IF EXISTS `user`;
CREATE TABLE `tbl_user` (
   `userid` varchar(50) NOT NULL,
   `name` varchar(50) default '',
   `blog` varchar(50) default '',
   PRIMARY KEY  (`userid`)
) ENGINE=InnoDB DEFAULT CHARSET=gb2312;

  建表成功后,在该表中任意插入几条数据。

二. 建立存储过程
为测试hibernate3.x中存储过程的调用,我们在user表中建立getUserList、createUser、updateUser和deleteUser这四个存储过程,在mysql中建立存储过程的语句如下:
1. 获得用户信息列表的存储过程--getUserList
DROP PROCEDURE IF EXISTS `getUserList`;
CREATE PROCEDURE `getUserList`()
begin
     select * from  tbl_user;
end;

2. 通过传入的参数创建用户的存储过程--createUser
DROP PROCEDURE IF EXISTS `createUser`;
CREATE PROCEDURE `createUser`(IN userid varchar(50), IN name varchar(50), IN blog varchar(50))
begin
    insert into tbl_user values(userid, name, blog);
end;

3. 通过传入的参数更新用户信息的存储过程--updateUser
DROP PROCEDURE IF EXISTS `updateUser`;
CREATE PROCEDURE `updateUser`(IN nameValue varchar(50), IN blogValue varchar(50), IN useidValue varchar(50))
begin
    update tbl_user set name = nameValue, blog = blogValue where userid = useridValue;
end;

4. 删除用户信息的存储过程--deleteUser
DROP PROCEDURE IF EXISTS `deleteUser`;
CREATE PROCEDURE `deleteUser`(IN useridValue int(11))
begin
    delete from tbl_user where userid = useridValue;
end;

三. 编码与测试
    在准备工作完成后,进入编码与测试阶段,本例演示了在hibernate3.0中调用mysql的存储过程的方法。

1、hibernate的配置文件
在hibernate的配置文件中包含数据库的连接信息,以及加入OR mapping的xml格式的映射文件,该文件如下(部分内容略):

 

<!---->…… <property name="connection.url">jdbc:mysql://localhost:3306/testproperty> <property name="connection.username">rootproperty> <property name="connection.password">rootproperty> <property name="connection.driver_class">com.mysql.jdbc.Driverproperty> <property name="dialect">org.hibernate.dialect.MySQLDialectproperty> <property name="show_sql">trueproperty> <mapping resource="com/amigo/proc/model/User.hbm.xml"/> ……

 

2、OR Mapping文件

    产生的OR Mapping文件有User.java以及其对应的hibernate映射文件User.hbm.xml。其中User.java的内容如下:
public class User implements java.io.Serializable {
 private static final long serialVersionUID = 1L;
 /** 用户id*/
 private String userid;
 /** 用户姓名*/
 private String name;
 /** 用户blog*/
 private String blog;
//省略get/set方法
}

User.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"> <hibernate-mapping package="com.amigo.proc.model"> <class name="User" table="tbl_user"> <id name="userid" column="userid"> <generator class="assigned"/> id> <property name="name" column="name" type="string" /> <property name="blog" column="blog" type="string" /> class> <sql-query name="getUserList" callable="true"> <return alias="user" class="User"> <return-property name="userid" column="userid"/> <return-property name="name" column="name"/> <return-property name="blog" column="blog" /> return> {call getUserList()} sql-query> hibernate-mapping>

 


    在该文件中需注意中的这段代码,调用的存储过程在其中定义,并定义了调用存储过程后将记录组装成User对象,同时对记录的字段与对象的属性进行相关映射。

3. hibernate调用存储过程的测试类
本类是该例的核心类,在本类中,以实例清楚地说明了在hibernate中如何调用存储过程,例示了hibernate调用查询、更新、插入和删除这四类存储过程的方法,该类的内容如下:

 

<!---->// hibernate调用存储过程 public class ProcTest ...{ public static void main(String[] args) throws Exception ...{ ProcTest proc = new ProcTest(); Session session = HibernateSessionFactory.getSession(); proc.testProcQuery(session); proc.testProcUpdate(session); System.out.println("update successfully"); proc.testProcInsert(session); System.out.println("insert successfully"); proc.testProcDelete(session); System.out.println("delete successfully"); session.close(); } // 测试实现查询的存储过程 private void testProcQuery(Session session) throws Exception ...{ //查询用户列表 List list = session.getNamedQuery("getUserList").list(); for (int i = 0; i < list.size(); i++) ...{ User user = (User) list.get(i); System.out.print("序号: " + (i+1)); System.out.print(", userid: " + user.getUserid()); System.out.print(", name: " + user.getName()); System.out.println(", blog: " + user.getBlog()); } } /**//** * 测试实现更新的存储过程 * @throws Exception */ private void testProcUpdate(Session session) throws Exception ...{ //更新用户信息 Transaction tx = session.beginTransaction(); Connection con = session.connection(); String procedure = "{call updateUser(?, ?, ?)}"; CallableStatement cstmt = con.prepareCall(procedure); cstmt.setString(1, "陈xx"); cstmt.setString(2, "http://www.blogjava.net/sterningChen"); cstmt.setString(3, "sterning"); cstmt.executeUpdate(); tx.commit(); } // 测试实现插入的存储过程 private void testProcInsert(Session session) throws Exception ...{ //创建用户信息 session.beginTransaction(); PreparedStatement st = session.connection().prepareStatement("{call createUser(?, ?, ?)}"); st.setString(1, "amigo"); st.setString(2, "阿蜜果"); st.setString(3, "http://www.wblogjava.net/amigoxie"); st.execute(); session.getTransaction().commit(); } // 测试实现删除的存储过程 private void testProcDelete(Session session) throws Exception ...{ //删除用户信息 session.beginTransaction(); PreparedStatement st = session.connection().prepareStatement("{call deleteUser (?)}"); st.setString(1, "amigo"); st.execute(); session.getTransaction().commit(); } }

 

    在本类中,调用查询类存储过程时,调用session.getNamedQuery("…")方法来获得User.hbm.xml中配置的查询存储过程。在其余的存储过程调用的测试中,首先通过hibernate的session获得connection,然后调用connection对象的相应方法来实现存储过程的调用。

五.总结
   本例提出了在hibernate3中调用mysql的存储过程的实现方案,从本例可以看出,hibernate提供了在*.hbm.xml中配置调用存储过程,并通过向用户提供session.getNamedQuery("…")方法来调用配置的调用查询相关的存储过程的方法,另外,hibernate还提供了取得sql的connection的方法,从而能够通过connection中存储过程调用相关的方法来实现存储过程的调用。

分享到:
评论
1 楼 cheatsky 2008-08-14  
您好!hibernate提供的在*.hbm.xml中配置调用存储过程,关于<class>属性中<set>属性,在<sql-query>中是怎么配置的啊 ?

相关推荐

    妙解Hibernate 3.x:叩响面向对象思想之门 PDF

    《妙解Hibernate 3.x:叩响面向对象思想之门》是一本深入解析Hibernate框架的专著,旨在帮助读者理解并掌握面向对象编程思想在实际开发中的应用,尤其是在使用Hibernate时如何有效地进行数据持久化。这本书是面向...

    Struts2.X+Hibernate3.X+Spring2.5 整合

    标题"Struts2.X+Hibernate3.X+Spring2.5 整合"指的是将这三个框架的特定版本(Struts2.X,Hibernate3.X,Spring2.5)集成到同一个项目中,实现高效的企业级应用开发。这种整合能够充分利用各个框架的优势,使开发者...

    hibernate4.x jar

    3. Criteria 查询:除了传统的HQL(Hibernate查询语言)之外,Hibernate 4.x 还提供了Criteria API,允许动态构建查询,更直观地表达复杂的查询逻辑。 4. 第二级缓存:Hibernate 支持第二级缓存,可以提高数据读取...

    hibernate3全部jar包:hibernate3.jar.zip 下载

    Hibernate3 是一个强大的Java持久化框架,它允许开发者将数据库操作与业务逻辑解耦,使得应用程序的开发更为简便。这个“hibernate3全部jar包:hibernate3.jar.zip”包含了所有必要的库文件,方便用户一次性下载并...

    hibernate3.x JAR包集合_马士兵版

    "hibernate3.x JAR包集合_马士兵版" 指的是一个包含Hibernate 3.x版本所有必要的JAR文件的集合,由知名IT教育家马士兵提供。这个集合是为了便于学习和使用Hibernate 3.x框架而准备的,适用于初学者和开发者,确保...

    springmvc, spring5.x , hibernate5.x 整合

    在Spring 5.x中,还可以利用Spring Data JPA,它提供了更高级别的抽象,简化了DAO层的编写,只需要定义Repository接口,大部分数据库操作即可自动生成。 总的来说,这个整合项目将涉及Web开发的多个层面,包括Web层...

    SSH(Struts2.1+Spring2.X+Hibernate3.X)整合,新手必备

    SSH整合是Java Web开发中的一种常见技术组合,指的是Struts2、Spring和Hibernate三大框架的集成。这三种框架分别在表现层、业务层和服务层扮演重要角色,它们的结合能够帮助开发者构建高效、灵活和可维护的Web应用...

    Spring3.1.1+Struct+hibernate3.x必须的jar包

    Hibernate3.x支持实体类、HQL(Hibernate查询语言)、Criteria查询和二级缓存,极大地简化了数据访问层的实现。在项目中,通常会包含如hibernate-core、hibernate-entitymanager等核心库,以及如jta、ejb3-...

    Hibernate3.x简单配置示例

    **Hibernate3.x简介** Hibernate 是一个开放源代码的对象关系映射框架,它对JDBC进行了非常轻量级的对象封装,使得Java程序员可以使用面向对象的方式来操作数据库。在Hibernate3.x版本中,它提供了更为完善的对象...

    Ext2.1 struts1.x spring 2.x hibernate 2.x

    尽管之后的版本(如Hibernate 3.x和4.x)增加了更多功能和性能优化,但Hibernate 2.x仍是许多项目的基础。 在实际项目中,这四个技术的组合通常用来创建一个三层架构的应用:EXT JS 2.1负责前端交互和展示,Struts1...

    hibernate3.jar

    hibernate3.jar hibernate3.jar

    hibernate3.x参考文档

    《Hibernate3.x参考文档》是针对Java开发人员的一份重要资料,它详尽地阐述了Hibernate3.x框架的各项功能和使用方法。Hibernate是一款强大的对象关系映射(ORM)框架,它简化了Java应用程序与数据库之间的交互,使得...

    Struts1.x Spring2.x Hibernate3.x DWR2.x整合工具文档v1.00

    ### Struts1.x、Spring2.x、Hibernate3.x 和 DWR2.x 整合知识点解析 #### 一、Struts1.x与Spring2.x的整合 **1.1 在web.xml中进行Struts和Spring的配置** 为了实现Struts1.x与Spring2.x的无缝集成,首先需要在...

    hibernate调用存储过程

    hibernate调用存储过程 hibernate调用存储过程 hibernate调用存储过程 hibernate调用存储过程 hibernate调用存储过程 hibernate调用存储过程 hibernate调用存储过程

    struts2 +hibernate3.x + sping 所有类库 jar包

    Struts2、Hibernate3.x和Spring是Java Web开发中的三个重要框架,它们分别负责MVC模式中的控制器、持久层管理和应用上下文管理。这组框架的整合使用,通常被称为S2SH,为开发者提供了强大的功能,提高了开发效率。...

    struts1.x+spring 2.x+hibernate3.x jar包 组合

    Struts1.x、Spring 2.x 和 Hibernate3.x 是经典的Java Web开发框架组合,被称为SSH(Struts-Spring-Hibernate)集成。这个jar包集合包含了这三个框架的核心库和其他相关依赖,便于开发者快速搭建一个基于MVC模式的...

    我见过的最好的最详细的hibernate3.6.X学习资料(汤阳光)

    【hibernate3.6.X】是一个流行的Java持久化框架,它实现了ORM(对象关系映射)技术,使得开发者可以通过面向对象的方式处理数据库操作,从而降低了数据库编程的复杂性。在传统的三层架构中,hibernate常被用作数据...

    reference manual for hibernate 3.x.rar

    《Hibernate 3.x 参考手册》是Java开发者不可或缺的一份资源,它详细阐述了Hibernate这一流行的ORM(对象关系映射)框架在3.x版本中的使用方法和核心概念。Hibernate作为一个开源的Java库,旨在简化数据库操作,通过...

Global site tag (gtag.js) - Google Analytics