花了幾天時間來搞Kodo JDO,網上資料不是很全,抽時間整理了一下。
可以到網上下載工具,下載后會發一個LicenseKey到你的郵箱(www.solarmetric.com)。
下載后就可以開始了:
先新建一個類:
有人說持久類必須有一個私有的構造函數,我試了一下,不然;都可以。
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產生package.jdo和package.mapping文件。
為了避免每次都實現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的,因為增強類的編譯會不一致。
映射這一塊搞定了。
下面開始寫一個測試類:
活學活用,上篇以介紹,引入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
????????????
//
?設置為true,不會報異常,但是不會更新數據庫
????????????
//
?事務從這里開始不行,會報在事務外的異常
//
????????????tran.begin();
????????????manager.makePersistent(Student);
????????????tran.commit();
????????????
????????????log.info(
""
?
+
?list.size());
????????????log.info(
"
更新成功
"
);

????????}
?
catch
?(Exception?e)?
{
????????????e.printStackTrace();
????????????log.error(
"
更新異常
"
,?e);
????????}
????}
}
數據庫腳本:
create?database?bikestore

use?bikestore

create?table?Student?(jdoid?int?primary?key,
name?varchar(20),?age?int);測試的是用Mysql5.0。
完成了,出現了幾個問題,manager.getObjectById("jdoid", false);出錯,還有不能根據主鍵更新,
有誰知道,請告訴我,不勝感激!