1.通过jdbc来执行sql
在Hibernate3中,尽管Session的connection方法还存在,但已经被废弃,不提倡使用了,不过Hibernate提供了
替代方案:org.hibernate.jdbc.Work接口表示直接通过JDBC API来访问数据库的操作,Work接口的execute()
当通过JDBC API中的PrepareStatement接口来执行SQL语句时,SQL语句中涉及到的数据不会被加载到
Session的缓存中,因此不会占用内存空间。
2.实现存储过程
创建一个存储过程
除了可以直接在数据库直接运行存储过程,也可通过程序调用:
Hibernate3使用如下方式调用jdbc
Transaction tx = session.beginTransaction();
//获得该session使用的数据库连接
java.sql.connection con = session.connection();
PrepareStatement stmt = con.prepareStatement("update CUSTOMERS set AGE=AGE+1 where AGE>0");
stmt.executeUpdate();
tx.commit();
在Hibernate3中,尽管Session的connection方法还存在,但已经被废弃,不提倡使用了,不过Hibernate提供了
替代方案:org.hibernate.jdbc.Work接口表示直接通过JDBC API来访问数据库的操作,Work接口的execute()
方法用于执行直接通过JDBC API来访问数据库的操作:
Transaction tx = session.beginTransaction();
//定义一个匿名累类,实现了Work的接口
</pre><pre name="code" class="java">Work work = new Work(){
public void execute(Connection connection) throws Exception{
//通过JDBC API执行用于批量更新的SQL语句
PrepareStatement stmt = connection.prepareStatement("update CUSTOMERS set AGE=AGE+1 where AGE>0");
stmt.executeUpdate();
}
};
//执行work
session.dowork(work);
tx.commit();
当通过JDBC API中的PrepareStatement接口来执行SQL语句时,SQL语句中涉及到的数据不会被加载到
Session的缓存中,因此不会占用内存空间。
2.实现存储过程
创建一个存储过程
create or replace procedure batch (p_age in number) as
begin
update CUSTOMERS set AGE=AGE+1 where AGE>p_age;
end;
除了可以直接在数据库直接运行存储过程,也可通过程序调用:
Transaction tx = session.beginTransaction();
//获得该session使用的数据库连接
java.sql.Connection con = session.connection();
String procedure = "{call batch(?)}";
//通过jdbc api调用存储过程
CallableStatement csmt = connection.prepareCall(procedure);
csmt.setInt(1,0);//把年龄参数设为0
csmt.executeUpdate();
tx.commit();
Hibernate3使用如下方式调用jdbc
Transaction tx = session.beginTransaction();
//定义一个匿名类实现了work接口
Work work = new Work(){
public void execute(Connection connection) throws Exception{
String procedure = "{call batch(?)}";
//通过jdbc api调用存储过程
CallableStatement csmt = connection.prepareCall(procedure);
csmt.setInt(1,0);
csmt.executeUpdate();
}
};
//执行work
session.dowork(work);
tx.commit();