批量處理數據:指的是在一個事務場景中需要處理大量數據。
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批量操作
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.