一、批量处理操作

批量处理数据是指在一个事务场景中处理大量数据。在应用程序中难以避免进行批量操作,Hibernate提供了以下方式进行批量处理数据:

  (1)使用HQL进行批量操作 数据库层面

  (2)使用JDBC API进行批量操作 数据库层面

  (3)使用Session进行批量操作 会进缓存

1.使用HQL进行批量操作

HQL可以查询数据,也可以批量插入、更新和删除数据。HQL批量操作实际上直接在数据库中完成,处理的数据不需要加载到Session缓存中。使用Query接口的executeUpdate()方法执行用于插入、更新和删除的HQL语句。

以Emp和Dept为例:

例:批量添加3个部门

        @Test
public void addTest(){
String hql="insert into Dept(deptName) select d.deptName||d.deptNo from Dept d where d.deptNo>0";
Query query=session.createQuery(hql);
int count=query.executeUpdate();
System.out.println("add ok!!");
}

2.使用JDBC  API进行批量操作

  在Hibernate应用中使用JDBC API批量执行插入、修改和删除语句时,需要使用Session的doWork(Work work)方法执行Work对象指定的操作,即调用Work对象的execute()方法。Session把当前使用的数据库连接传给execute()方法,执行持久化操作。

  例:实现批量修改部门名称

将部门编号大于3的修改为开发部

  注意:该方式使用的连接依然是最初的连接对象,并且命令对象依然是根据连接创建的,注意这里是SQL语句,不是HQL语句

   @Test
public void updateTest(){
final String sql="update Dept set deptname=? where deptno>?";
Work work=new Work(){
public void execute(Connection con) throws SQLException{
PreparedStatement ps = con.prepareStatement(sql); ps.setString(1,"开发部");
ps.setInt(2, 3); int count=ps.executeUpdate();
//System.out.println(count);
}
};
session.doWork(work);
System.out.println("update ok!!!");
}

实现效果:

3、实现session进行批量操作

使用Session对象处理大量持久化对象,需及时从缓存中清空已经处理完毕并且不会再访问的对象。可以在处理完成一个对象或小批量对象后,调用flush()方法强制同步缓存和数据库,然后调用clear()方法清空缓存。

例:批量添加15个员工

   /*
* session 实现批量添加15个员工
*/
@Test
public void addSessionTest(){
for(int i=0;i<=15;i++){
Emp emp=new Emp();
emp.setEmpName("呵呵"+i); Dept dept=new Dept();
dept.setDeptNo(1);
emp.setDept(dept);
session.save(emp); if(i%10==0){
session.flush();
session.clear();
}
}
System.out.println("add ok!!");
}

输出结果:

------------------------------------------------------------------------------------------------------------

二、HQL连接查询

HQL提供的连接方式如下表所示:

内连接:

语法:

from Entity inner join Entity.property

例:使用内连接查询员工隶属的部门

list集合中的每个元素都是一个Object数组,from后面紧接的是部门 则输出的先是部门的内存地址

 /*
* 内连接 员工隶属的部门
*/ @Test
public void innerTest(){ Query query=session.createQuery("from Dept d inner join d.emps");
List<Object[]> list = query.list();
for (Object[] item : list) {
//一个item就是一个数组
System.out.println(((Dept)item[0]).getDeptName()+"\t"+((Emp)item[1]).getEmpName());
} }

隐式内连接:

在HQL查询语句中,如果对Emp类赋别名为”e”,可以通过e.dept.deptName的形式访问dept对象的deptName属性。使用隐式内连接按部门查询员工信息。

例:按部门条件查询员工信息

  /*
* 隐式内连接 按部门条件查询员工信息
*/ @Test
public void hideTest(){ Query query=session.createQuery("from Emp e where e.dept.deptName='开发部'");
List<Emp> list = query.list();
for (Emp item : list) {
//一个item就是一个数组
System.out.println(item.getEmpName());
}
}

3、迫切内连接

例:查询所有的雇员名称和隶属部门名称  需使用关键字fetch

      /*
* 迫切内连接 查询所有的雇员名称和隶属部门名称
*/ @Test
public void FetchTest(){
Query query=session.createQuery("from Dept d inner join fetch d.emps");
List<Dept> list=query.list();
for (Dept item : list) {
System.out.println(item.getDeptName()+"\t"+item.getEmps().iterator().next().getEmpName());
}
}

