首页 > 代码库 > Hibernate批量操作数据

Hibernate批量操作数据

批量处理数据

①通过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>