Hibernate裏的增刪改查實現代碼筆記

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

相關文章
相關標籤/搜索