日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

Hibernate插入、查询、删除操作 HQL or SQL

發布時間:2024/4/17 数据库 42 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Hibernate插入、查询、删除操作 HQL or SQL 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

?http://adoze.bokee.com/viewdiary.25672393.html

?

Hibernate的所有的操作都是通過Session完成的.

基本步驟如下:

1:通過配置文件得到SessionFactory:

???? SessionFactory sessionFactory=new Configuration().configure().buildSessionFactory();

2:通過SessionFactory 得到一個Session

???? Session session=sessionFactory.openSession();

3:通過session進行插入,刪除,修改以及查詢.

??? 插入例子:(1)聲明一個事務;(2)Session執行save()操作;(3)事務提交;(4)關閉Session,可選.???????????????????
???????????? public void insert(Person p){
?? Transaction tran=session.beginTransaction();
?? session.save(p);??????????????
??????????????? tran.commit();?
//?? session.close();?????????????
???????????? }?????
??? 修改例子:(1)聲明一個事務;(2)Session執行update()操作;(3)事務提交;(4)關閉Session,可選.

???????????? public void update(Person p){

?? Transaction tran=session.beginTransaction();

?? session.update(p);

?? tran.commit();

//?? session.close();

?? }

??? 刪除例子(主鍵刪除,推薦使用):(1) 聲明刪除的SQl語句;(2)創建session的Query對象;(3)設置Query對象的參數;(4)執行Query的executeUpdate()操作;(5)Session事務提交

???? public void delete(int id){

?? String hql="delete Person as p where p.id=?";

?? Query query=session.createQuery(hql);

?? query.setInteger(0,id);

?? query.executeUpdate();

?? session.beginTransaction().commit();

??????????? }

?? 刪除例子(對象刪除):(1)聲明一個事務;(2)Session執行delete()操作;(3)事務提交;(4)關閉Session,可選.
??? public void delete(Person p){

?? Transaction tran = session.beginTransaction();

?? session.delete(p);??
?? tran.commit();

?? session.close();??
?? }

?? 查詢例子:(跟刪除差不多) 查詢語句不需要事務提交

(1) 聲明刪除的SQl語句;(2)創建session的Query對象;(3)設置Query對象的參數;

?? public Persion queryById(int id){

?? String hql="from Person as p where p.id=?";

?? Query query=session.createQuery();
?
?? query.setInteger(0,id);

?? List rsList=query.list();

?? iterator it=rsList.iterator();

?? Person person=null;

?? while(it.haseNext()){

???? person=(Person)it.next();

??? }

?? return person;

?? }
session.delete()- -
session.delete(obj)將obj的狀態變為transient。兩種情況
1)obj是session的cache里邊的cache沒有的,比如:
???????? session.delete(new Employee(4));
2)obj存在于session的cache中,比如:
???????? Employee employee = (Employee)session.load(Employee.class, new Integer(4));
???????? session.delete(employee);

這兩種情況都是允許的,hibernate都會發送一條delete語句給數據庫。

delete執行之后,如果調用了session.load(), 又可以分為兩種情況:
1)在session.flush()之前,如:
?????????? tx.beginTransaction();
    session.delete(new Employee(4));
?????????? session.load(Employee.class, new Integer(4));//發生在session.flush()之前
?????????? tx.commit();
????? 那么hibernate會拋出ObjectDeletedException:The object with that id was deleted:

2)在session.flush()之后,如:
?????????? tx.beginTransaction();
    session.delete(new Employee(4));
?????????? session.load(Employee.class, new Integer(4));
?????????? tx.commit();

?????????? tx.beginTransaction();
?????????? session.load(Employee.class, new Integer(4));//同一個session中,上面的tx.commit()將session flush了一次。
?????????? tx.commit();
????? 那么這個時候hibernate僅僅會拋出ObjectNotFoundException:No row with the give...
表示找不到該object。如果第二個tx里邊采用session.get()也就不會拋出exception了。

delete執行之后,如果調用了session.save(obj):
?????????? tx.beginTransaction();
?????????? Employee employee = (Employee)session.load(Employee.class, new Integer(4));
   ? session.delete(employee);
?????????? System.out.println(employee);
?????????? session.save(employee);
?????????? System.out.println(employee);
?????????? tx.commit();
????? 這種情況是完全合理的,合法的,
????? delete將employee從persistent的狀態變為transient的狀態。
????? save將employee從transient狀態變為persistent的狀態。
????? save一個被delete的obj的時候,在save處hibernate強制執行session.flush(),發送delete語句,然后按照常規的save流程來進行。為什么要這么做,還沒有完全想明白。

delete執行之后,如果對obj對象屬性的修改,tx.commit()時不會進行dirtyChecking。
?????? 這個道理比較顯然,這些思想不是完全正確的,還是要更具自己的實際的情況來看到底是怎么一回事.這個記錄是在別人那里抄來的,當時都沒有想太多,所以犯了很多錯誤,但是后來的時候還是給了我很大的幫助,至少我的問題給我解決了,只是換了一種方式!所以我還是很感謝這位朋友所以把這個帖出來!

?

=====

public ? Collection ? findBySQL(String ? sql){
? ? ? Session ? session ? = ? null;
? ? ? Transaction ? tran ? = ? null;
? ? ? Collection ? list ? = ? null;
? ? ? try ? {
? ? ? ? ? session ? = ? sessionFactory.openSession();
? ? ? ? ? tran ? = ? session.beginTransaction();
? ? ? ? ? SQLQuery ? sq ? = ? session.createSQLQuery(sql);
? ? ? ? ? sq.addEntity(Student.class);
? ? ? ? ? list ? = ? sq.list();
? ? ? ? ? tran.commit();
? ? ? } ? catch ? (HibernateException ? e) ? {
? ? ? ? ? e.printStackTrace();
? ? ? ? ? tran.rollback();
? ? ? }finally{
? ? ? ? ? if(session!=null)
? ? ? ? ? session.close();
? ? ? }
? ? ? return ? list;
}

直接用SqlQuery好像不能直接執行 增 刪 改 操作,不過,我找了一下,下面的方法可以的。

trans = session.beginTransaction();
Connection conn = session.connection();
PreparedStatement stmt = conn.prepareStatement(sql);
stmt.executeUpdate();
stmt.execute();
trans.commit();

總結

以上是生活随笔為你收集整理的Hibernate插入、查询、删除操作 HQL or SQL的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。