在做東西之前,感覺現在很多公司很多項目中都要對hibernate中的hbm.xml,vo,dao進行手工編寫,也有很多項目中為了方便省去了dao,用hql直接編寫, 在此,感覺如果用hql操作的話,不利用調試(沒有
sql的一些工具可對數據庫直接操作,如pl/sql等 )
對于此三種文件,只是代碼的一些參數的變化,邏輯操作基本相同,因此本人就想寫一程序直接生成這三
種文件,當我們程序員操作hibernate時,甚至不要求懂hibernate,只要求懂得一些接口,對vo如何操作
,這樣的話,可以把hibernate的使用錯誤率降低,可以減少程序員學習hibernate的時間,減少程序員寫
xml,vo,dao的時間,也有利于項目的穩定,讓程序員有更多時間了解業務.
當然這樣的工具在很多公司都自主開發了,作為公司產品的一部分,也就不可能任何人都得到了。
可能有人會說網上不是很多自動生成vo,xml等的東西吧,像MiddleGen,xdoclet等,但是它們雖然靈活,
但不能生成一整套文件,像MiddleGen,我不知道如果有上千個表的話,它會不會死,反正我運行一次六七
百個表進就死了,界面化的東西,而且要手工干預,感覺不是很好。
因此本人還是決定寫一寫此程序,不管它的運用是否能成功,開始,本人用erwin生成的xml文件解
析來操作分析,當然通過此xml文件完成是可以得到你要生在的三種文件的所有信息的,它不僅包括數據
庫中的物理結構,而且定義的邏輯結構也在此xml文件中,這樣的話,就可以實現一些表名的中注釋,而
且定義表的字段的大小寫也清晰分明,而且對文件操作可以與數據庫相脫離,感覺是一個很好的選擇。
但當運用后發現,xml定義要很規范,(如果是對于專一用戶來說是很容易實現),而且當今用數據建模
的工具太多,而且就算用erwin建模也可能定義的很不一樣。因此決定用直接從數據庫出發。
相對erwin的xml文件,數據庫的不足是沒有邏輯結構,因此不可能有一些表的中方對應注釋,而且表
名和字段名都變大寫,大小寫很難與原意相同,如定義的字段為FisrtName,在數據庫中都變為大寫,就很
難還原成此字符串,但好在此多數下不會影響操作。
因此,本人定義的vo中,表名 為 ab_cd_ef 對應的vo就是AbCdEfVO,也就是首字大寫有下劃線的后
一字母大寫,最后加上大定的'VO'二字符。
在hbm.xml文件中,本人只定義one-to-many,而其它many-to-one或one-to-one是在vo中找出此表對應外
鍵的vo,個人感覺:雖然hibernate中有多種對應關系,但是作為從本條結果出生,就為兩種,to-many和
to-one,
在vo中,本個引入了一個hashMap,nulllist主要是為了一些查詢、更新、或刪除時,用于字段設置為空時
進行操作。
主要接口
其中有一個接作接口,

public interface DataStore
{

/** *//**
* 刪除單個vo
* @param obj 需要設置主鍵
* @throws com.piliskys.exception.DAOException
*/
public void delete(Object obj)
throws DAOException;

/** *//**
* 刪除一系列vo
* @param obj 所有字段可設置null, 若屬性為字符串,可設置為 %,自動刪除匹配的VO
* @return 刪除后返回的行數
* @throws DAOException
*/
public int deleteByVO(Object obj)
throws DAOException;

/** *//**
* 單個vo更新
* @param obj 要設置主鍵(作為查詢條件) 其它set屬于更新字段
* @throws DAOException
*/

public int update(Object obj)
throws DAOException;

/** *//**
* 條件可如是字符串可設置帶%,其它可設置null,不能設置為''字符串
* 以前一對像做為條件進行批量更新后一對象設置的值
* @param obj 條件
* @param obj1 要更新的值
* @throws DAOException
*/
public int update(Object obj,Object obj1)
throws DAOException;

/** *//**
* 插入一VO
* @param obj 要設置一些相應的屬性
* @return
* @throws DAOException 違反插入操作報錯
*/

public Serializable insert(Object obj)
throws DAOException;


/** *//**
* 返回設置最大個數的vo
* @param class1
* @return
* @throws DAOException
*/
public List selectAll(Class class1)
throws DAOException;


/** *//**
* 根據主鍵查找vo
* @param obj 要設置主鍵
* @return 返回一相應的vo
* @throws DAOException
*/
public Object selectByPK(Object obj)
throws DAOException;


/** *//**
* 根據對象設置的屬性的值進行查找
* @param obj 可設置null,字符串字段可設置帶%字符串
* @return 對應的list
* @throws DAOException
*/
public List selectByVO(Object obj)
throws DAOException;


/** *//**
* 根據對象設置的屬性及起始和結束的個數的值進行查找
* (用于分頁)
* @param obj
* @param i 開始的行
* @param j 結束的行
* @return 對應的list
* @throws DAOException
*/
public List selectByVO(Object obj, int i, int j)
throws DAOException;


/** *//**
* hibernate的事物管理
* @return hibernate事物
*/
public Transaction currentTransaction() throws DAOException;;


/** *//**
* hibernate中直接調用sql語句(用于update和delete)
* @param s sql字符串
* @return 更新或刪除的個數
* @throws DAOException
*/

public int sqlExcute(String s)
throws DAOException;

/** *//**
* hibernate中直接調用sql語句(用于update和delete)
* @param s 帶“?”的字符串
* @param list 參數的設置
* @return 更新或刪除的個數
* @throws DAOException
*/
public int sqlExcute(String s, List list)
throws DAOException;

/** *//**
* 利用sql中帶參數的查詢
* @param s 帶 “?”字符的字符串
* @param list 參數集合
* @return List 含map的list,key為字段全部小寫
* @throws DAOException
*/
public List selectBySQL(String s, List list)
throws DAOException;

/** *//**
* HQL查詢
* @param s
* @param list 參數對應值系列
* @return
* @throws DAOException
*/
public List selectByQuery(String s, List list)
throws DAOException;

/** *//**
*
* @param s HQL
* @param list 參數對應值系列
* @param i 結果集開始數
* @param j 結果集數
* @return
* @throws DAOException
*/
public List selectByQuery(String s, List list,int i,int j)
throws DAOException;
public void flush()
throws DAOException;
public void close();
public void open();

========================================================================================
DataStore ds = DataManager.getInstance();//得到一個操作的實像,現在你就可以用此類進行以
上操作
如:Transaction tx = ds.currentTransaction() ;//得到此事務
現在我們假設有一個person類(id,name,address),id為主鍵
1,要查出id為'2323'的person ds.selectByPK( new PersonVO('2323') );
2, 要查出所有姓'李'的person集合
PersonVo per = new PersonVo();
per.setName('劉%');
List list = ds.selectByVO(per) ;
3, 要查出所有姓'李'的,地址為空的person集合
PersonVo per = new PersonVo();
per.setName('劉%');
per.setAddress(null);
List list = ds.selectByVO(per) ;
以上可以任意組合,deleteByVO同樣適用以上方法。
其它請參看以上接口類。
====================================================================================
若你需要以程序:請發郵件給我,但請注意:若你索取程序的同時,代表你同意以下信息,
1,請不要以任何形式轉發此程序給他人。
2,如果你認為此程序很有缺陷,請指出,以便進行解決。
3,如果在實踐中你以此程序受益,請必須進行付費。
=====================================================================================
最后:希望得到你的支持與理解,更希望得到你的意見和建議。
請勿在此回復索取,本人郵件(piliskys@163.com)