zoukankan      html  css  js  c++  java
  • 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>

  • 相关阅读:
    2019年书单
    JMeter报错:Address already in use : connect
    读书笔记——弗洛伊德《梦的解析》
    Python3学习之路~10.3 论事件驱动与异步IO
    Python3学习之路~10.2 协程、Greenlet、Gevent
    nmon使用问题汇总(不定期更新)
    ( VIJOS )VOJ 1049 送给圣诞夜的礼品 矩阵快速幂
    POJ3233 Matrix Power Series 矩阵乘法
    NYOJ 298 点的变换 矩阵乘法
    HDU 5834 Magic boy Bi Luo with his excited tree 树形dp
  • 原文地址:https://www.cnblogs.com/Fc-ios/p/3794178.html
Copyright © 2011-2022 走看看