mysql中庫表News,字段以下java
id | int | auto_increment | primary keymysql
title | varcharsql
content | varchar數據庫
date | varchar數組
1:Hibernate的insert操做session
Session session = HibernateSessionFactory.getSession();hibernate
News news = new News();對象
news.setContent("my content");ip
news.setTitle("my title");rem
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();
4:Hibernate的select操做
Hibernate的select操做很是豐富,這裏寫經常使用的:
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()