JAVA—咖啡館

          ——歡迎訪問rogerfan的博客,常來《JAVA——咖啡館》坐坐,喝杯濃香的咖啡,彼此探討一下JAVA技術(shù),交流工作經(jīng)驗,分享JAVA帶來的快樂!本網(wǎng)站部分轉(zhuǎn)載文章,如果有版權(quán)問題請與我聯(lián)系。

          BlogJava 首頁 新隨筆 聯(lián)系 聚合 管理
            447 Posts :: 145 Stories :: 368 Comments :: 0 Trackbacks
          1.        Torque
          Torque是一個持久框架,也是jakarta的一個子目,原來包括在Turbine框架中,從Turbine2.2Torque被分離出來作一個獨的子目。目前最高版本是3.3
          2.        持久以及持久框架的理解
          持久就是在整個系統(tǒng)中與持久存儲質(zhì)Database,LDAP Server,XML等打交道的部分。持久框架的作用就是使持久層訪問持久介質(zhì)更加方便。如果是訪問Database而建立的持久框架那就又有一個O/R Mapping的概念。O/R Mapping就是建立(Object)關(guān)系數(shù)據(jù)(R)中的表(不一定是一)的映射。Torque就是這樣起到O/R Mapping作用的持久框架。他使java程序可以方便地通操作普通java象的方式來訪問數(shù)據(jù),甚至不用了解數(shù)據(jù)的相關(guān)(最好是了解),另一個好是屏蔽數(shù)據(jù)庫類型即可任意更持久框架支持的Database
          3.        Torque的工作原理
             一般在利用O/R Mapping框架開發(fā)候,有三個基本的元即關(guān)系數(shù)據(jù)中的表(Table)Java中的持久(PO),POTable映射的xml文件(Schema)
             首先,Torque包含一個generator用來根據(jù)由開發(fā)者配置好的Schema來自生成POTable就意味著開發(fā)者只要定SchemaPOTable就可以自生成了。
             在生成好的POTable以后,開發(fā)者就可以利用POTable訪問了。了達到個目的Torque提供了一個運行時環(huán)境來保的正確運行。在工程中引入了torque關(guān).jar就可以個運行環(huán)境了。
          4.        Torque中的包,和接口
          Torque的源提供的是運行環(huán)境,基于Torque開發(fā)關(guān)心的是生成的PO的使用方法即怎使用生成的PO來操作Table。下面會通Torque導(dǎo)學(xué)上的例子來詳細說明。
          5.        導(dǎo)學(xué)中的例子
          5.1利用generator生成POTable
          首先,要通generator來生成POTable要定Schemagenerator的配置。
           Schema的定如下:
          <?xml version="1.0" encoding="ISO-8859-1" standalone="no"?>
          <!DOCTYPE database SYSTEM
           "http://db.apache.org/torque/dtd/database_3_1.dtd">
          <database
           name="torque"
           defaultIdMethod="idbroker">
           <table name="book" description="Book Table">
              <column
                name="book_id"
                required="true"
                primaryKey="true"
                type="INTEGER"
                description="Book Id"/>
              <column
                name="title"
                required="true"
                type="VARCHAR"
                size="255"
                description="Book Title"/>
              <column
                name="isbn"
                required="true"
                type="VARCHAR"
                size="24"
                javaName="ISBN"
                description="ISBN Number"/>
              <column
                name="publisher_id"
                required="true"
                type="INTEGER"
                description="Foreign Key Publisher"/>
              <column
                name="author_id"
                required="true"
                type="INTEGER"
                description="Foreign Key Author"/>
              <foreign-key foreignTable="publisher" onDelete="cascade">
                <reference
                  local="publisher_id"
                  foreign="publisher_id"/>
              </foreign-key>
              <foreign-key foreignTable="author" onDelete="cascade">
                <reference
                  local="author_id"
                  foreign="author_id"/>
              </foreign-key>
           </table>
           <table name="publisher" description="Publisher Table">
              <column
                name="publisher_id"
                required="true"
                primaryKey="true"
                type="INTEGER"
                description="Publisher Id"/>
              <column
                name="name"
                required="true"
                type="VARCHAR"
                size="128"
               description="Publisher Name"/>
           </table>
           <table name="author" description="Author Table">
              <column
                name="author_id"
                required="true"
                primaryKey="true"
                type="INTEGER"
                description="Author Id"/>
              <column
                name="first_name"
                required="true"
                type="VARCHAR"
                size="128"
                description="First Name"/>
              <column
                name="last_name"
                required="true"
                type="VARCHAR"
                size="128"
                description="Last Name"/>
           </table>
          </database>
            schema里定Table結(jié)構(gòu),生成的PO在會按照一定規(guī)則Table對應(yīng)
          然后修改build.properties文件加入如下部分:
          torque.database = mysql
          torque.project = torque
          torque.addGetByNameMethod = true
          torque.addIntakeRetrievable = false
          torque.addSaveMethod = true
          torque.addTimeStamp = true
          torque.basePrefix = Base
          torque.complexObjectModel = true
          torque.useClasspath = false
          torque.useManagers = false
           
          torque.targetPackage=org.together.om
          torque.database.createUrl = jdbc:mysql://127.0.0.1/mysql
          torque.database.buildUrl = jdbc:mysql://127.0.0.1/torque
          torque.database.url = jdbc:mysql://127.0.0.1/torque
          torque.database.driver = org.gjt.mm.mysql.Driver
          torque.database.user = root
          torque.database.password = haohao
          torque.database.host = 127.0.0.1
          torque.sameJavaName = false
          關(guān)鍵標記的部分,表明是接的mysql數(shù)據(jù),并將生成的PO放到org.together.om包中。   最后利用ant執(zhí)generator這樣就可以在數(shù)據(jù)中生成相應(yīng)Table,并生成于Table對應(yīng)PO(放在定好的org.together.om)。拿schema中定Author例,運行generator后可以在mysql數(shù)據(jù)中生成一Author表,DDL如下:
          CREATE TABLE `author` (
           `author_id` int(11) NOT NULL default '0',
           `first_name` varchar(128) NOT NULL default '',
           `last_name` varchar(128) NOT NULL default '',
           PRIMARY KEY (`author_id`)
          ) TYPE=MyISAM
          org.together.om包下會有一個BaseAuthor(由于生成的PO多在下面會詳細)中會有如下的屬性與Table中的字段對應(yīng)
          /** The value for the authorId field */
              private int authorId;     
              /** The value for the firstName field */
              private String firstName;
              /** The value for the lastName field */
              private String lastName;
          5.2    generator生成的PO結(jié)構(gòu)
           在org.together.om下有若干類和一個子包map。map包下的也是運行環(huán)境相關(guān)的不用考慮。在org.together.om下會為schema中定義的每一個表生成四個相關(guān)的類。拿Book來說,有四個類和他對應(yīng),分別為:BaseAuthorPeer, AuthorPeer,BaseAuthor, Author。BaseAuthorPeer和BaseAuthor分別是AuthorPeer和Author的基類,在基類里是由generator生成的代碼,注意不要修改基類的代碼,因為每次利用generator生成時都會覆蓋基類的代碼(AuthorPeer和Author類不會被覆蓋)。
          5.3 PO的使用方法
           BaseAuthorPeer和BaseAuthor這兩個基類是用來提供底層功能的,我們只要操作AuthorPeer和Author類就可以完成對數(shù)據(jù)庫中的表author的操作如增加,刪除,更新和查詢等。
           對author進行增加操作的代碼如下:
           Author na = new Author();
           na.setFirstName("a");
           na.setLastName("b");
           na.save();  // 或用AuthorPeer的靜態(tài)方法替代AuthorPeer.doInsert(na);
           對author進行更新操作的代碼如下:
          na.setLastName("c");
          na.save(); //或用AuthorPeer的靜態(tài)方法替代AuthorPeer.doUpdate(na);
          對author進行刪除操作的代碼如下:
          AuthorPeer.doDelete(na); //進行delete時只能使用AuthorPeer的靜態(tài)方法
          對author進行查詢,查詢出author表中的author_id字段的值在1和10000之間的所有數(shù)據(jù)
          Criteria testCriteria = new Criteria();
          testCriteria.add(AuthorPeer.AUTHOR_ID,1,Criteria.GREATER_THAN);            testCriteria.add(AuthorPeer.AUTHOR_ID,10000,Criteria.LESS_THAN);
          List tList = AuthorPeer.doSelect(testCriteria);
          log.debug("all size:" + tList.size());
          for (int i = 0; i < tList.size(); i++) {
           Author o = (Author) tList.get(i);
           System.out.println("Author" + i + " : " + o.toString());
          }
          以上介紹了PO的基本用法,在實際的應(yīng)用中往往比上述要復(fù)雜的多,但是掌握了基本的方法,其他的用法就可以在實際使用時查看手冊即可。Torque的doc上附帶的Toturial上面有使用generator的詳細說明和怎樣使用Torque進行開發(fā)的例子。
          6.        TorqueACI中的應(yīng)用
          看了一下ACI的源碼,torque自動生成的部分沒有任何改動,即都是直接使用生成的PO。但在TorqueACIStorage.java中關(guān)于Torque的用法要比上述的例子中多了一個事務(wù)處理情況,以下給出使用Torque進行事務(wù)處理的例子。
          //創(chuàng)建JDBC連接用于控制事務(wù)
          java.sql.Connection conn = null;
          try{
             //開始事務(wù)
          conn=Transaction.begin(BaseAuthorPeer.getMapBuilder().getDatabaseMap().getName());
          Author ta = new Author();
          ta.setFirstName("t");
          ta.setLastName("t");
          AuthorPeer.doInsert(ta,conn);
          //String ab = null; //人為制造異常使事務(wù)回滾
          //ab.toLowerCase();
          Publisher tp = new Publisher();
          tp.setName("t");
          PublisherPeer.doInsert(tp,conn);
          //提交事務(wù),會自動釋放連接
          Transaction.commit(conn);
          } catch (Exception ex) {
          //回滾事務(wù)
           Transaction.safeRollback(conn);
           log.error(ex);
          }
          ACI中也有一些復(fù)雜一點的查詢條件(Criteria)的構(gòu)造,在Torquedocs中的criteria-howto.html文件中都應(yīng)該能夠找到。
          posted on 2008-05-22 11:29 rogerfan 閱讀(1052) 評論(0)  編輯  收藏 所屬分類: 【Torque學(xué)習(xí)】
          主站蜘蛛池模板: 永兴县| 施甸县| 葵青区| 吉林省| 辽阳市| 宝鸡市| 登封市| 宣汉县| 托克逊县| 汝州市| 鹤壁市| 沾益县| 秦安县| 克拉玛依市| 高阳县| 达拉特旗| 白城市| 额尔古纳市| 光泽县| 右玉县| 杂多县| 陆丰市| 大安市| 宝鸡市| 高安市| 潼关县| 马山县| 芮城县| 灵川县| 准格尔旗| 罗江县| 东乌珠穆沁旗| 巴林左旗| 象州县| 娱乐| 准格尔旗| 泰安市| 德州市| 凌云县| 马山县| 沾化县|