Tang Anping

          Love Java

          KodoJDO基礎(chǔ)篇

          花了幾天時間來搞Kodo JDO,網(wǎng)上資料不是很全,抽時間整理了一下。
          可以到網(wǎng)上下載工具,下載后會發(fā)一個LicenseKey到你的郵箱(www.solarmetric.com)。
          下載后就可以開始了:

          先新建一個類:
          有人說持久類必須有一個私有的構(gòu)造函數(shù),我試了一下,不然;都可以。
          Student.java

          package ?com;

          import ?java.io.Serializable;

          public ? class ?Student? implements ?Serializable? {
          ????
          private ?String?name;
          ????
          private ? int ?age;
          ????
          private ?Student()? {
          ????????
          ????}

          ????
          public ?Student(String?name,? int ?age)? {
          ????????
          this .name? = ?name;
          ????????
          this .age? = ?age;
          ????}

          ????
          /**
          ?????*?
          @return ?the?age
          ?????
          */

          ????
          public ? int ?getAge()? {
          ????????
          return ?age;
          ????}

          ????
          /**
          ?????*?
          @param ?age?the?age?to?set
          ?????
          */

          ????
          public ? void ?setAge( int ?age)? {
          ????????
          this .age? = ?age;
          ????}

          ????
          /**
          ?????*?
          @return ?the?name
          ?????
          */

          ????
          public ?String?getName()? {
          ????????
          return ?name;
          ????}

          ????
          /**
          ?????*?
          @param ?name?the?name?to?set
          ?????
          */

          ????
          public ? void ?setName(String?name)? {
          ????????
          this .name? = ?name;
          ????}

          ????
          }

          然后通過工具Kodo Mapping Workbench產(chǎn)生package.jdo和package.mapping文件。
          為了避免每次都實現(xiàn)javax.jdo.spi.PersistenceCapable類,Kodo提供了Enhance(增強)類的class文件的工具,
          類增強之后class文件會變大。工具的具體操作自己看一下文檔吧,不具體說了。

          也可以用bin目錄下的bat文件進行編譯,麻煩一點。
          package.jdo

          <? xml?version = " 1.0 " ?encoding = " UTF-8 " ?>

          < jdo >
          ????
          < package ?name = " com " >
          ????????
          < class ?name = " Student " />
          ????
          </ package >
          </ jdo >

          package.mapping

          <? xml?version = " 1.0 " ?encoding = " UTF-8 " ?>

          < mapping >
          ????
          < package ?name = " com " >
          ????????
          < class ?name = " Student " >
          ????????????
          < jdbc - class - map?type = " base " ?pk - column = " JDOID " ?table = " STUDENT " />
          ????????????
          < field?name = " age " >
          ????????????????
          < jdbc - field - map?type = " value " ?column = " AGE " />
          ????????????
          </ field >
          ????????????
          < field?name = " name " >
          ????????????????
          < jdbc - field - map?type = " value " ?column = " NAME " />
          ????????????
          </ field >
          ????????
          </ class >
          ????
          </ package >
          </ mapping >

          和類文件在同一個目錄。在src目錄下還有一個配置文件,jar文件就不啰嗦了:
          kodo.properties

          kodo.LicenseKey:?2C61 - EF63 - F131 - 32B2 - 3200
          kodo.FetchGroups:?
          kodo.WriteLockLevel:?write
          kodo.RestoreMutableValues:?
          false
          kodo.CopyObjectIds:?
          false
          kodo.PersistentClasses:?com.Student
          kodo.RetryClassRegistration:?
          false
          javax.jdo.PersistenceManagerFactoryClass:?kodo.jdbc.runtime.JDBCPersistenceManagerFactory
          javax.jdo.option.NontransactionalWrite:?
          false
          javax.jdo.option.Multithreaded:?
          false
          javax.jdo.option.ConnectionUserName:?root
          javax.jdo.option.ConnectionPassword:?admin
          javax.jdo.option.ConnectionURL:?jdbc\:mysql\:
          // localhost:3306/bikestore
          javax.jdo.option.ConnectionDriverName:?com.mysql.jdbc.Driver
          kodo.jdbc.Schemas:?
          kodo.jdbc.ForeignKeyConstraints:?
          false

          還要注意一下版本,我使用的是kodo-jdo-3.4.1的,因為增強類的編譯會不一致。
          映射這一塊搞定了。
          下面開始寫一個測試類:
          活學(xué)活用,上篇以介紹,引入log4j.properties。
          StudentTest.java

          package ?com.test;

          import ?java.io.FileInputStream;
          import ?java.io.FileNotFoundException;
          import ?java.io.IOException;
          import ?java.io.InputStream;
          import ?java.util.List;
          import ?java.util.Properties;

          import ?javax.jdo.JDOHelper;
          import ?javax.jdo.PersistenceManager;
          import ?javax.jdo.PersistenceManagerFactory;
          import ?javax.jdo.Query;
          import ?javax.jdo.Transaction;

          import ?org.apache.log4j.Logger;

          import ?com.Student;

          import ?junit.framework.TestCase;

          public ? class ?StudentTest? extends ?TestCase? {
          private ? static ? final ?Logger?log? = ?Logger.getLogger(StudentTest. class );
          ????
          ????
          private ?PersistenceManagerFactory?factory;
          ????
          private ?PersistenceManager?manager;
          ????
          ????
          /**
          ?????*?初始化持久化工廠類
          ?????
          */

          ????
          public ? void ?setUp()? {
          ????????
          try ? {
          ????????????InputStream?in?
          = ? new ?FileInputStream( " src/kodo.properties " );
          ????????????
          // ????????????factory?=?JDOHelper.getPersistenceManagerFactory(in);
          ????????????
          // ?或者
          ????????????Properties?props? = ? new ?Properties();
          ????????????props.load(in);
          ????????????in.close();
          ????????????factory?
          = ?JDOHelper.getPersistenceManagerFactory(props);
          ????????????
          ????????????manager?
          = ?factory.getPersistenceManager();
          ????????????log.info(factory?
          + ? " ???? " ? + ?manager);
          ????????}
          ? catch ?(FileNotFoundException?e)? {
          ????????????e.printStackTrace();
          ????????}
          ? catch ?(IOException?e)? {
          ????????????e.printStackTrace();
          ????????}

          ????}

          ????
          /**
          ?????*?釋放資源
          ?????
          */

          ????
          public ? void ?tearDown()? {
          ????????manager?
          = ? null ;
          ????????factory?
          = ? null ;
          ????????
          ????}


          ????
          public ? void ?testSaveUser()? {
          ????????Student?student?
          = ? new ?Student( " tang " ,? 23 );
          ????????
          try ? {
          ????????????Transaction?tran?
          = ?manager.currentTransaction();
          ????????????tran.begin();
          ????????????manager.makePersistent(student);
          ????????????tran.commit();
          ????????????log.info(
          " 保存成功 " );
          ????????}
          ? catch ?(Exception?e)? {
          ????????????e.printStackTrace();
          ????????????log.error(
          " 保存異常 " ,?e);
          ????????}

          ????}

          ????
          public ? void ?testGetStudent()? {
          ????????
          try ? {
          ????????????
          // ?主鍵ID不能作為條件,否則會報異常
          ????????????Query?query? = ?(Query)manager.newQuery(Student. class ,? " name?==?'ddd' " );
          ????????????List?list?
          = ?(List)query.execute();
          ????????????Student?stu?
          = ?(Student)list.get( 0 );
          ????????????log.info(
          "" ? + ?stu.getAge());
          ????????????log.info(
          " 獲取成功 " );
          ????????}
          ? catch ?(Exception?e)? {
          ????????????e.printStackTrace();
          ????????????log.error(
          " 獲取異常 " ,?e);
          ????????}

          ????}

          ????
          public ? void ?testGetStudents()? {
          ????????
          try ? {
          ????????????Query?query?
          = ?(Query)manager.newQuery(Student. class );
          ????????????List?list?
          = ?(List)query.execute();
          ????????????log.info(
          "" ? + ?list.size());
          ????????????log.info(
          " 獲取所有成功 " );
          ????????}
          ? catch ?(Exception?e)? {
          ????????????e.printStackTrace();
          ????????????log.error(
          " 獲取所有異常 " ,?e);
          ????????}

          ????}

          ????
          public ? void ?testDeleteStudents()? {
          ????????
          try ? {
          ????????????
          // ?主鍵ID不能作為條件,否則會報異常,可以批量刪除
          ????????????Query?query? = ?(Query)manager.newQuery(Student. class ,? " name?==?'tang' " );
          ????????????List?list?
          = ?(List)query.execute();
          ????????????log.info(
          "" ? + ?list.size());
          ????????????Transaction?tran?
          = ?manager.currentTransaction();
          ????????????tran.begin();
          ????????????manager.deletePersistentAll(list);
          ????????????tran.commit();
          ????????????log.info(
          " 刪除一批成功 " );
          ????????}
          ? catch ?(Exception?e)? {
          ????????????e.printStackTrace();
          ????????????log.error(
          " 刪除一批異常 " ,?e);
          ????????}

          ????}


          ????
          public ? void ?testUpdateStudent()? {
          ????????
          try ? {
          ????????????Transaction?tran?
          = ?manager.currentTransaction();
          ????????????tran.begin();
          ????????????Query?query?
          = ?(Query)manager.newQuery(Student. class );
          ????????????List?list?
          = ?(List)query.execute();
          ????????????Student?Student?
          = ?(Student)list.get( 0 );
          ????????????Student.setName(
          " ddddddd " );
          ????????????Student.setAge(
          26 );
          ????????????
          // ?javax.jdo.option.NontransactionalWrite:?true
          ????????????
          // ?設(shè)置為true,不會報異常,但是不會更新數(shù)據(jù)庫
          ????????????
          // ?事務(wù)從這里開始不行,會報在事務(wù)外的異常
          // ????????????tran.begin();
          ????????????manager.makePersistent(Student);
          ????????????tran.commit();
          ????????????
          ????????????log.info(
          "" ? + ?list.size());
          ????????????log.info(
          " 更新成功 " );
          ????????}
          ? catch ?(Exception?e)? {
          ????????????e.printStackTrace();
          ????????????log.error(
          " 更新異常 " ,?e);
          ????????}

          ????}

          }


          數(shù)據(jù)庫腳本:
          create?database?bikestore

          use?bikestore

          create?table?Student?(jdoid?
          int?primary?key,
          name?varchar(
          20),?age?int);

          測試的是用Mysql5.0。

          完成了,出現(xiàn)了幾個問題,manager.getObjectById("jdoid", false);出錯,還有不能根據(jù)主鍵更新,
          有誰知道,請告訴我,不勝感激!

          posted on 2006-11-24 18:02 Tang Anping 閱讀(405) 評論(0)  編輯  收藏 所屬分類: Kodo JDO


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


          網(wǎng)站導(dǎo)航:
           
          主站蜘蛛池模板: 江达县| 库尔勒市| 定兴县| 偏关县| 凯里市| 特克斯县| 宁河县| SHOW| 徐水县| 同心县| 湘潭市| 樟树市| 柏乡县| 富锦市| 通州区| 郧西县| 伊宁县| 桦南县| 重庆市| 苏尼特右旗| 酒泉市| 五台县| 湘潭市| 昆明市| 高陵县| 日喀则市| 宁国市| 古丈县| 剑阁县| 长宁县| 贵州省| 阳东县| 环江| 旅游| 阳曲县| 兴海县| 德阳市| 化州市| 胶南市| 平塘县| 九江县|