Hibernate批量处理数据、[HQL连接查询]的更多相关文章

  1. Hibernate批量处理数据、HQL连接查询

    一.批量处理操作 批量处理数据是指在一个事务场景中处理大量数据.在应用程序中难以避免进行批量操作,Hibernate提供了以下方式进行批量处理数据: (1)使用HQL进行批量操作     数据库层面 ...

  2. 【学习笔记】Hibernate HQL连接查询和数据批处理 (Y2-1-7)

    HQL连接查询 和SQL查询一样 hql也支持各种链接查询 如内连接 外连接 具体如下 左外连接 left (outer) join 迫切左外连接 left (outer) join fetch 右外 ...

  3. HQL连接查询和注解

    HQL连接查询和注解 一:HQL连接查询 各种连接查询: 内连接:inner join或join From Entity inner [inner] join [fetch] Entity.prope ...

  4. Hibernate 批量update数据时,怎么样做可以回滚,

    Hibernate 批量update数据时,怎么样做可以回滚, 1.serviceManagerDaoImpl代码里对异常不进行try,catch抛出, 2.或者抛出throw new Runtime ...

  5. HQL连接查询

    HQL提供了连接查询机制如内连接,外连接,,还允许显示指定迫切内连接,和迫切外联结. 连接类型 内连接 inner join 或join 迫切内链接 inner join fetch 左外联结  le ...

  6. Hibernate批量处理数据

    01.批量插入数据 步骤一.创建实体类,Dept和Emp /** * 员工类 * @author Administrator * */ public class Emp { private Integ ...

  7. hibernate 批量处理数据

    批量处理数据是指处理大量数据的一个单独的事务. 在应用层批处理操作, 主要有以下方式: 通过 Session 通过 HQL 通过 StatelessSession 通过 JDBC API(仅仅要会用这 ...

  8. hibernate 批量插入数据

    如题,有两种方法 1)使用FLUSH 2)使用JDBC 分别来解释: 1)hibernate在进行数据库操作的时候,都要有事务支持的.可能你曾遇到过,没有加事务,程序会报错的情况. 而事务每次提交的时 ...

  9. DQL数据查询语言——连接查询

    --内连接 两种写法 等值连接select r.*,b.bummc from t_hq_ryxx r, t_hq_bm b where r.bumbm = b.bumbm select r.*,b.b ...

随机推荐

  1. AngularJS 指令的 Scope (作用域)

    参考:https://segmentfault.com/a/1190000002773689 每当一个指令被创建的时候,都会有这样一个选择,是继承自己的父作用域(一般是外部的Controller提供的 ...

  2. Oracle性能优化之oracle里表、索引、列的统计信息

    一.表的统计信息 表的统计信息用于描述表的详细信息,包括记录数(num_rows).表块的数量(blocks).平均行长度(avg_row_len)等典型维度.这些维度可以通过数据字典表DBA_TAB ...

  3. 内核通信之Netlink源码分析-用户内核通信原理3

    2017-07-06 上节主讲了用户层通过netlink和内核交互的详细过程,本节分析下用户层接收数据的过程…… 有了之前基础知识的介绍,用户层接收数据只涉及到一个核心调用readmsg(), 其他的 ...

  4. 新安装和已安装nginx如何添加未编译安装模块/补丁

    新安装和已安装nginx如何添加未编译安装模块/补丁 --http://www.apelearn.com/bbs/forum.php?mod=viewthread&tid=10485& ...

  5. centos linux系统日常管理复习 CPU物理数逻辑核数,iftop ,iotop ,sar ,ps,netstat ,一网卡多IP,mii-tool 连接,ethtool速率,一个网卡配置多个IP,mii-tool 连接,ethtool速率 ,crontab备份, 第十八节课

    centos linux系统日常管理复习 物理CPU和每颗CPU的逻辑核数,uptime ,w,vmstat,iftop ,iotop ,sar ,ps,netstat ,一个网卡配置多个IP,mii ...

  6. postman:模拟发送一个需要cookie认证的请求

    1.chrome 已安装插件intercept. 由于chrome安全的限制,发不出带cookie的请求.如果想要发送带cookie的请求,需要开启Interceptor. 2.chrome 浏览器要 ...

  7. SaltStack系列(四)之实例编写

    前面已经介绍的够多了,这里来让我们写一些完整的实例来梳理一下. 强调一下,sls文件的抒写格式都是"-"后面跟一个空格,然后后面跟参数: 然后后面再跟一个空格,然后是要填写的值.但 ...

  8. 命令行下开启与关闭windows防火墙关端口(转)

    sc config sharedaccess start= auto //设置防火墙服务为自动 net start sharedaccess //开启防火墙服务 关闭端口 netsh firewall ...

  9. 禁止复制操作 --《C++必知必会》条款32

    class NoCopy{ private: //声明为私有的,则外部不可访问,即:不可复制 NoCopy(const NoCopy & );//复制构造函数 NoCopy & ope ...

  10. MyBatis—mapper.xml映射配置

    SQL文件映射(mapper文件),几个顶级元素的配置: mapper元素:根节点只有一个属性namespace(命名空间)作用: 1:用于区分不同的mapper,全局唯一. 2:绑定DAO接口,即面 ...