<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    【Hibernate總結系列】使用舉例

     

    本節講述如何使用Hibernate實現記錄的增、刪、改和查功能。

    1 查詢

           Hibernate中使用查詢時,一般使用Hql查詢語句。

    HQLHibernate Query Language),即Hibernate的查詢語言跟SQL非常相像。不過HQLSQL的最根本的區別,就是它是面向對象的。

    使用HQL時需要注意以下幾點:

    l         大小寫敏感

    因為HQL是面向對象的,而對象類的名稱和屬性都是大小寫敏感的,所以HQL是大小寫敏感的。

    Eg.

    HQL語句:from Cat as cat where cat.id > 1;from Cat as cat where cat.ID > 1;是不一樣的,這點與SQL不同。

    l         from子句

    Eg. from Cat,該句返回Cat對象實例,開發人員也可以給其加上別名,eg. from Cat as cat,對于多表查詢的情況,可參考如下:

    from Cat as cat, Dog as dog

    其它方面都與SQL類似,在此不再贅述。

    接下來講一個在Hibernate中查詢的例子。

    1.1簡單查詢

    List list = session.createQuery("from User as user order by user.loginName").list();

    1.2帶單個參數的查詢

    List list = session.find("from User as user where user.loginName=?",

                                                              loginName,

                                                              Hibernate.STRING);

    1.3多個參數的查詢

    Eg1. 此例采用“?”占位符的方式

    String hql = "from User as user where user.loginName=? and user.orgId=? ";

    Query query = session.createQuery(hql);

    query.setParameter(1, 'amigo');

    query.setParameter(2, new Long(1)) ;

    List list = query .list();

    Eg2. 此例采用“:paramName”的方式

    String hql = "from User as user where user.loginName=:loginName and user.orgId=:orgId ";

    Query query = session.createQuery(hql);

    query.setParameter('loginName', 'amigo');

    query.setParameter('orgId', new Long(1)) ;

    List list = query .list();

    1.4查詢數量

    int count  = (Integer) session.createQuery("select count(*) from User").uniqueResult().intValue();

    1.5限制查詢起始值和數量的查詢

    這種一般是在記錄需要分頁的時候需要用到,例如,在如下的代碼中,限制查詢的開始記錄的位置為50,最大查詢條數為50

    String hql = "from User as user order by user.loginName";

    int firstResult= 50;

    int maxResults = 50;

    Query query = session.createQuery(hql);

    query = query.setFirstResult(firstResult);

    query.setMaxResults(maxResults);

    1.6子查詢

    在某些情況下,也需要用到子查詢,例如在下面的例子中,User為用戶對象,UserRole為用戶與角色關聯對象。如下HQL語句將沒有分配角色的用戶對象查找出來。

    String hql = "from User user where user.loginName"

    + " not in(select ur.user.loginName from UserRole ur) ";

    List list = (session.createQuery(hql)).list();

    1.7原生SQL查詢

    對于某些復雜的查詢語句,需要調用某種特定的數據庫的特定函數才能解決,Hibernate雖然不推薦使用原生SQL語句來查詢,因為這將破壞數據庫的易移植性,但是Hibernate中也提供了使用原生SQL進行查詢的方法,只需要獲得連接即可。

    Eg. 在下面的例子中,用到了Sql Server數據庫中的原生sql語句,如下所示:

    String timeUnit = "13";

    String sql = "select count(*) count, CONVERT(VARCHAR(" + timeUnit +"),  log.gen_datetime,121) timeUnit " + "from Log log";

    SQLQuery query = session.createSQLQuery(sql)

    .addScalar("count", Hibernate.INTEGER)

    .addScalar("timeUnit", Hibernate.STRING);

    List list = query.list();

    2 新增

           在數據庫中新增記錄在Hibernate中不需要使用insert命令,只需要構造新增的對象后,調用Session對象的save(…)方法即可。

    2.1新增單個對象

           新增單個對象的實例如下,該實例將在用戶表中新增一條記錄。

    Session session = HibernateSessionFactory.getSession();

             Transaction ts = null;

    try {

    ts = session.beginTransaction();

                      User user = new User();

                      user.setLoginName("amigo");

                      user.setFullName("阿蜜果");

                      ……

                      session.save(user) ;

                       ts.commit();

    } catch (Exception e) {

                      if (ts != null) {

    ts.rollback();

    }

    } finally {

                       HibernateSessionFactory.closeSession();

    }

    2.2批量新增對象

    對于批量新增對象的情況,需要在新增一部分對象后flushclear一次,例如,沒批量新增20個對象時手動的flush一次,假設在list為一個用戶列表,里面包含很多User對象,那么要將實現這些對象的批量新增,可采用如下方法:

    Session session = HibernateSessionFactory.getSession();

    Transaction ts = null;

    try {

    ts = session.beginTransaction();

    for (int i = 0; i < list.size(); i++) {

                                User user = (User) list.get(i);

                                session.save(user) ;

                                if (i % 20 == 0) {

             session.flush();

             session.clear();

    }

                       }

                       ts.commit();

    } catch (Exception e) {

                       if (ts != null) {

    ts.rollback();

    }

    } finally {

                       HibernateSessionFactory.closeSession();

    }

    3 更新

           hibernate中,更新對象前不需要使用查詢語句:update…,一般需要在取得需要更新的持久化對象后,執行Session對象的update(…)方法。例如:

    Session session = HibernateSessionFactory.getSession();

    Transaction ts = null;

    try {

    ts = session.beginTransaction();

    //取得持久化對象

                       User user = session.get(User.class, "amigo");

                       //對需要修改的屬性進行修改

                       user.setFullName("阿蜜果");

                       ……

                       session.update(user) ;

                       ts.commit();

    } catch (Exception e) {

                       if (ts != null) {

    ts.rollback();

    }

    } finally {

                      HibernateSessionFactory.closeSession();

    }

    4 刪除

    4.1刪除單個對象

           一般在取得某對象后,開發人員可以調用Session對象的delete(…)方法刪除該對象。

    Eg. 下面的實例中取得loginName(主鍵)為“amigo”的User對象后,將它刪除。

    Session session = HibernateSessionFactory.getSession();

    Transaction ts = null;

    try {

    ts = session.beginTransaction();

    //取得持久化對象

                       User user = session.get(User.class, "amigo");

                       session.delete(user) ;

                       ts.commit();

    } catch (Exception e) {

                       if (ts != null) {

    ts.rollback();

    }

    } finally {

                       HibernateSessionFactory.closeSession();

    }

    4.2批量刪除對象

    對于批量刪除對象的情況,開發人員可以在取得待刪除的對象列表后,一個一個的將對象刪除,對于每個對象的刪除方法,見3.4.1小節。開發人員還可以hql語句來做批量刪除。

    Eg. 該實例通過delete語句來刪除記錄,除了loginName為“amigo”的對象為,其余都刪除,代碼如下所示:

    Session session = HibernateSessionFactory.getSession();

    Transaction ts = null;

    try {

    ts = session.beginTransaction();

    String hql = "delete User as user where user.loginName != 'amigo'";

    Query query = session.createQuery(hql);

    int count  = query.executeUpdate();

     ts.commit();

    System.out.println("delete count : " + count); //刪除條數

    } catch (Exception e) {

                       if (ts != null) {

    ts.rollback();

    }

    } finally {

                       HibernateSessionFactory.closeSession();

    }

    http://www.tkk7.com/amigoxie/archive/2008/01/01/171972.html

    posted on 2008-11-15 21:58 smallfa 閱讀(258) 評論(0)  編輯  收藏 所屬分類: hibernate/ibatis

    <2008年11月>
    2627282930311
    2345678
    9101112131415
    16171819202122
    23242526272829
    30123456

    導航

    統計

    公告

    smallfa
    博客園
    C++博客
    博客生活
    Blogjava
    足球博客
    微博
    Redsaga

    常用鏈接

    留言簿(2)

    隨筆分類

    隨筆檔案

    文章分類

    文章檔案

    相冊

    Ajax

    Blogs

    DB

    java

    Open source

    ORM

    Tools/Help

    vedio Tech

    搜索

    最新評論

    閱讀排行榜

    評論排行榜

    主站蜘蛛池模板: 老汉色老汉首页a亚洲| 99久9在线|免费| 亚洲欧洲另类春色校园网站| 久久精品国产亚洲一区二区三区| 欧美在线看片A免费观看| 日韩精品免费视频| 一级毛片免费一级直接观看| 亚洲精品美女久久久久久久| 亚洲视频国产精品| 亚洲AV无码精品色午夜果冻不卡 | 国产va免费精品观看精品| 久久久久国产精品免费网站| 一出一进一爽一粗一大视频免费的 | 一本色道久久88—综合亚洲精品| 亚洲AV无码乱码国产麻豆穿越| 亚洲精品视频免费| 免费h成人黄漫画嘿咻破解版| 四虎成人免费大片在线| 国产91色综合久久免费| **aaaaa毛片免费同男同女| 国产免费拔擦拔擦8X高清在线人| eeuss草民免费| 一级做a爰黑人又硬又粗免费看51社区国产精品视 | **一级一级毛片免费观看| 久草视频在线免费看| 永久在线观看免费视频| aaa毛片免费观看| 中文字幕乱理片免费完整的| 乱爱性全过程免费视频| 免费大片黄在线观看| 牛牛在线精品观看免费正| 免费无码午夜福利片| 精品一区二区三区无码免费直播| 亚洲AV无码专区在线厂| 日本亚洲高清乱码中文在线观看| 自拍偷自拍亚洲精品播放| 午夜亚洲乱码伦小说区69堂| 特级毛片全部免费播放a一级| 国产成人亚洲精品蜜芽影院| 精品一区二区三区免费毛片| 一二三四在线观看免费中文在线观看|