Hibernate3.x 调用存储过程详解

需积分: 0 0 下载量 162 浏览量 更新于2024-08-03 收藏 7KB TXT 举报
"hibernate调用存储过程" 在Java的持久化框架Hibernate中,调用数据库的存储过程是常见的需求。本示例将详细介绍如何在Hibernate 3.x版本中实现对存储过程的调用,包括获取数据、插入数据和更新数据。这里假设我们使用的数据库是MySQL,版本为5.0,并且已经配置了合适的驱动(如mysql-connector-java-5.0.4-bin.jar)。 首先,我们创建一个简单的用户表`tbl_user`,包含`userid`(主键)、`name`和`blog`字段: ```sql 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; ``` 接下来,我们为这个表创建三个存储过程,分别用于获取所有用户信息(`getUserList`)、插入新用户(`createUser`)和更新用户信息(`updateUser`): 1. 获取所有用户信息的存储过程`getUserList`: ```sql DROP PROCEDURE IF EXISTS `getUserList`; CREATE PROCEDURE `getUserList`() BEGIN SELECT * FROM tbl_user; END; ``` 2. 通过输入参数插入新用户的存储过程`createUser`: ```sql 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 (userid, name, blog) VALUES (userid, name, blog); END; ``` 3. 更新用户信息的存储过程`updateUser`: ```sql 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 = useidValue; END; ``` 在Hibernate中调用这些存储过程,我们需要创建对应的`SQLQuery`对象并设置参数。以下是如何在Java代码中调用这些存储过程的示例: ```java SessionFactory sessionFactory = HibernateUtil.getSessionFactory(); Session session = sessionFactory.openSession(); // 调用getUserList存储过程 session.createSQLQuery("CALL getUserList()").addEntity(User.class).list(); // User是对应实体类 // 调用createUser存储过程 session.createSQLQuery("CALL createUser(:userid, :name, :blog)") .setParameter("userid", "newUserId") .setParameter("name", "NewUser") .setParameter("blog", "http://newuser.blog.com") .executeUpdate(); // 调用updateUser存储过程 session.createSQLQuery("CALL updateUser(:nameValue, :blogValue, :useidValue)") .setParameter("nameValue", "UpdatedName") .setParameter("blogValue", "http://updateduser.blog.com") .setParameter("useidValue", "userIdToUpdate") .executeUpdate(); session.close(); HibernateUtil.shutdown(); ``` 在上述代码中,`User`是映射到`tbl_user`表的实体类,`addEntity(User.class)`将查询结果映射为User对象的列表。`setParameter`方法用于设置存储过程中的输入参数。 注意,由于Hibernate主要是面向对象的ORM框架,而存储过程是SQL语句的一部分,因此在调用存储过程时,通常需要使用`createSQLQuery`而不是`createQuery`或`createCriteria`。此外,虽然可以直接通过SQLQuery调用存储过程,但这种方式丢失了Hibernate的一些高级特性,如事务管理、缓存等,因此在实际开发中需要权衡利弊来选择合适的方法。