piliskys

            BlogJava :: 首頁(yè) :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理 ::
            25 隨筆 :: 0 文章 :: 40 評(píng)論 :: 0 Trackbacks


             在做東西之前,感覺(jué)現(xiàn)在很多公司很多項(xiàng)目中都要對(duì)hibernate中的hbm.xml,vo,dao進(jìn)行手工編寫(xiě),也有很多項(xiàng)目中為了方便省去了dao,用hql直接編寫(xiě), 在此,感覺(jué)如果用hql操作的話,不利用調(diào)試(沒(méi)有

          sql的一些工具可對(duì)數(shù)據(jù)庫(kù)直接操作,如pl/sql等 )
          對(duì)于此三種文件,只是代碼的一些參數(shù)的變化,邏輯操作基本相同,因此本人就想寫(xiě)一程序直接生成這三

          種文件,當(dāng)我們程序員操作hibernate時(shí),甚至不要求懂hibernate,只要求懂得一些接口,對(duì)vo如何操作

          ,這樣的話,可以把hibernate的使用錯(cuò)誤率降低,可以減少程序員學(xué)習(xí)hibernate的時(shí)間,減少程序員寫(xiě)

          xml,vo,dao的時(shí)間,也有利于項(xiàng)目的穩(wěn)定,讓程序員有更多時(shí)間了解業(yè)務(wù).
               當(dāng)然這樣的工具在很多公司都自主開(kāi)發(fā)了,作為公司產(chǎn)品的一部分,也就不可能任何人都得到了。
          可能有人會(huì)說(shuō)網(wǎng)上不是很多自動(dòng)生成vo,xml等的東西吧,像MiddleGen,xdoclet等,但是它們雖然靈活,

          但不能生成一整套文件,像MiddleGen,我不知道如果有上千個(gè)表的話,它會(huì)不會(huì)死,反正我運(yùn)行一次六七

          百個(gè)表進(jìn)就死了,界面化的東西,而且要手工干預(yù),感覺(jué)不是很好。
               因此本人還是決定寫(xiě)一寫(xiě)此程序,不管它的運(yùn)用是否能成功,開(kāi)始,本人用erwin生成的xml文件解

          析來(lái)操作分析,當(dāng)然通過(guò)此xml文件完成是可以得到你要生在的三種文件的所有信息的,它不僅包括數(shù)據(jù)

          庫(kù)中的物理結(jié)構(gòu),而且定義的邏輯結(jié)構(gòu)也在此xml文件中,這樣的話,就可以實(shí)現(xiàn)一些表名的中注釋,而

          且定義表的字段的大小寫(xiě)也清晰分明,而且對(duì)文件操作可以與數(shù)據(jù)庫(kù)相脫離,感覺(jué)是一個(gè)很好的選擇。
          但當(dāng)運(yùn)用后發(fā)現(xiàn),xml定義要很規(guī)范,(如果是對(duì)于專一用戶來(lái)說(shuō)是很容易實(shí)現(xiàn)),而且當(dāng)今用數(shù)據(jù)建模

          的工具太多,而且就算用erwin建模也可能定義的很不一樣。因此決定用直接從數(shù)據(jù)庫(kù)出發(fā)。
              相對(duì)erwin的xml文件,數(shù)據(jù)庫(kù)的不足是沒(méi)有邏輯結(jié)構(gòu),因此不可能有一些表的中方對(duì)應(yīng)注釋,而且表

          名和字段名都變大寫(xiě),大小寫(xiě)很難與原意相同,如定義的字段為FisrtName,在數(shù)據(jù)庫(kù)中都變?yōu)榇髮?xiě),就很

          難還原成此字符串,但好在此多數(shù)下不會(huì)影響操作。
               因此,本人定義的vo中,表名 為 ab_cd_ef 對(duì)應(yīng)的vo就是AbCdEfVO,也就是首字大寫(xiě)有下劃線的后

          一字母大寫(xiě),最后加上大定的'VO'二字符。
          在hbm.xml文件中,本人只定義one-to-many,而其它many-to-one或one-to-one是在vo中找出此表對(duì)應(yīng)外

          鍵的vo,個(gè)人感覺(jué):雖然hibernate中有多種對(duì)應(yīng)關(guān)系,但是作為從本條結(jié)果出生,就為兩種,to-many和

          to-one,
          在vo中,本個(gè)引入了一個(gè)hashMap,nulllist主要是為了一些查詢、更新、或刪除時(shí),用于字段設(shè)置為空時(shí)

          進(jìn)行操作。
            主要接口
          其中有一個(gè)接作接口,

          public interface DataStore {
                
          /**
                   * 刪除單個(gè)vo
                   * 
          @param obj   需要設(shè)置主鍵
                   * 
          @throws com.piliskys.exception.DAOException
                   
          */

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

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


              
          public  int update(Object obj)
                  
          throws DAOException;
                   
          /**
                    * 條件可如是字符串可設(shè)置帶%,其它可設(shè)置null,不能設(shè)置為''字符串
                    * 以前一對(duì)像做為條件進(jìn)行批量更新后一對(duì)象設(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 違反插入操作報(bào)錯(cuò)
                     
          */


              
          public  Serializable insert(Object obj)
                  
          throws DAOException;

                     
          /**
                      * 返回設(shè)置最大個(gè)數(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ù)對(duì)象設(shè)置的屬性的值進(jìn)行查找
                       * 
          @param obj 可設(shè)置null,字符串字段可設(shè)置帶%字符串
                       * 
          @return   對(duì)應(yīng)的list
                       * 
          @throws DAOException
                       
          */

              
          public  List selectByVO(Object obj)
                  
          throws DAOException;

                      
          /**
                       * 根據(jù)對(duì)象設(shè)置的屬性及起始和結(jié)束的個(gè)數(shù)的值進(jìn)行查找
                       * (用于分頁(yè))
                       * 
          @param obj
                       * 
          @param i  開(kāi)始的行
                       * 
          @param j  結(jié)束的行
                       * 
          @return   對(duì)應(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語(yǔ)句(用于update和delete)
                        * 
          @param s  sql字符串
                        * 
          @return   更新或刪除的個(gè)數(shù)
                        * 
          @throws DAOException
                        
          */


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

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

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

              
          public  List selectByQuery(String s, List list)
                  
          throws DAOException;
              
          /**
               *
               * 
          @param s   HQL
               * 
          @param list  參數(shù)對(duì)應(yīng)值系列
               * 
          @param i  結(jié)果集開(kāi)始數(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();//得到一個(gè)操作的實(shí)像,現(xiàn)在你就可以用此類進(jìn)行以

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

          posted on 2006-01-17 18:51 霹靂火 閱讀(8289) 評(píng)論(10)  編輯  收藏

          評(píng)論

          # re: hibernate自動(dòng)生成xml,vo,dao(目前只實(shí)現(xiàn)oracle數(shù)據(jù)庫(kù)) 2006-09-16 21:40 wildfire
          不錯(cuò),你的程序不能免費(fèi)嗎  回復(fù)  更多評(píng)論
            

          # re: hibernate自動(dòng)生成xml,vo,dao(目前只實(shí)現(xiàn)oracle數(shù)據(jù)庫(kù)) 2006-11-28 17:33 xy
          請(qǐng)問(wèn)有沒(méi)有解析PowerDesigner的類?  回復(fù)  更多評(píng)論
            

          # re: hibernate自動(dòng)生成xml,vo,dao(目前只實(shí)現(xiàn)oracle數(shù)據(jù)庫(kù)) 2007-02-05 17:35 1
          這也要錢??????????  回復(fù)  更多評(píng)論
            

          # re: hibernate自動(dòng)生成xml,vo,dao(目前只實(shí)現(xiàn)oracle數(shù)據(jù)庫(kù)) 2007-05-09 18:15 但是
          垃圾還要錢  回復(fù)  更多評(píng)論
            

          # re: hibernate自動(dòng)生成xml,vo,dao(目前只實(shí)現(xiàn)oracle數(shù)據(jù)庫(kù))[未登錄](méi) 2007-05-10 15:35 xy
          垃圾確實(shí)可以賣錢的,而且可以同時(shí)討飯,雙收。  回復(fù)  更多評(píng)論
            

          # re: hibernate自動(dòng)生成xml,vo,dao(目前只實(shí)現(xiàn)oracle數(shù)據(jù)庫(kù))[未登錄](méi) 2007-05-17 15:45 ^_^
          李變成劉,這點(diǎn)小問(wèn)題都出現(xiàn)還要錢。。。爬哦  回復(fù)  更多評(píng)論
            

          # re: hibernate自動(dòng)生成xml,vo,dao(目前只實(shí)現(xiàn)oracle數(shù)據(jù)庫(kù)) 2007-09-06 16:50 osshome
          改成共享方式吧,好用的話有人買的。  回復(fù)  更多評(píng)論
            

          # re: hibernate自動(dòng)生成xml,vo,dao(目前只實(shí)現(xiàn)oracle數(shù)據(jù)庫(kù)) 2007-12-21 21:57 技術(shù)交流
          樓主若對(duì)j2ee技術(shù)感興趣,我們誠(chéng)邀您加入我們的技術(shù)討論QQ群41732384 !本群加入條件為1年以上java工作經(jīng)驗(yàn)!   回復(fù)  更多評(píng)論
            

          # re: hibernate自動(dòng)生成xml,vo,dao(目前只實(shí)現(xiàn)oracle數(shù)據(jù)庫(kù)) 2008-06-05 11:11 唐福林
          tangfulin2003@163.com
            回復(fù)  更多評(píng)論
            

          # re: hibernate自動(dòng)生成xml,vo,dao(目前只實(shí)現(xiàn)oracle數(shù)據(jù)庫(kù)) 2009-03-19 07:28 溫暖月光
          我只是在思考一個(gè)問(wèn)題
          當(dāng)你做好這個(gè)接口之后
          需要使用還是要重新寫(xiě)里面的方法
          這樣還是要對(duì)hibernate有一定的了解
          不是多此一舉了么

          很抱歉 我說(shuō)得可能不對(duì) 我還是個(gè)初級(jí)程序員
          希望你能給我一個(gè)更深層次的解釋
          email 42347381@qq.com
            回復(fù)  更多評(píng)論
            


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


          網(wǎng)站導(dǎo)航:
           
          主站蜘蛛池模板: 资溪县| 饶阳县| 山丹县| 武功县| 南京市| 吴堡县| 大冶市| 巍山| 苏州市| 孟州市| 临朐县| 西华县| 牡丹江市| 德安县| 大丰市| 望奎县| 无极县| 西和县| 信阳市| 兴城市| 山丹县| 黎川县| 瑞丽市| 桂平市| 岢岚县| 城固县| 平武县| 陵川县| 沐川县| 华池县| 鄂托克前旗| 绥中县| 烟台市| 大英县| 从江县| 墨脱县| 应用必备| 仙居县| 凌海市| 怀远县| 静乐县|