国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 開發 > 綜合 > 正文

關于Hibernate編程的特點與思考

2024-07-21 02:14:59
字體:
來源:轉載
供稿:網友


  hibernate的一些弱點:比如對象關系的映射配置過多,控制復雜;事務處理面臨各種兼容問題;hql語言增加學習成本等。并提出了一些減化和退化方案,具體請看下面的原文,你的建議又如何?

  想了很長時間hibernate的一些弱點

  1.對象與數據庫的映射,關鍵在于對象關系的映射,但是沒做到很理想,配置過多,控制復雜,另外還會出錯。其實本質在于對象不夠自由。

  2.事務處理。這點上更容易出問題,相對于各種各樣的事務管理器,要兼容是一個大問題,總歸在各種應用服務器上有很多問題。其本質在于創建了一個自我數據存取小環境,必然面臨各種兼容問題。

  3.hql語言。建立對象查詢語言,類sql,但是不同于任何一種sql,調試環境復雜。本質在于創建了一種語言,增加學習成本。

  減化hibernate,將其退化成一個sql生成器,既可以保留原有的主要功能,又可以兼容各種應用服務器和數據庫服務器,另外還不需要學習hql語言。

  只需要一系列的功能函數,作一下包裝,再根據不同數據庫生成不同的sql即可,連數據庫類型都不用指定,因為從connection中可以獲得數據庫類型屬性。

  假想中的api:

  public object resultmapobject(resultset rs,string xml) //一行映射單個對象,可以用xml綁定,也可以不用。

  public list sqlmapobjects(connection conn,string []sqls,string xml)  //將一堆sql映射成一個對象樹,可以用xml來描述綁定,也可以不用,僅使用ror方式的約定。

  借助jdbc和sql可以構建整個數據存取層。

  映射單個對象的代碼,將一行記錄映射成單個對象。sql可以是任意的。

    connection conn=drivermanager.getconnection(url);
    preparedstatement ps = conn.preparestatement(sql);
    
    resultset rs = ps.executequery();
    while(rs.next())
    {
      user=(users)resultmapobject(rs);
      //todo 可以使用user
    }

  映射對象樹。

    /*
    sale_orders銷售訂單表
    sale_order_details銷售訂單細表
    products商品表
    product_catalogs商品類別表
    從sql中就可以分析出
    id是主鍵
    sale_order_details.sale_order_id===>sale_orders.id
    sale_order_details.product_catalog_id==>product_catalogs.id
    sale_order_details.product_id==>products.id
     */
    string []sqls=new string []{
        " select id, total_sum, memo, state, modify_date, creator, checker from sale_orders ",
        " select id, sale_order_id, product_id, product_name, product_catalog_id, model, product_unit, product_amount, product_price, product_sum, memo from sale_order_details ",
        " select id, name, catalog, model, price, unit, memo, createtime, state, code, productno from products ",
        " select id, name, memo from product_catalogs"
    };
    //不帶xml映射的,但是無法得知一對一還是一對多還是多對多的關系,所以一律建成多對多關系。
    list l=sqlmapobjects(conn,sqls);
    /*
    l的結構:
    sale_orders[]
        |-----sale_order_details[](sale_order_details.sale_order_id===>sale_orders.id)
                |-----products[](sale_order_details.product_id==>products.id)
                |-----product_catalogs[](sale_order_details.product_catalog_id==>product_catalogs.id)                
     */
  /*帶xml */

    /*
    sale_orders銷售訂單表
    sale_order_details銷售訂單細表
    products商品表
    product_catalogs商品類別表
    從sql中就可以分析出
    id是主鍵
    sale_order_details.sale_order_id===>sale_orders.id
    sale_order_details.product_catalog_id==>product_catalogs.id
    sale_order_details.product_id==>products.id
     */
    string []sqls=new string []{
        " select id, total_sum, memo, state, modify_date, creator, checker from sale_orders ",
        " select id, sale_order_id, product_id, product_name, product_catalog_id, model, product_unit, product_amount, product_price, product_sum, memo from sale_order_details ",
        " select id, name, catalog, model, price, unit, memo, createtime, state, code, productno from products ",
        " select id, name, memo from product_catalogs"
    };

    /*



    
        
        
            id
            id
        

        
        可選...
    
    
        
        
            product_id
            id
        
        可選...
    
    
        
            product_catalog_id
            id
        
        可選...
    
    
        可選...
    

     */

    string xml="...";
    //帶xml映射
    list l=sqlmapobjects(conn,sqls,xml);
    /*
    l的結構:
    sale_orders[]
        |-----sale_order_details[](sale_order_details.sale_order_id===>sale_orders.id)
                |-----products[](sale_order_details.product_id==>products.id)
                |-----product_catalogs[](sale_order_details.product_catalog_id==>product_catalogs.id)                
     */

  當然類要事先寫好,這里就不詳細寫了。

  保存問題更嚴重,取出來用sql映射已經可以很好地解決了,基本上一個函數、一群sql,加上少少的xml就可以表達清楚了,但是這不能解決保存對象的問題。

  假想中的保存api.

  public void saveobject(connection conn, object obj,string xml);  //保存單個對象,簡單地將對象擴展成sql,允許xml映射,也可以不映射

  public void saveobjects(connection conn, list objs, string xml);  //將對象樹保存到數據庫

  上一篇取出的list或人工組合的list可以用saveobjects來保存,這個函數的任務就比較重了,因為沒有狀態,所以要判斷修改過非常麻煩。

  一種思路是在對象是增加屬性,然后由開發者維護,比如界面上是否修改很有可能是有狀態位的,這個狀態位就可以用起來,然后函數根據這個狀態位來判斷是否去更新。

  一種思路是從class本身中就得知對象是否被改過,類似aop,在修改的時候記錄一下,然后函數來判斷是否改過,然后組成sql來更新。

  至于批量修改是強項,直接用sql即可,學習sql比hql的成本要低,畢竟這么多年了。

  外圍實用函數的思考:基本上都針對sql的生成,或數據庫函數的替換

  public string generateinsertsql(dbtype type,object obj);//生成insert語句

  public string generateupdatesql(dbtype type,object obj);//生成update語句

  public string generateselectsql(dbtype type,object obj);//生成select語句

  總之這個函數工具箱的思路有這幾條:

  1.使用函數,而不是使用環境來代替jdbc或應用服務器。

  2.使用成熟的sql,而不是自創語言,最多增加sql預處理器,將一些函數轉成數據庫相關,簡單的文本功能。

  3.保持對各種環境的兼容性。對象是干凈的,當然如果用aop就很難說對象干不干凈了,不過基本上應該適用于所有的環境中。

  缺點:由于沒有了環境,保存對象有點麻煩,用sql來解決批量更新和刪除,必要時增加幾個sql語句生成器即可。保存對象樹是一個大缺點,沒有非常好的辦法能夠將對象樹整個保存下來而且效率非常高,只有上面提到的兩種不太完美的辦法,這都是因為jvm沒有提供對象狀態的原因。

  不過這樣用函數的方法來解決多繼承的問題還是比較干凈舒服的,既可以動態,又可以靜態,隨心所欲,靈活性、效率和兼容性兼得。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 武平县| 九龙坡区| 温宿县| 嘉义县| 广灵县| 乐亭县| 昌平区| 普兰店市| 黄陵县| 聂拉木县| 威信县| 彰化市| 那曲县| 邯郸市| 平果县| 疏附县| 三明市| 祁连县| 衢州市| 松原市| 霍林郭勒市| 镇安县| 云南省| 柘城县| 乾安县| 株洲县| 灵宝市| 北宁市| 巫溪县| 逊克县| 伊宁县| 买车| 托克托县| 老河口市| 龙陵县| 偃师市| 抚顺市| 雷山县| 惠安县| 永新县| 土默特右旗|