批量处理数据
①通过session来进行批量操作
?具体的做法是在处理完一个对象或小批量对象后,立刻调用flush方法清理缓存,然后再调用clear方法清空缓存
<!-- 设置JDBC单次批量处理的数目 -->
<property name=”hibernate.jdbc.batch_size”>20</property>
如果对象采用”identity” 标示符生成器,则Hibernate无法在JDBC层进行批量插入操作
进行批量操作是建议关闭二级缓存!!!
<!-- 关闭二级缓存 -->
<property name=”hibernate.cache.user_second_level_cache”>false</property>
②使用callablestatement调用存储过程
1.插入数据的存储过程:
Create or replace procedure login_insert(username in varchar,password in varchar,age in number) as
Begin
Insert into login (username,password,age) values (username,password,age);
End;
2.更新数据的存储过程:
Create or replace procedure login_Update(a in number) as
Begin
Update lobin set age=a where username=’Tom’;
End;
3.删除数据的存储过程:
Create or replace procedure login_delete(uname in varchar) as
Begin
Delete form login where USERNAME = uname;
End;
//调用插入数据的存储过程
Session session = new Configuration().configure().buildSessionFactory().openSessin();
Transaction tran =session.beginTransaction();
CallableStatement cst = session.connection.prepareCall(“{call login_insert(?,?,?)}”);
cst.setString(1,”aaa”);
cst.setString(2,”22222”);
cst.setLong(3,21);
cst.executeUpdate();
Tran.commit();
Session.close();
查询数据的存储过程:
*Logins表示系统游标,将查询结果赋给logins。
Create or replace procedure login_getlist(logins OUT SYS_REFCURSOR)
Begin
Open logins for select * from login;
End;
?在hibernate中如何调用这个带有输出参数(返回结果集)的存储过程:
//调用带有返回结果集的存储过程
Session session = new Configuration().configure().buildSessionFactory().openSession();
Transaction tran = session.beginTransaction();
CallableStatement cst = session.connection().prepareCall(“{call login_getlist(?)}”);
/*调用CallableStatement的registerOutParameter()方法,传参,”1”代表第一个问号,第二个参数Oracle的数据类型,因为存储过程是用系统游标类型的输出参数来返回的结果集,所以在这里要传入一个Oracle游标的类型*/
cst.registerOutParameter(1,oracle.jdbc.OracleTypes.CURSOR);
cst.execute();
ResultSet rs = (ResultSet)cst.getObject(1);//获取存储过程的输出参数,也就是系统游标的输出参数,要使用强制类型转换
While(rs.next()){
System.out.print(“用户名:”+rs.getString(“username”));
System.out.print(“密码:”+rs.getString(“password”));
System.out.print(“年龄:”+rs.getString(“age”));
}
Tran.commit();
Session.close();
使用命名SQL调用存储过程:
<!-- 调用查询的存储过程, callable=”true”代表我们的声明的命名支持SQL存储过程,不能省略,省略会报错-->
<sql-query name=”loginGetList”callable=”true”>
{call login_getlist(?)}
<return alias=”1” class=”com.test.Login” />
</sql-query>
Hibernate批量操作数据,布布扣,bubuko.com