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

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

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

    隨筆 - 115  文章 - 481  trackbacks - 0
    <2006年4月>
    2627282930311
    2345678
    9101112131415
    16171819202122
    23242526272829
    30123456

    常用鏈接

    留言簿(19)

    隨筆檔案(115)

    文章檔案(4)

    新聞檔案(1)

    成員連接

    搜索

    •  

    最新評論

    閱讀排行榜

    評論排行榜

    作者:蔡世友  來源:www.easyjf.com

    一、什么是對象-關系映射(ORM)?  

      對象-關系映射(Object/Relation Mapping,簡稱ORM),是隨著面向對象的軟件開發(fā)方法發(fā)展而產(chǎn)生的。面向對象的開發(fā)方法是當今企業(yè)級應用開發(fā)環(huán)境中的主流開發(fā)方法,關系數(shù)據(jù)庫是企業(yè)級應用環(huán)境中永久存放數(shù)據(jù)的主流數(shù)據(jù)存儲系統(tǒng)。對象和關系數(shù)據(jù)是業(yè)務實體的兩種表現(xiàn)形式,業(yè)務實體在內存中表現(xiàn)為對象,在數(shù)據(jù)庫中表現(xiàn)為關系數(shù)據(jù)。內存中的對象之間存在關聯(lián)和繼承關系,而在數(shù)據(jù)庫中,關系數(shù)據(jù)無法直接表達多對多關聯(lián)和繼承關系。因此,對象-關系映射(ORM)系統(tǒng)一般以中間件的形式存在,主要實現(xiàn)程序對象到關系數(shù)據(jù)庫數(shù)據(jù)的映射。
        
    二、為什么要引入對象-關系映射中間件?
       在開發(fā)關系數(shù)據(jù)庫的系統(tǒng)時,可以通過SQL語句讀取及操作關系數(shù)據(jù)庫數(shù)據(jù)。在Java領域,可以直接通過JDBC編程來訪問數(shù)據(jù)庫。JDBC可以說是JAVA訪問關系數(shù)據(jù)庫的最原始、最直接的方法。這種方式的優(yōu)點是運行效率高,缺點是在Java程序代碼中嵌入大量SQL語句,冗余是不可避免的,開發(fā)人員常常發(fā)現(xiàn)自己在一次又一次地編寫相同的普通代碼,如獲得連接、準備語句、循環(huán)結果集以及其他一些 JDBC 特定元素,使得項目難以維護。特別是當涉及到非常多的關系數(shù)據(jù)表、需要在多個不同類型的關系數(shù)據(jù)庫系統(tǒng)中使用時,通過在程序中使用JDBC開發(fā)實施起來更加困難。
       在開發(fā)基于數(shù)據(jù)應用為主的軟件系統(tǒng)時,引入對象-關系映射中間件是提高開發(fā)效率、提升軟件產(chǎn)品的可維護、擴展性的現(xiàn)實需要。實踐表明,在基于數(shù)據(jù)處理為主的企業(yè)級應程序開發(fā)中,通過引入對象-關系映射中間件,可以節(jié)省與對象持久化有關的差不多35%的編程工作量,同時提升軟件產(chǎn)品可維護及易擴展性,提升軟件產(chǎn)品質量。
       因此,在開發(fā)企業(yè)級應用時,有必要通過引入對象-關系映射系統(tǒng)中間件,實現(xiàn)數(shù)據(jù)庫的快速開發(fā)。企業(yè)可以通過JDBC編程來開發(fā)單獨的持久化層,把數(shù)據(jù)庫訪問操作封裝起來,提供簡潔的API,供業(yè)務層統(tǒng)一調用,實現(xiàn)自己的ORM系統(tǒng)中間件。
       當然,一個成熟的對象-關系映射中間件產(chǎn)品,不只是簡單的把內存中的對象持久化到數(shù)據(jù)庫、把數(shù)據(jù)庫中的關系數(shù)據(jù)加載到內存中,還要保證系統(tǒng)頻繁地訪問數(shù)據(jù)庫的性能,降低訪問數(shù)據(jù)庫的頻率,需要引入多線程、緩存、事務管理等很多細節(jié),涉及到的技術比較復雜,因此,我們更多是使用市場上優(yōu)秀的ORM系統(tǒng)中間件產(chǎn)品。
      
    三、當前JAVA主流的對象-關系映射中間件產(chǎn)品?
       對象關系映射程序(Object Relational Mappers,ORM)有多種形式。在 Java領域,大多數(shù)流行的 ORM 都可以實現(xiàn)完整的域模型映射,它的目標是將整層的對象和行為映射到數(shù)據(jù)庫表。當前主流的 ORM 中間件產(chǎn)品主要有:
       Hibernate(重點推薦)
       JDO
    iBatis
       EJB Entities 3
       EJB Entity Beans 2.x
       TopLink
       在眾多的ORM中間件產(chǎn)品中,Hibernate是筆者重點推薦的。Hibernate是一個基于Java的開放源代碼的持久化中間件,它對JDBC做了輕量級封裝,不僅提供ORM映射服務,還提供數(shù)據(jù)查詢和數(shù)據(jù)緩存功能,Java開發(fā)人員可以方便地通過Hibernate API來操縱數(shù)據(jù)庫。現(xiàn)在,越來越多的Java開發(fā)人員把Hibernate作為企業(yè)應用和關系數(shù)據(jù)庫之間的中間件。

    四、使用EasyDBO實現(xiàn)簡單的對象-關系映射
       EasyDBO是由簡易java框架網(wǎng)(www.easyjf.com)開發(fā)的一個適合中小型軟件數(shù)據(jù)庫開發(fā)的java數(shù)據(jù)持久層框架,系統(tǒng)參考hibernate、JDO等,結合中小項目軟件的開發(fā)實際,實現(xiàn)簡單的Java對象到關系數(shù)據(jù)的映射。EasyDBO由于比較簡單,比較適合于中小企業(yè)及個人開發(fā)使用,EasyDBO當前還處于測試階段、是一個簡易但不太成熟的對象-關系映射開源中間件。
      EasyDBO的源代碼非常簡單,有一點Java知識的人基本上都能讀懂,因此,選擇EasyDBO作本文的示例主要目的在于讓讀者快速進入ORM系統(tǒng)的世界,理解對象-關系數(shù)據(jù)庫實質及實現(xiàn)原理。
       EasyDBO考慮的是最簡單的對象-關系映射,簡單到可以不使用任何配置文件就實現(xiàn)對象-關系的映射。EasyDBO源碼主要包括com.easyjf.dbo、com.easyjf.dbo.config、com.easyjf.dbo.sql三個包。其中com.easyjf.dbo是框架的核心、實現(xiàn)了對象-關系的轉換、JDBC API的封裝以及用戶接口支持等,com.easyjf.dbo.config實現(xiàn)配置文件的管理,com.easyjf.dbo.sql實現(xiàn)數(shù)據(jù)庫的簡單Sql語句的生成及多數(shù)據(jù)庫支持的擴展。
       在當前推出的測試版本中,程序員使用EasyDBO操作數(shù)據(jù)庫主要關注EasyJDO類提供的方法及原數(shù)據(jù)對象DBObject類、IObject接口即可。

    五、使用EasyDBO的開發(fā)數(shù)據(jù)庫應用程序示例
       下面我們看看使用EasyDBO是怎么樣實現(xiàn)數(shù)據(jù)庫的開發(fā)。
       假設一個留言版系統(tǒng)存放留言信息關系數(shù)據(jù)表(message)的結構為:
       cid: varchar 16 主鍵
       title: varchar 50
       content: text
       inputUser: varchar 16
       inputTime: datetime
       status: int
      
    相應java中的類Message定義為
       import java.util.Date;
       import java.util.List;
       import com.easyjf.dbo.EasyJDB;
       import com.easyjf.dbo.IObject;
       //實現(xiàn)com.easyjf.dbo.IObject接口從而使得你的對象無需要配置文件即可與關系數(shù)據(jù)表映射
       public class Message implements IObject {
       private String cid;
       private String title;
       private String content;
       private String inputUser;
       private Date inputTime;
       private Integer status;
       public String getTableName() {
       return "message";
       }
       public String getKeyField() {

       return "cid";
       }
       public String getKeyGenerator() {
       return "com.easyjf.dbo.IdGenerator";
       }
       public String getCid() {
       return cid;
       }
       public void setCid(String cid) {
       this.cid = cid;
       }
       public String getContent() {
       return content;
       }
       public void setContent(String content) {
       this.content = content;
       }
       public java.util.Date getInputTime() {
       return inputTime;
       }
       public void setInputTime(java.util.Date inputTime) {
       this.inputTime = inputTime;
       }
       public String getInputUser() {
       return inputUser;
       }
       public void setInputUser(String inputUser) {
       this.inputUser = inputUser;
       }
       public Integer getStatus() {
       return status;
       }
       public void setStatus(Integer status) {
       this.status = status;
       }
       public String getTitle() {
       return title;
       }
       public void setTitle(String title) {
       this.title = title;
       }

       //把對象持久化(保存)到關系數(shù)據(jù)庫中
       public boolean save()
       {
       EasyJDB db=new EasyJDB();
       return db.saveOrUpdate(this);
       }
       //從持久化存儲設備數(shù)據(jù)庫系統(tǒng)中永久刪除對象
       public boolean del()
       {
       EasyJDB db=EasyJDB.getInstance();
       return db.del(this);
       }
       //通過主鍵id從數(shù)據(jù)庫系統(tǒng)中讀取數(shù)據(jù),返回一個對象
       public static Message read(String cid)
       {
       EasyJDB db=EasyJDB.getInstance();
       return (Message)db.get(Message.class,cid);
       }
       //通過sql從數(shù)據(jù)庫中查詢符合條件的數(shù)據(jù),返回對象列表
       public static List query(String sql)
       {
       EasyJDB db=EasyJDB.getInstance();
       return db.query(Message.class,sql);
       }
       //應用演示代碼
       public static void main(String[] args) {
       Message m=new Message();
       m.setTitle("標題");
       m.setContent("內容");
       m.setInputTime(new Date());
       m.setInputUser("test");
       m.setStatus(new Integer(1));
       if(m.save())
       {
       System.out.print("成功把對象保存到關系數(shù)據(jù)庫中");
       }
       else
       {
       System.out.println("保存數(shù)據(jù)出錯!");
       }
       //查詢數(shù)據(jù)
       List list=Message.query("1=1");
       if(list!=null){
       for(int i=0;i<list.size();i++)
       {
       Message message=(Message)list.get(i);
       System.out.println("--------");
       System.out.println("cid:"+message.getCid());
       System.out.println("title:"+message.getTitle());
       System.out.println("inputUser:"+message.getInputUser());
       System.out.println("inputTime:"+message.getInputTime());
       System.out.println("status:"+message.getStatus());
       }
       }
       }
       }

       如上面的代碼所示,程序只需要通過EasyJDB的getInstance()方法得到一個實例,然后就可以通過EasyJDB對象的save、update、del、get、query等類似的方法進行數(shù)據(jù)庫的操作了。而程序員不用管具體的數(shù)據(jù)庫系統(tǒng)類型、不用管數(shù)據(jù)庫連接的獲取、數(shù)據(jù)庫資源的釋放、不用構造煩瑣無味的Sql添、刪、改、查語句。
       關于數(shù)據(jù)源及配置文件:用戶可以通過EasyDBO的配置文件easyjf-dbo.xml文件配置數(shù)據(jù)庫連接數(shù)據(jù)源,也可以程序中設置數(shù)據(jù)源,還可通過IOC容器設置數(shù)據(jù)源。下面我們看看EasyDBO的數(shù)據(jù)源配置文件easyjf-dbo.xml的內容。
       <easyjf-dbo>
       <datasource id="bbs" type="org.apache.commons.dbcp.BasicDataSource">
       <property name="easydbo.connection.driver_class">org.gjt.mm.mysql.Driver</property>
       <property name="easydbo.connection.password">yourpassword</property>
       <property name="easydbo.connection.url">jdbc:mysql://127.0.0.1:3306/easyjf</property>
       <property name="easydbo.connection.username">root</property>
       <property name="easydbo.dialect">com.easyjf.dbo.sql.MySqlQuery</property>
       <property name="easydbo.optimize">true</property>
       <property name="esyydbo.show_sql">true</property>
       </datasource>
       <tables>
       <class>
       </class>
       </tables>
       </easyjf-dbo>

      假如用戶使用的是MS Sql Server數(shù)據(jù)為,把上面的的配置文件修改成如下的內容即可:
       <easyjf-dbo>
       <datasource id="bbs" type="org.apache.commons.dbcp.BasicDataSource">
       <property name="easydbo.connection.driver_class">com.microsoft.jdbc.sqlserver.SQLServerDriver</property>
       <property name="easydbo.connection.password">sa</property>
       <property name="easydbo.connection.url">jdbc:microsoft:sqlserver://localhost:1433;DatabaseName=easyjf;SelectMethod=cursor</property>
       <property name="easydbo.connection.username">yourpassword</property>
       <property name="easydbo.dialect">com.easyjf.dbo.sql.MSSqlServerQuery</property>
       </datasource>
       <tables>
       <class>
       </class>
       </tables>
       </easyjf-dbo>

    六、選擇適合你的對象-關系映射中間件
       不是功能最全,用得最多的中間件就一定適合您,當前流行的各種ORM中間件產(chǎn)品中,hibernate無疑是最為出色的產(chǎn)品,從系統(tǒng)的構架、性能及功能上都非常好。在大型分布市群集服務器運用領域,EJB Entity Beans是首選,因為其有廣泛的市場及運用基礎。當然,在小型的數(shù)據(jù)庫應用軟件領域,如一個新聞網(wǎng)站、一個簡單的網(wǎng)上商店、論壇系統(tǒng)等,筆者也推薦大家不防試試EasyDBO。作為初學者,筆者推薦大家使用EasyDBO,閱讀EasyDBO的源代碼,可以讓你快速掌握及了解ORM中間件的實質及工作原理,從而為學習及使用功能更加強大對象-關系映射中間件產(chǎn)品打下基礎。
       更多完整的有關EasyDBO應用實例代碼,請通過官方網(wǎng)站www.easyjf.com下載。

    (轉載請保留作者及來源信息)

    posted on 2006-04-17 21:23 簡易java框架 閱讀(1040) 評論(1)  編輯  收藏

    FeedBack:
    # re: 使用對象-關系映射(ORM)系統(tǒng)中間件提升軟件開發(fā)效率及質量  2006-05-19 01:47 Jerry Tian
    起初是做過一個PHP粗糙的項目,手工遷移到JAVA平臺后確實發(fā)現(xiàn)RMDBS系統(tǒng)和JAVA的OO的失配問題。最初在指導下接觸了Hibernate并且一些項目中加以應用,確實給我耳目一新的感覺。

    現(xiàn)在接觸Spring的JDBC的Template后,中途還看過iBatis的框架和簡單的應用(其實都是Spring的插接ORM的例程),更加理解了ORM技術在OO應用中對于代碼復用和結構分層的巨大價值。PHP中連接的獲取和釋放是相當自動話的,但是前提就是你的查詢非常快;JAVA中如果完全自己管理JDBC連接,也確實相當?shù)耐纯啵艺娴倪@么做了也就意味著同良好的OO和代碼復用的告別。對于快速的原型項目,而且不想考慮太多的數(shù)據(jù)庫細節(jié)或者需要頻繁的遷移數(shù)據(jù)庫平臺,成熟的高層ORM產(chǎn)品像Hibernate絕對是不二選擇;但是當項目的數(shù)據(jù)量增大,數(shù)據(jù)庫平臺趨于穩(wěn)定于一種產(chǎn)品,此時良好的SQL技巧加上JDBC模板技術就應該是項目的選擇了。此時iBatis或者Spring的JDBC封裝都是非常不錯的選擇,而我更偏向于Spring的JDBC封裝,實現(xiàn)的相當優(yōu)雅。  回復  更多評論
      

    只有注冊用戶登錄后才能發(fā)表評論。


    網(wǎng)站導航:
     
    主站蜘蛛池模板: 国产在线国偷精品免费看| 国产国产人免费人成成免视频| 亚洲精品成人网久久久久久| 亚洲卡一卡二卡乱码新区| 美女视频黄的全免费视频网站| 1000部国产成人免费视频| 亚洲酒色1314狠狠做| 18pao国产成视频永久免费| 亚洲电影在线免费观看| 香蕉成人免费看片视频app下载| 国产免费不卡视频| 亚洲中文无码亚洲人成影院| 三年片在线观看免费大全| 亚洲成年人免费网站| 免费无码A片一区二三区| 亚洲男人的天堂网站| 日韩精品成人亚洲专区| 一级毛片免费毛片毛片| 久久香蕉国产线看观看亚洲片| 亚洲成在人线在线播放无码| 国产免费变态视频网址网站| 人碰人碰人成人免费视频| 在线亚洲人成电影网站色www| 亚洲免费福利在线视频| 免费萌白酱国产一区二区| 曰批全过程免费视频免费看 | 国产成人亚洲影院在线观看| 乱淫片免费影院观看| 久久国产精品亚洲综合| 又粗又大又黑又长的免费视频| 国产亚洲av片在线观看播放| 最近2019免费中文字幕视频三| 亚洲精品综合久久| 一个人免费日韩不卡视频| 色在线亚洲视频www| 亚洲成a人片在线播放| 免费人妻无码不卡中文字幕系| 亚洲国产精品嫩草影院在线观看 | 少妇太爽了在线观看免费视频| 亚洲精品天堂成人片?V在线播放| 国产亚洲玖玖玖在线观看|