首先聲明,這個名字如有雷同,純屬巧合。坦率說,這個工具由來已久,早在遠古時代、大概去年就已經有了早期的雛形。形成的原因主要是因為我這個人比較懶,寫了一些jdbc的程序發現我本可以生活的更輕松一些,而對現存的一些方案(BMP/CMP、JDO、Hibernate等)又有這樣或那樣的問題(其中也有一部分原因是我實在懶的去深入的學,而且我用到的也遠沒有那么深)。所以這個sdo工具誕生了!之所以我稱它“簡單”數據庫對象化代碼生成工具,是因為。。。。嗯,它的確太簡單了,也只能適合簡單應用。
交代了一些背景,說點實在的吧,你可以從我的文件夾中下載它的首映式版本(
http://www.aygfsteel.com/Files/kobe2000/sdo_0.6.rar),目前定價0.6,嗯,或許還高了些,讓我們看看它能做什么:
1、首先,你需要寫一個xml形式的配置文件(說不定我以后會寫一個桌面程序或者從數據源中抽取數據的程序簡化這一步,但實際上徒手寫也是很容易的),來描述數據庫中表的結構(索引、視圖、數據字典等等我并沒有做什么處理,老實說,忽略了),如下面的例子
<?xml version="1.0" encoding="GBK"?>
<sdo package="testpkg" version="0.6" pool="dft" closestmt="false">
<table name="" type="ManKind" desc="抽象人類" serialize="1234567">
<pk name="ID" type="int" desc="主鍵"/>
<fd name="NAME" type="String" desc="姓名"/>
<fd name="BIRTHDAY" type="Date" desc="生日"/>
<fd name="GENDER" type="boolean" desc="性別(true:男;false:女)"/>
<find name="findByName" sql="WHERE NAME=?" multi="true" desc="通過名字找人">
<param name="name" type="String" desc="傳入的參數:待查找的名字"/>
</find>
<find name="findFemale" sql="WHERE GENDER=0" multi="true" desc="查找所有女性"/>
<tostring name="NAME"/>
</table>
<table name="STUDENT" type="Student" extends="ManKind" desc="學生" serialize="12344321">
<fd name="SID" type="String" desc="學號"/>
<fk name="MASTER" type="Teacher" desc="班主任"/>
<custom name="getNumOfStudent" sql="SELECT COUNT(*) FROM STUDENT" multi="false" desc="計算學生總數">
<return name="num" type="int" desc="返回值"/>
</custom>
</table>
<table name="Teacher" type="Teacher" extends="ManKind"desc="教師">
<fd name="MARRIED" type="boolean" desc="已婚?"/>
<fd name="IMAGE" type="byte[]" desc="照片"/>
<handwork location="class">public void test() {System.out.println("test");}</handwork>
</table>
</sdo>encoding的設置是為了中文可以正確被解析
<sdo>元素是根元素,package屬性為代碼生成的包路徑,pool屬性的意義稍后敘述、closestmt是告訴工具是否需要關閉Statement。(有些連接池如果你關閉Statement會拋出異常,的確很bt)
<table>元素顧名思義是代表一個表了,name屬性是數據表的名稱,如果是空,那么就代表沒有這個表,只是為抽象數據使用(或者說為繼承使用)。type屬性為映射到java源文件中的類名稱,extends屬性為父類的類名,子類可以繼承父類的字段以及find方法(哈!看到了么?這個工具支持表間的繼承!這才是對象化!)。
<pk><fd><fk>分別代表主鍵、字段和外鍵。name屬性代表字段名,type屬性代表類型。目前此工具只支持單一主鍵,并且類型只能為int、long或String。普通字段的類型可以是byte、short、int、long、float、double、BigDecimal、boolean、String、byte[]、Date、Time、Timestamp或者任意實現Serializable的可序列化的類名(比如Color),它們與數據庫類型的對應關系見JDBC相關介紹,如果類型是可序列化類,則數據庫類型要求是二進制類型。外鍵fk的類型為對應表所對應的類名稱。
<find>元素生成查找本類的相關代碼,name為方法名,sql為WHERE子句(可包含PreparedStatement的?符號),multi屬性指定返回的個數為單個還是多個,如果多個,工具可生成分頁查詢方法。
<find>元素的子元素為<param>元素,代表傳入的參數,name屬性為參數名稱,當name屬性是以"this."開頭的時候,代表這個參數由此對象的對象變量替代。
<custom>為自定義方法,name屬性為方法名,sql屬性為sql語句,multi屬性同<find>元素
<custom>除了包含<param>子元素(同<find>)外,還可以指定一個或多個<return>元素,代表自定義方法的返回值。
<tostring>元素可生成toString方法,name屬性代表對應字段。
<handword>元素為手寫部分,location屬性決定手寫部分的位置。
2、這個表對應的數據庫例如可以如下:
CREATE TABLE STUDENT (
ID NUMBER,
NAME VARCHAR2(30),
BIRTHDAY DATE,
GENDER BIT,
SDI VARCHAR2(30),
MASTER NUMBER
)
CREATE TABLE TEACHER (
ID NUMBER,
NAME VARCHAR2(30),
BIRTHDAY DATE,
GENDER BIT,
MARRIED BIT,
IMAGE BINARY
)
創建過程中可以省略主鍵限制和外鍵的關聯關系,因為工具生成的代碼保證了對應聯系。
3、運行工具生成代碼
用法: java kobe.util.sdo.SDOBuilder [選項] 描述文件
其中選項可能為:
-d <目錄> 指定輸出源文件目錄
-i 打印輸出詳細信息
使用非常簡單,不過抱歉-i選項目前只是個擺設
4、然后讓我們看看如何使用
首先,先要實現這個接口已提供數據庫連接
public interface ConPool {
Connection getCon();
void closeCon(Connection con);
}
public class MyPool implements ConPool {...}
然后來寫測試代碼
public void testSDO() {
//設置連接,請注意這里的"def"它和上面配置文件中的"def"所對應,意思是說我們生成的這兩個對象使用
//這個連接進行數據庫操作,如果不寫的話,默認為_default(見工具源碼或生成的代碼)
SDOContext.setPool("def", new MyPool());
try {
SDOContext.beginTransaction();//標志事務開始
Student s = Student.create();//自動創建,創建機制見生成的代碼
System.out.println("create student: " + s.getId());
//設置相關字段并更新
s.setName("小明");
s.setGender(true);
s.update();
//創建一個教師
Master m = Master.create(1);//通過手動傳入主鍵創建記錄
m.setName("四大名捕");
m.setMarried(false);
m.update();
//設置外鍵
s.setMaster(m);
s.update();
//簡單操作
List list = new ArrayList();
int n = Student.findByName(list, "小明");//n 為符合要求的結果數量
for(int i=0; i<n; i++) {
Student r = (Student)list.get(i);
System.out.println("找到小明:" + r.getId());
System.out.println("班主任是:" + r.getMaster().getName());
}
System.out.println("學生總數為:" + Student.getNumOfStudent());
SDOContext.commitTransaction();
} catch(SDOException e) {
SDOContext.rollbackTransaction();
throw e;
}
}嘿嘿,如果我不告訴你這是數據庫程序,你不會看出來吧?
我自己覺得這個工具是相當好用的,所以拿出來show一下,如果你有什么問題或者好的建議,I will be so appreciate~
(具體的使用方法請參考生成的代碼和工具源碼,關于文檔的缺乏我深表歉意。。。)
posted on 2005-11-28 13:56
WebWheel 閱讀(631)
評論(0) 編輯 收藏