批量处理数据:指的是在一个事务场景中需要处理大量数据。
Hibernate进行批量处理数据的方式:
1.使用HQL进行批量操作:HQL是跨数据库的,面向对象,但具有局限性,只能用于单个持久化类,不支持连接,不能使用子查询
2.使用JDBC API进行批量操作:操作方式简单,可以在sql中使用不同数据库的特性
3.使用Session进行批量操作:把关系数据加载到内存中操作,需要通过代码处理复杂的业务逻辑
使用HQL进行批量操作:
1.HQL可以查询数据,批量插入和更新以及删除数据,实际在数据库中完成,处理的数据不用加载到Session缓存中。
使用Query接口的executeUpdate()方法用于插入,更新 和删除操作的hql语句
首先需要SessionUtil.java:
import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.Transaction;
import db.HibernateSessionFactory;
public class SessionUtil {
protected Session session=null;
protected Query query = null;
protected Transaction tx= null;
public Session getSession(){
return HibernateSessionFactory.getSession();
}
public void closeSession(){
HibernateSessionFactory.closeSession();
}
}
ps:SessionUtil需要包含HibernateSessionFactory.java,其在Hibernate导入jar包自动生成。
a.批量添加操作:addManyEntity(List<Entity> list)
主要代码:
/**
* [addManyEntity :批量添加,Entity属于实体类]
getSession():获取session
beginTransaction():事务开始
commit():事务提交
rollback():失误回滚
* @param {[利用List集合进行遍历]} List<Entity> list
*/
public void addManyEntity(List<Entity> list) {
try {
session=getSession();
tx=session.beginTransaction();
for (Entity entity: list) {
session.save(entity);
}
tx.commit();
System.out.println("操作成功!");
} catch (Exception e) {
e.printStackTrace();
tx.rollback();
System.out.println("操作失败!");
}
finally{
closeSession();
}
}
b.批量修改:updateManyEntity(数据类型 属性1,数据类型 属性2)
主要代码:
/**
* [updateManyEntity 批量修改]
* @param {[实体类的属性的数据类型决定]} 数据类型 属性1 [实体类的属性]
* @param {[实体类的属性的数据类型决定]} 数据类型 属性2 [实体类的属性]
*/
public void updateManyEntity(数据类型 属性1,数据类型 属性2) {
String hql="update 实体类名 set 属性名=:属性名 where 属性名=:属性名";
try {
session=getSession();
tx=session.beginTransaction();
query=session.createQuery(hql);
query.setParameter("属性1", 属性1);
query.setParameter("属性2", 属性2);
int num=query.executeUpdate();
System.out.print("修改的数据为:"+num);
tx.commit();
System.out.println("操作成功!");
} catch (Exception e) {
e.printStackTrace();
tx.rollback();
System.out.println("操作失败!");
}
finally{
closeSession();
}
}
c.批量删除:deleteManyEntity(数据类型 属性1)
主要代码:
/**
* [deleteManyEntity 批量删除]
* @param {[有实体类的属性的数据类型决定]} 数据类型 属性 [一般都是根据主键来删除]
*/
public void deleteManyEntity(数据类型 属性) {
String hql="delete from 实体类名 where 属性名=:属性名";
try {
session=getSession();
tx=session.beginTransaction();
query=session.createQuery(hql);
query.setParameter("属性", 属性);
int num=query.executeUpdate();
System.out.print("删除的数据为:"+num);
tx.commit();
System.out.println("操作成功!");
} catch (Exception e) {
e.printStackTrace();
tx.rollback();
System.out.println("操作失败!");
}
finally{
closeSession();
}
}
使用JDBC API进行批量操作:
1.批量更新:
/**
* [updateEntity 批量更新]
* 1.需要使用session的doWork(Work work)方法执行Work对象指定的操作,就是调用execute()的方法
* 2.Session把当前的数据库连接传给execute()方法
*
*/
public void updateEntity(数据类型 属性1,数据类型 属性2) {
final String sql="update 表名 set 属性=? where 属性=?";
try {
session=getSession();
tx=session.beginTransaction();
Work work=new Work() {
@Override
public void execute(Connection connection) throws SQLException {
PreparedStatement preparedStatement=connection.prepareStatement(sql);
preparedStatement.setString(1, 属性);
preparedStatement.setInt(2, 属性);
preparedStatement.executeUpdate();
}
};
session.doWork(work);
tx.commit();
System.out.println("操作成功!");
} catch (Exception e) {
e.printStackTrace();
tx.rollback();
System.out.println("操作失败!");
}
finally{
closeSession();
}
}
2. 批量删除
/**
* [deleteEntity 批量删除]
* 1.需要使用session的doWork(Work work)方法执行Work对象指定的操作,就是调用execute()的方法
* 2.Session把当前的数据库连接传给execute()方法
*
*/
public void deleteEntity(数据类型 属性1,数据类型 属性2) {
final String sql="delete 表名 where 属性=?";
try {
session=getSession();
tx=session.beginTransaction();
Work work=new Work() {
@Override
public void execute(Connection connection) throws SQLException {
PreparedStatement preparedStatement=connection.prepareStatement(sql);
preparedStatement.setString(1, 属性);
preparedStatement.executeUpdate();
}
};
session.doWork(work);
tx.commit();
System.out.println("操作成功!");
} catch (Exception e) {
e.printStackTrace();
tx.rollback();
System.out.println("操作失败!");
}
finally{
closeSession();
}
}
3.批量查询:findAllEntity()
主要代码:
/**
* [findAllEntity 批量查询]
* 2种遍历集合的方式:
* 1.Object[]数组:List<Object[]>list=query.list();
query=session.createSQLQuery(sql);
List<Object[]>list=query.list();
for (Object[] objects : list) {
for (Object object : objects) {
System.out.print(object+"\t");
}
System.out.println("");
}
* 2.实体类的形式:List<Entity>list=query.list();
* query=session.createSQLQuery(sql).addEntity(Entity.class);
List<Entity>list=query.list();
for (Entity entity : list) {
System.out.println(entity.getXX());
}
*
*
*/
public void findAllEntity() {
String sql="select *from student";
try {
session=getSession();
//第一种:Object[]
/*query=session.createSQLQuery(sql);
List<Object[]>list=query.list();
for (Object[] objects : list) {
for (Object object : objects) {
System.out.print(object+"\t");
}
System.out.println("");
}*/
//第二种:实体类
query=session.createSQLQuery(sql).addEntity(Entity.class);
List<Entity>list=query.list();
for (Entity entity : list) {
System.out.println(entity.getXX());
}
System.out.println(list.size());
System.out.println("操作成功!");
} catch (Exception e) {
e.printStackTrace();
System.out.println("操作失败!");
}
finally{
closeSession();
}
}
3.条件查询:
/**
*
*
* addEntity(alias【别名1】, entityClass【实体类】)
* addJoin(alias【关联的别名】, path【别名1的属性】)
* {}:获取别名对应的属性名
* 别名.*:代表获取别名下面所有的属性
*/
public void findEntityByXX() {
String sql="select {别名1.*},{别名2.*} from 表名1 别名1 inner join 表名2 别名2 on 别名1.字段名=别名2.字段名";
try {
session=getSession();
query=session.createSQLQuery(sql).addEntity("别名", Entity.class).addJoin("别名", "别名.表名2");
List list=query.list();
System.out.println(list.size());
} catch (Exception e) {
e.printStackTrace();
}
finally{
closeSession();
}
4.命名查询:
需要在Entity.hbm.xml中:
<query name="自定义:getEntity">
<![CDATA[
hql语句
]]>
</query>
主要代码:
/**
* 1.第一种方式:不加条件查询:query=session.getNamedQuery("getEntity");
* 2.第二种:条件查询:query.setParameter("属性名", "条件");
*
*/
public void getEntityXX() {
try {
session=getSession();
query=session.getNamedQuery("getEntity");
query.setParameter("属性名", "条件");
List<Entity>list=query.list();
for (Entity entity : list) {
System.out.println(entity.getXX());
}
} catch (Exception e) {
e.printStackTrace();
}
finally{
closeSession();
}
}
使用Session进行批量操作:
需要及时从缓存中清除已经处理完毕并且不会再访问的对象:
首先:调用flush()方法强制同步缓存和数据库:session.flush();
然后:调用clear()方法清空缓存:session.clear();
Hibernate批量操作
时间: 2024-08-04 18:41:51
Hibernate批量操作的相关文章
Hibernate批量操作(一)
在项目的开发过程之中,我们常会遇到数据的批量处理问题.在持久层采用Hibernate框架时,在进行批量操作时,需要考虑Hibernate实现机制带来的一些问题. 我们知道在每个Hibernate Session中都维持了一个必选的数据缓存,所有保存的实例都将保存在Session缓存中,这个缓存随着Session的创建而存在,随着Session的销毁而消亡.这个内部缓存正常情况下是由Hibernate自动维护的,并且没有容量限制.在批量插入与更新时,由于每次保存的实体都会保存在Session缓存中
Hibernate批量操作(二)
Hibernate提供了一系列的查询接口,这些接口在实现上又有所不同.这里对Hibernate中的查询接口进行一个小结. 我们首先来看一下session加载实体对象的过程:Session在调用数据库查询前,首先会在缓存中进行查询.如果在内部缓存中通过实体类型和id进行查找并命中,数据状态合法,则直接返回.如果内部缓存中未发现有效数据,则查询第二级缓存,如果第二级缓存命中,则返回.如在第二级缓存中没有命中,则发起数据库查询操作(Select SQL),根据映射配置和Select SQL得到的Res
hibernate 批量操作saveOrUpdateAll
1. getHibernateTemplate().saveOrUpdateAll(entities): getHibernateTemplate().deleteAll(entities): hibernate提供的批量增加和修改的方法 ,参数是实体类集合. 其实跟saveOrUpdate(Object obj) 一样,最终操作使用的是session.saveOrUpdate(entityName, entity); 循环使用的是同一个session对象.不确定是否效率比自己写外部循环
Hibernate大复习
/* 1.Hibernate的体系结构 2.Hibernate API体系 3.配置Hibernate 4.Hibernate映射配置文件 5.Hibernate会话管理 */ /* Hibernate的映射机制 1.Hibernate基本映射数据类型 2.Hibernate的主键映射 3.Hibernate的实体映射 4.映射一对一关联关系 5.映射多对一的单向关联关系 6.映射一对多的双向关联关系 7.映射一对多双向自身关联关系 8.映射多对多单向关联关系 9.映射多对多双向关联关系 10.
Hibernate管理Session和批量操作
Hibernate管理Session Hibernate自身提供了三种管理Session对象的方法 Session对象的生命周期与本地线程绑定 Session对象的生命周期与JTA事务绑定 Hibernate委托程序管理Session对象的生命周期 在Hibernate的配置文件中,hibernate.current_session_context_class属性用于指定Session管理方式,可选值包括 thread:Session对象的生命周期与本地线程绑定 jta*:Session对象的生
Hibernate的批量操作
批量插入 Hibernate强制开启了一级缓存,缓存空间是有限的,如果批量操作的SQL语句太多,就会运行失败(内存溢出), 因此在批量操作的时候,每执行一批SQL语句,都需要刷新缓存,例如下面这样,每执行20条SQL,刷新一次缓存. 1 for (int i = 0; i < 10000; i++) { 2 User u = new User("张三", 20, "中国广州"); 3 sess.save(u); 4 if (i % 20 == 0) { 5 s
Hibernate深入浅出(九)持久层操作——数据保存&;批量操作
数据保存: 1)session.save session.save方法用于实体对象到数据库的持久化操作.也就是说,session.save方法调用与实体对象所匹配的Insert SQL,将数据插入库表. 结合一个简单实例来进行讨论: 1 2 3 4 5 TUser user = new TUser(); user.setName("Luna"); Transaction tx = session.beginTransaction(); session.save(user); tx.co
Hibernate 缓存机制
一.why(为什么要用Hibernate缓存?) Hibernate是一个持久层框架,经常访问物理数据库. 为了降低应用程序对物理数据源访问的频次,从而提高应用程序的运行性能. 缓存内的数据是对物理数据源中的数据的复制,应用程序在运行时从缓存读写数据,在特定的时刻或事件会同步缓存和物理数据源的数据. 二.what(Hibernate缓存原理是怎样的?)Hibernate缓存包括两大类:Hibernate一级缓存和Hibernate二级缓存. 1.Hibernate一级缓存又称为“Session的
hibernate 一级缓存
一级缓存 为什么要用缓存? 目的:减少对数据库的访问次数!从而提升hibernate的执行效率! Hibernate中缓存分类: 一级缓存 二级缓存 概念 1)Hibenate中一级缓存,也叫做session的缓存,它可以在session范围内减少数据库的访问次数! 只在session范围有效! Session关闭,一级缓存失效! 2)当调用session的save/saveOrUpdate/get/load/list/iterator方法的时候,都会把对象放入session的缓存中. 3)S