浏览 10976 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2006-03-30
-------------------------------------------------------------- 在做东西之前,感觉现在很多公司很多项目中都要对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,如果你认为此程序很有缺陷,请指出,以便进行解决。 ===================================================================================== 最后:希望得到你的支持与理解,更希望得到你的意见和建议。 本人邮件(piliskys@itpub.net) 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2006-12-06
唉,没人讨论一下,失败
|
|
返回顶楼 | |
发表时间:2006-12-06
先看下再回,再讨论,呵呵
|
|
返回顶楼 | |
发表时间:2006-12-06
以业务为中心的开发才是正路
以表结构的开发..... 很容易就变成了以表驱动开发的工程了 (那样的工程用jbuild写EJB...的样子就可以达到) PS:xml可以用myeclipse开发 DAO中的增删查大多可以通用 并写在一个DAO中 而特殊的条件查询,统计查询又不能通用单写最好 VO这种东西与页面,逻辑关系大对数据库关系弱... 自动怎么才能生成? |
|
返回顶楼 | |
发表时间:2006-12-06
用Eclipse的一个插件hibernatesynchronizer,就可以解决问题呀,很好用
|
|
返回顶楼 | |
发表时间:2006-12-06
作为一个架构,我感觉以业务驱动是不太可取的,毕竟业务是会变的,而我们使用hibernate,主要是用它与数据库操作,对于一些业务操作当然是不应该放在此中的,hibernate是一种资源,而不应该掺杂其它更多的东西,应该考虑的是如何整合与其它框架,
DAO中是太多的东西可以通用,这只是一个模式,甚至可以省去, 一个东西自动生成的话,就不容易出错,质量就更容易保证,复杂不复杂也无关紧要,反正是计算机去做,只要保证人做的事简单就好 |
|
返回顶楼 | |