您的位置:首页 > 其它

通过hibernate去调用存储过程

2012-02-11 20:20 316 查看
之前一直误以为用了hibernate之后就不可以使用存储过程了

可能是因为跨平台的考虑,好像这方面的资料还真的是上很少介绍(请允许我的孤陋寡闻)

说实话还真看不出来hibernate调用存储过程有什么优势

Java代码



CREATE TABLE `proctab` (

`id` int ( 11 ) NOT NULL auto_increment,

`Name` varchar ( 20 ),

`age` int ( 11 ),

PRIMARY KEY (`id`)

)

简单的存储过程

Java代码



create PROCEDURE proc()

begin

select * from proctab;

end ;

一种方法是通过hibernate传统的xml映射方式去调用

Java代码



<class name="com.test.User" table="proctab">

<id name="id" column="id">

<generator class="native"/>

</id>

<property name="name" column="name" type="string" />

<property name="age" column="age" type="integer" />

</class>

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

<return alias="user" class="com.test.User">

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

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

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

</return>

{call proc()}

</sql-query>

调用方法

Java代码



Session ss= HibernateSessionFactory.getSession()

List li=ss.getNamedQuery("getUser").list();

ss.close();

及其类似jdbc的方法

Java代码



Session session =HibernateSessionFactory.getSession();

Connection conn = session.connection();

ResultSet rs =null;

CallableStatement call = conn.prepareCall("{Call proc()}");

rs = call.executeQuery();

rs.close();

session.close();

这种方法基本上就是jdbc,不过很简单,总是感觉怪怪的~!

还有就是通过强大的createSQLQuery来实现

o(∩_∩)o...哈哈 个人比较喜欢这种方法

Java代码



Session session =HibernateSessionFactory.getSession();

SQLQuery query = session.createSQLQuery("{Call proc()}");

List list =query.list();

session.close();

如果没有返回值 直接用execute的方法就可以了

(*^__^*) 忘了一个重要的问题就是存储过程的传参问题

Java代码



CallableStatement call = conn.prepareCall("{Call proc(?)}");

call.setString(1, 参数);

rs = call.executeQuery();

Java代码



SQLQuery query = session.createSQLQuery("{Call proc(?)}");

query.setString(0, 参数);

List list =query.list();

o(∩_∩)o..
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: