Hibernate中對增刪改查的小結

openkk 12年前發布 | 4K 次閱讀 5.2.1版本發布

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();
 
 
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()

 本文由用戶 openkk 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!