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

public interface DataStore
{

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

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

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

public int update(Object obj)
throws DAOException;

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

/** *//**
* 插入一VO
* @param obj 要設(shè)置一些相應(yīng)的屬性
* @return
* @throws DAOException 違反插入操作報錯
*/

public Serializable insert(Object obj)
throws DAOException;


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


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


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


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


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


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

public int sqlExcute(String s)
throws DAOException;

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

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

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

/** *//**
*
* @param s HQL
* @param list 參數(shù)對應(yīng)值系列
* @param i 結(jié)果集開始數(shù)
* @param j 結(jié)果集數(shù)
* @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();//得到一個操作的實像,現(xiàn)在你就可以用此類進(jìn)行以
上操作
如:Transaction tx = ds.currentTransaction() ;//得到此事務(wù)
現(xiàn)在我們假設(shè)有一個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同樣適用以上方法。
其它請參看以上接口類。
====================================================================================
若你需要以程序:請發(fā)郵件給我,但請注意:若你索取程序的同時,代表你同意以下信息,
1,請不要以任何形式轉(zhuǎn)發(fā)此程序給他人。
2,如果你認(rèn)為此程序很有缺陷,請指出,以便進(jìn)行解決。
3,如果在實踐中你以此程序受益,請必須進(jìn)行付費。
=====================================================================================
最后:希望得到你的支持與理解,更希望得到你的意見和建議。
請勿在此回復(fù)索取,本人郵件(piliskys@163.com)