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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Hibernate中对增删改查的小结

發布時間:2023/12/13 编程问答 38 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Hibernate中对增删改查的小结 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

Hibernate中對增刪改查的小結
mysql中庫表News,字段如下
id????? |? int???? |? auto_increment? |? primary key
title?? |? varchar
content |? varchar
date??? |? varchar

1:Hibernate的insert操作
??????? Session session = HibernateSessionFactory.getSession();
???????
??????? News news = new News();
??????? news.setContent("my content");
??????? news.setTitle("my title");
??????? news.setDate("my date"); //news是VO
???????
??????? Transaction trans = session.beginTransaction();
??????? session.save(news); //news是PO
??????? trans.commit();???? //任何有關數據庫更新的操作都是commit后進數據庫的

??????? HibernateSessionFactory.closeSession();

?

2:Hibernate的update操作
??????? Session session = HibernateSessionFactory.getSession();

??????? News news = new News();
??????? news.setId(103);? //id不可少,Hibernate只通過id來查找數據庫
??????? news.setContent("update content");
??????? news.setTitle("update title");
???????
??????? Transaction trans = session.beginTransaction();
??????? session.update(news);
??????? trans.commit();

??????? HibernateSessionFactory.closeSession();

?

注意這里我們更新數據不想對date進行更新,所以沒寫 setDate ,但Hibernate會認為我們是想把date設置為null,所以如果要更新表中一些字段,最好用下面的方法。

??????? Session session = HibernateSessionFactory.getSession();

??????? Transaction trans = session.beginTransaction();
??????? News news = (News)session.get(News.class, 103);? //*****(1)
??????? news.setDate("update date");? //*****(2)
??????? session.save(news);? //*****(3)
??????? trans.commit();

??????? HibernateSessionFactory.closeSession();

?

這里其實對數據庫進行了兩次操作,(1)時從數據庫中把相應紀錄查找出來,這里news是一個PO,(2)對PO進行date的更新,其他數據沒變,然后(3)保存,由于(1)查出的數據就有title,content,所以保存時候title和content都不會是null。

3:Hibernate的delete操作
??????? Session session = HibernateSessionFactory.getSession();

??????? Transaction trans = session.beginTransaction();
??????? News news = new News();
??????? news.setId(8);? //用下面那句效果一樣,只是多了句select
//????? News news = (News)session.get(News.class, 8);

??????? session.delete(news);
??????? trans.commit();

??????? HibernateSessionFactory.closeSession();

?
注意,只能通過id來刪除數據,不能通過title或content來刪除,會報缺少標示符錯誤。

使用hql來刪除(可作批量刪除)
??????? Session session = HibernateSessionFactory.getSession();
??????? String hql = "delete Billdetail where name>'detailName1'";
??????? Query query = session.createQuery(hql);
??????? int ref = query.executeUpdate();
??????? session.beginTransaction().commit();
??????? System.out.println("delete dates=>"+ref); //操作條數

??????? session.close();
?
1.criteria查詢
??????? Session session = HibernateSessionFactory.getSession();

??????? Criteria c = session.createCriteria(News.class);//News是類,所以N大寫
??????? c.add(Expression.lt("date", "date5"));
??????? c.add(Expression.between("date", "date1", "date8"));
??????? c.addOrder(Order.desc("date"));


??????? List<News> list = c.list();
??????? for(int i=0;i<list.size();i++)
??????? {
??????????? System.out.println(list.get(i).getId()+":"+list.get(i).getDate());
??????? }

??????? HibernateSessionFactory.closeSession();

?

比較符合面向對象的概念,因為庫表和JAVA類已經作了映射關系,注意Hibernate的所有操作都是針對JAVA類的,而不是庫表,所以要區分大小寫。
上面的查詢相當于sql是: select * from news where date < 'date5' and date BETWEEN 'date1' and 'date8' ORDER by date desc;

2.HQL查詢
??????? Query query = session.createQuery("from News ");
??????? List<News> list = query.list();? //遍歷同上

?

HQL是Hibernate主推的查詢方式,和普通SQL語句也比較接近,但很重要一點不同就是HQL中from后面的是JAVA類名,不是庫表名,切忌!!!其它就是如果查詢全字段 "select *" 可以省略不寫。

當不是查詢全字段,或者是從兩張表中聯合查詢數據時,返回的是一個數組:
??????? Session session = HibernateSessionFactory.getSession();

??????? Query query = session.createQuery("select n.id,n.title,u.username from News as n,User u");
??????? List list = query.list();//這里每一行都是一個1維數組
??????? for(int i=0;i<list.size();i++)
??????? {
??????????? Object []o = (Object[])list.get(i);? //轉型為數組
??????????? int id = (Integer)o[0];? //和select中順序的類型相對應,可以是類
??????????? String title = (String)o[1];
??????????? String username = (String)o[2];
??????????? System.out.println("id:"+id+" , "+"title"+title+" , "+username);
??????? }

??????? HibernateSessionFactory.closeSession();

?

查詢結果集的大小(和Hibernate2中稍微有點不同)
(Integer)session.createQuery("select count(*) from User").iterate().next();
?


3.SqlQuery查詢
??????? List<News> list = session.createSQLQuery("select * from News").addEntity(News.class).list();?

?

addEntity 不能忘記,這種查詢方式是把查詢好的結果放到一個實體中,再遍歷操作,不推薦使用。

SqlQuery查詢一些字段時候用addScalar:
SQLQuery query = session.createSQLQuery("select id,title from News");
??????? query.addScalar("id", Hibernate.INTEGER);? //注冊字段類型,同下
??????? query.addScalar("title",new org.hibernate.type.StringType());
??????? List list = query.list();
??????? for(int i=0;i<list.size();i++)
??????? {
??????????? Object[] o = (Object[])list.get(i);
??????????? int id = (Integer)o[0];
??????????? String title = (String)o[1];
??????????? System.out.println("id:"+id+" , title:"+title);
??????? }
?

javabean的屬性可以作為命名的查詢參數(HQL)
??????? Session session = HibernateSessionFactory.getSession();
??????? Transaction trans = session.beginTransaction()

??????? Query query = session.createQuery("from room in class Room where room.name=:a")
??????? query.setParameter("a", "room1");? //和prepareStatement相似

??????
?

//???? Room room1 = new Room();?
//???? room1.setName("room1");????
//???? Query query = session.createQuery("from room in class Room where room.name=:name");? //如果用javabean設置參數來查詢,=:name的name一定和Room中對應
//???? query.setProperties(room1);
?

???????
??????? List<Room> list = query.list();
??????? for(int i=0;i<list.size();i++)
??????? {
??????????? System.out.println(list.get(i).getName()+":"+list.get(i).getDescription());
??????? }
???????
??????? trans.commit();
??????? HibernateSessionFactory.closeSession()
?

轉載于:https://www.cnblogs.com/qinqinmeiren/archive/2010/09/06/2151709.html

總結

以上是生活随笔為你收集整理的Hibernate中对增删改查的小结的全部內容,希望文章能夠幫你解決所遇到的問題。

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