一个数据层的设计与实现,大伙帮忙看看是否可行,谢谢!
这里我没有使用Hibernate,我一直都嫌Hibernate配置起来麻烦,而我最希望有一种最好是零配置的框架来实现基本的功能,所以我
尝试做了一个类似的这种“框架”,想利用这个和代码生成器结合提高开发的速度。
首先需要将表名和数据类的名字对应起来,我使用的Oracle数据库,定义规则如下:
1、表名的单词之间由下划线"_"分割,例如ADMIN_USER
2、数据类的名字和表的名字有一定的关系,例如ADMIN_USER,类的名字就是AdminUser
3、字段名的定义和表明规则一样
4、数据类里面的属性名字和数据类的名字规则相同
每个数据类都是由程序自动生成,生成以后不能修改,因此每个数据类还需要有一个VO类,继承数据类,以便存放数据库中没有的属
性或者存放与其他表关联的对象。
为了实现最基本的插入、删除、修改和查询功能,有些信息是数据类无法提供的,比如主键是哪个,哪个字段是通过序列生成的,因
此这里需要将一些额外的属性加到程序中,这里我使用了 Annotation ,将是否主键和序列的名字定义在每个属性的get方法上,这样不仅
可以告诉程序哪些属性是数据库中有的,而且可以在程序中知道数据表的关键的一些信息,可以实现一些操作的自动化。
例如:
DataSource ds = ...//获取数据源BaseDAO dao = new BaseDAO(ds);List list = dao.query("select * from admin_user a inner join admin_role b on a.role_id=b.role_id",AdminUserVO.class);for(int i=0;i<list.size();i++){ AdminUserVO user = (AdminUserVO)list.get(i); System.out.println(user); AdminRoleVO role = user.getAdminRole(); System.out.println(role);}
但这里存在一个问题,就是如果两个数据表的字段名相同但又不是相关联的字段(两个表有一个字段名相同但值不同),这样取出的数据
就会有问题,因为在Map里面key是唯一的。这个问题暂时我还没有想到好的解决办法,所以也只能在设计的时候避免有不相关的同名字段
。
以上就是我的大概的想法,请各位帮忙看一下这种想法是否可行,效率如何,程序实现我放到附件里面去了,请各位多多指教,谢谢! 1 楼 rainlife 2007-04-20 我觉得这个实际上,走的还是Hibernate的思路,所谓的零配置,Hibernate使用Annotation也可以做到。 2 楼 wilson_qd 2007-06-22 支持你的想法,我自己也做了一套非Hibernate的数据库处理类,主要是嫌hibernate在多表关联时使用不爽。
我的实现如下:
1、支持mysql5/db2/oracle9/sqlserver2005
2、支持简单jdbc/C3P0/服务器jndi
3、基本处理类,处理数据库打开、关闭、提交等
3、数据处理类,执行sql/procude等
4、查询处理,给定sql,按list/map/类返回多行或一行,统计总行数,在使用分页时根据不同数据库采用不同分页方式(所以先支持这4种数据库)
5、提供当前日期、序列号
6、根据数据单元定义,进行增、删、改、查询、判断是否存在,它的查询和保存分别对应独立表或视图,主要是我们在查询时往往取一些关联名称等信息,而且对一些复杂系统,只有dba写出的sql才能保证高的执行效率
7、对数据单元采用单独的xml配置,在产品模式下只在首次使用读取配置,
8、特定业务处理,包括锁定数据(乐观锁)、备份修改的数据、根据key从表中取出value
9、有自己的工具选择表生成配置xml和封装类。以上功能基本实现,完全自己的东西,大家看看有什么要补充的。整理一下准备把代码发上来 3 楼 drinkjava 2007-06-22 重复发明轮子,想要零配置,只要不用Hibernate的多表关联,就可以用工具实现config文件和PO,VO,DAO类代码自动生成,(本人花了一天时间就编好了)。 Hibernate天然支持跨数据库,缓存,分页,锁,这些难道你也要从头开始做吗?