piliskys

  BlogJava :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理 ::
  25 随笔 :: 0 文章 :: 40 评论 :: 0 Trackbacks


   在做东西之前,感觉现在很多公司很多项目中都要对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)

posted on 2006-01-17 18:51 霹雳火 阅读(8276) 评论(10)  编辑  收藏

评论

# re: hibernate自动生成xml,vo,dao(目前只实现oracle数据库) 2006-09-16 21:40 wildfire
不错,你的程序不能免费吗  回复  更多评论
  

# re: hibernate自动生成xml,vo,dao(目前只实现oracle数据库) 2006-11-28 17:33 xy
请问有没有解析PowerDesigner的类?  回复  更多评论
  

# re: hibernate自动生成xml,vo,dao(目前只实现oracle数据库) 2007-02-05 17:35 1
这也要钱??????????  回复  更多评论
  

# re: hibernate自动生成xml,vo,dao(目前只实现oracle数据库) 2007-05-09 18:15 但是
垃圾还要钱  回复  更多评论
  

# re: hibernate自动生成xml,vo,dao(目前只实现oracle数据库)[未登录] 2007-05-10 15:35 xy
垃圾确实可以卖钱的,而且可以同时讨饭,双收。  回复  更多评论
  

# re: hibernate自动生成xml,vo,dao(目前只实现oracle数据库)[未登录] 2007-05-17 15:45 ^_^
李变成刘,这点小问题都出现还要钱。。。爬哦  回复  更多评论
  

# re: hibernate自动生成xml,vo,dao(目前只实现oracle数据库) 2007-09-06 16:50 osshome
改成共享方式吧,好用的话有人买的。  回复  更多评论
  

# re: hibernate自动生成xml,vo,dao(目前只实现oracle数据库) 2007-12-21 21:57 技术交流
楼主若对j2ee技术感兴趣,我们诚邀您加入我们的技术讨论QQ群41732384 !本群加入条件为1年以上java工作经验!   回复  更多评论
  

# re: hibernate自动生成xml,vo,dao(目前只实现oracle数据库) 2008-06-05 11:11 唐福林
tangfulin2003@163.com
  回复  更多评论
  

# re: hibernate自动生成xml,vo,dao(目前只实现oracle数据库) 2009-03-19 07:28 温暖月光
我只是在思考一个问题
当你做好这个接口之后
需要使用还是要重新写里面的方法
这样还是要对hibernate有一定的了解
不是多此一举了么

很抱歉 我说得可能不对 我还是个初级程序员
希望你能给我一个更深层次的解释
email 42347381@qq.com
  回复  更多评论
  


只有注册用户登录后才能发表评论。


网站导航:
博客园   IT新闻   Chat2DB   C++博客   博问