- 浏览: 49776 次
最新评论
-
ljf_home:
想法很不错。
一个云计算的构想 -
lizhi:
Libcloud 可以实现类似功能
一个云计算的构想 -
highill:
浏览器的兼容性问题和性能问题 需要很长时间来解决,中间有很多 ...
强大的HTML5 -
9310974aa:
非常感谢楼主!~~~
J2ME手机编程心得(四) -
longphoenix:
yangyi 写道互联网将更有用了,但是将更不安全了
确实啊 ...
强大的HTML5
这里我没有使用Hibernate,我一直都嫌Hibernate配置起来麻烦,而我最希望有一种最好是零配置的框架来实现基本的功能,所以我
尝试做了一个类似的这种“框架”,想利用这个和代码生成器结合提高开发的速度。
首先需要将表名和数据类的名字对应起来,我使用的Oracle数据库,定义规则如下:
1、表名的单词之间由下划线"_"分割,例如ADMIN_USER
2、数据类的名字和表的名字有一定的关系,例如ADMIN_USER,类的名字就是AdminUser
3、字段名的定义和表明规则一样
4、数据类里面的属性名字和数据类的名字规则相同
每个数据类都是由程序自动生成,生成以后不能修改,因此每个数据类还需要有一个VO类,继承数据类,以便存放数据库中没有的属
性或者存放与其他表关联的对象。
为了实现最基本的插入、删除、修改和查询功能,有些信息是数据类无法提供的,比如主键是哪个,哪个字段是通过序列生成的,因
此这里需要将一些额外的属性加到程序中,这里我使用了 Annotation ,将是否主键和序列的名字定义在每个属性的get方法上,这样不仅
可以告诉程序哪些属性是数据库中有的,而且可以在程序中知道数据表的关键的一些信息,可以实现一些操作的自动化。
例如:
我希望最终插入一条数据的代码是这样的:
删除数据是这样:
编辑数据是这样:
根据主键查询是这样:
以上的AdminUser类只是举例,最后的效果应该是任何一个根据规则建立的数据类,都可以用这样的代码实现基本的操作。
现在详细说一下针对数据库的各个操作我的实现和想法:
1)插入、删除和修改
我的最终目的是需要拿来一个数据对象,设置了里面属性的值以后,就可以调用插入方法将数据插入进去,而不需要每个DAO里面还要
写一些罗嗦的insert、update、delete等语句(当然特殊情况除外),仔细分析,Insert、update、delete语句需要的信息,基本上我的
数据类都可以提供,数据库的字段名可以用数据类的属性名转换,字段个数可以根据数据类的树形数量以及Annotation来获得,序列也可
以由Annotation获取,这样,insert语句的所有元素我们都具备了,只要利用反射将数据类的信息搜集起来再生成insert的语句和需要的
参数就可以了。有了这些,就可以使用JdbcTemplate进行数据库操作了。例如,我的表叫做ADMIN_USER,里面有name和id还有roleId属性
,其中id是由seq_admin_user序列生成的。为了避免空值的插入,因此需要在生成insert语句时候动态判断对象里面的属性值是否为空,
如果为空则不对这个字段进行插入或者更新操作。这样,就可以实现根据不同的对象进行同样的操作,避免了写那么多无聊的insert、
update和delete代码(当然这些只是最基本的,如果有特殊的应用肯定还是得手写sql的)
2)查询和表的关联
查询部分我是这样设计:先考虑一条记录的情况,首先,使用一个工具类将一条select语句的结果保存到一个HashMap(JdbcTemplate
就可以实现),例如select * from admin_user,查询出来的结果应该是一个HashMap,key是字段名,value是查询出来的值。然后根据这
个Map来进行转换,将这个Map转换为某个Class的一个实例,当然这个Class是要作为参数传递过去的,告诉程序需要将
Map转换成什么class,转换的原则也很简单,将这个class中的所有属性名提取出来,转换成字段名,再到Map去找有没有这个key,如果有
,将存储在里面的值取出,调用这个类的Set方法将值set进去,这样select取出来的数据就可以转换为一个或者多个Object(也就是前面
定义的数据类)。这样就可以实现单表的查询操作,查询操作一般是这样进行:
这样单表查询很容易就可以实现,对于多表关联,我是这样实现:
首先如果一个表和另外的表有关联,上边的例子如果ADMIN_USER表中的roleId和另外一张表的roleId关联,例如
这样我们需要ADMIN_USER和ADMIN_ROLE里面关联查询,才能知道某个管理员是什么角色,这样管理员的VO对象里面需要有一个对象
adminRole
select语句将所有需要的表的字段全部关联取出,放到Map里(和前面没什么区别),然后在调用从Map生成Object的方法查询目标class的
每个属性的时候需要判断这个树形是否实现了IVO接口,如果实现了,则递归调用这个方法,生成另外一个VO对象,再Set进去,这样,就
可以实现了两个表的简单关联。
例如上边的例子,查询方法应该是这样:
但这里存在一个问题,就是如果两个数据表的字段名相同但又不是相关联的字段(两个表有一个字段名相同但值不同),这样取出的数据
就会有问题,因为在Map里面key是唯一的。这个问题暂时我还没有想到好的解决办法,所以也只能在设计的时候避免有不相关的同名字段
。
以上就是我的大概的想法,请各位帮忙看一下这种想法是否可行,效率如何,程序实现我放到附件里面去了,请各位多多指教,谢谢!
尝试做了一个类似的这种“框架”,想利用这个和代码生成器结合提高开发的速度。
首先需要将表名和数据类的名字对应起来,我使用的Oracle数据库,定义规则如下:
1、表名的单词之间由下划线"_"分割,例如ADMIN_USER
2、数据类的名字和表的名字有一定的关系,例如ADMIN_USER,类的名字就是AdminUser
3、字段名的定义和表明规则一样
4、数据类里面的属性名字和数据类的名字规则相同
每个数据类都是由程序自动生成,生成以后不能修改,因此每个数据类还需要有一个VO类,继承数据类,以便存放数据库中没有的属
性或者存放与其他表关联的对象。
为了实现最基本的插入、删除、修改和查询功能,有些信息是数据类无法提供的,比如主键是哪个,哪个字段是通过序列生成的,因
此这里需要将一些额外的属性加到程序中,这里我使用了 Annotation ,将是否主键和序列的名字定义在每个属性的get方法上,这样不仅
可以告诉程序哪些属性是数据库中有的,而且可以在程序中知道数据表的关键的一些信息,可以实现一些操作的自动化。
例如:
public class AdminUser { private String name; private long id; private long roleId; @FieldFlag(pk=true,seq="seq_admin_user") public long getId(){return id;}; @FieldFlag public String getName(){return name;} @FieldFlag public long getRoleId(){return roleId;}; ///set方法略 } public class AdminUserVO extends AdminUser implements IVO { }
我希望最终插入一条数据的代码是这样的:
DataSource ds = ....//获得数据源 BaseDAO dao = new BaseDAO(ds); AdminUserVO user = new AdminUserVO(); user.setName("admin"); dao.saveObject(user);
删除数据是这样:
DataSource ds = ....//获得数据源 BaseDAO dao = new BaseDAO(ds); AdminUserVO user = new AdminUserVO(); user.setId(10000); dao.deleteObject(user);
编辑数据是这样:
DataSource ds = ....//获得数据源 BaseDAO dao = new BaseDAO(ds); AdminUserVO user = new AdminUserVO(); user.setId(10000); user.setName("a new name"); dao.updateObject(user);
根据主键查询是这样:
DataSource ds = ....//获得数据源 BaseDAO dao = new BaseDAO(ds); AdminUserVO user = new AdminUserVO(); user.setId(10000); user = dao.findObject(user);
以上的AdminUser类只是举例,最后的效果应该是任何一个根据规则建立的数据类,都可以用这样的代码实现基本的操作。
现在详细说一下针对数据库的各个操作我的实现和想法:
1)插入、删除和修改
我的最终目的是需要拿来一个数据对象,设置了里面属性的值以后,就可以调用插入方法将数据插入进去,而不需要每个DAO里面还要
写一些罗嗦的insert、update、delete等语句(当然特殊情况除外),仔细分析,Insert、update、delete语句需要的信息,基本上我的
数据类都可以提供,数据库的字段名可以用数据类的属性名转换,字段个数可以根据数据类的树形数量以及Annotation来获得,序列也可
以由Annotation获取,这样,insert语句的所有元素我们都具备了,只要利用反射将数据类的信息搜集起来再生成insert的语句和需要的
参数就可以了。有了这些,就可以使用JdbcTemplate进行数据库操作了。例如,我的表叫做ADMIN_USER,里面有name和id还有roleId属性
,其中id是由seq_admin_user序列生成的。为了避免空值的插入,因此需要在生成insert语句时候动态判断对象里面的属性值是否为空,
如果为空则不对这个字段进行插入或者更新操作。这样,就可以实现根据不同的对象进行同样的操作,避免了写那么多无聊的insert、
update和delete代码(当然这些只是最基本的,如果有特殊的应用肯定还是得手写sql的)
2)查询和表的关联
查询部分我是这样设计:先考虑一条记录的情况,首先,使用一个工具类将一条select语句的结果保存到一个HashMap(JdbcTemplate
就可以实现),例如select * from admin_user,查询出来的结果应该是一个HashMap,key是字段名,value是查询出来的值。然后根据这
个Map来进行转换,将这个Map转换为某个Class的一个实例,当然这个Class是要作为参数传递过去的,告诉程序需要将
Map转换成什么class,转换的原则也很简单,将这个class中的所有属性名提取出来,转换成字段名,再到Map去找有没有这个key,如果有
,将存储在里面的值取出,调用这个类的Set方法将值set进去,这样select取出来的数据就可以转换为一个或者多个Object(也就是前面
定义的数据类)。这样就可以实现单表的查询操作,查询操作一般是这样进行:
DataSource ds = ...//获取数据源 BaseDAO dao = new BaseDAP(ds); List list = dao.query("select * from admin_user where id=?",AdminUserVO.class,123); for(int i=0;i<list.size();i++) { AdminUserVO user = (AdminUserVO)list.get(i); System.out.println(user); }
这样单表查询很容易就可以实现,对于多表关联,我是这样实现:
首先如果一个表和另外的表有关联,上边的例子如果ADMIN_USER表中的roleId和另外一张表的roleId关联,例如
public class AdminRole { private long roleId; private String roleName; ....get和set方法与上边基本类似 } pubilc class AdminRoleVO extends AdminRole implements IVO { }
这样我们需要ADMIN_USER和ADMIN_ROLE里面关联查询,才能知道某个管理员是什么角色,这样管理员的VO对象里面需要有一个对象
adminRole
public class AdminUserVO extends AdminUser implements IVO { private AdminRole adminRole; ...adminRole的get和set方法 }
select语句将所有需要的表的字段全部关联取出,放到Map里(和前面没什么区别),然后在调用从Map生成Object的方法查询目标class的
每个属性的时候需要判断这个树形是否实现了IVO接口,如果实现了,则递归调用这个方法,生成另外一个VO对象,再Set进去,这样,就
可以实现了两个表的简单关联。
例如上边的例子,查询方法应该是这样:
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是唯一的。这个问题暂时我还没有想到好的解决办法,所以也只能在设计的时候避免有不相关的同名字段
。
以上就是我的大概的想法,请各位帮忙看一下这种想法是否可行,效率如何,程序实现我放到附件里面去了,请各位多多指教,谢谢!
- src.rar (10.3 KB)
- 描述: 源代码
- 下载次数: 102
评论
3 楼
drinkjava
2007-06-22
重复发明轮子,想要零配置,只要不用Hibernate的多表关联,就可以用工具实现config文件和PO,VO,DAO类代码自动生成,(本人花了一天时间就编好了)。 Hibernate天然支持跨数据库,缓存,分页,锁,这些难道你也要从头开始做吗?
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和封装类。以上功能基本实现,完全自己的东西,大家看看有什么要补充的。整理一下准备把代码发上来
我的实现如下:
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和封装类。以上功能基本实现,完全自己的东西,大家看看有什么要补充的。整理一下准备把代码发上来
1 楼
rainlife
2007-04-20
我觉得这个实际上,走的还是Hibernate的思路,所谓的零配置,Hibernate使用Annotation也可以做到。
发表评论
-
强大的HTML5
2010-02-23 09:50 2291前些天看了一些HTML5方面的资料,感觉 ... -
网站安全不可忽视--一个收费网站的破解过程
2004-10-07 09:23 1181某日在网上偶然打开一个网站,是有PLMM与你视频聊天的,但是要 ... -
教你用VC6做QQ对对碰外挂程序
2005-02-26 14:45 1091前段时间跟以前的同事玩QQ游戏对对碰,结果输的 ... -
用VC实现发送和接受短信
2005-04-14 01:48 3176前些日子感觉得练习一下VC了,所以就有想,平时发短信那 ... -
J2ME手机编程心得(一)
2006-01-18 09:05 910自学J2ME也有一段时间了,总觉得应该把自己学习的心得与 ... -
J2ME手机编程心得(二)
2006-01-18 09:06 1114J2ME的环境配置好了,现在就开始写我们的第一个J2ME的 ... -
J2ME手机编程心得(四)
2006-01-18 09:07 1541上一个贪吃蛇的游 ... -
J2ME手机编程心得(三)
2006-01-18 09:07 1209上一次已经做完了第一个简单的J2ME程序,但是可能大家最 ... -
Weblogic9.0的破解方法
2006-01-18 09:09 1157weblogic9已经出来了,在官方网站可以下载到试用版 ... -
利用J2ME制作你自己的网络相册
2006-01-21 11:52 1035现在越来越多的手机都支持拍照功能,但是各种型号的手机 ... -
Spring的IOC在J2EE项目中的应用
2006-03-06 17:28 1159前些天大概学习了一下Spring的IOC,感觉还是很方便的 ... -
自做代码生成器(一)介绍
2006-08-03 18:43 1146对数据库的操作中间,不同的地方无非是各个字段的信息,比如 ... -
自做代码生成器(二)规则格式定义
2006-08-03 18:45 1588首先是数据表和java类之间的转换规则,数据库以orac ... -
自做代码生成器(三)动手写代码
2006-08-03 18:46 1265定义好规则和配置格式,就可以开始动手写代码了,首先,需 ... -
自做代码生成器(四)举例实践
2006-08-03 18:47 1340我们先定义一个数据表的xml文件,比如系统用户的表sys ... -
OpenLaszlo在Resin上的部署以及开发
2007-07-04 18:00 1158早就关注过OpenLaszlo这个 ... -
resin3.1处理utf-8格式的jsp时存在的问题
2008-11-05 16:48 6445以前一直使用resin-3.0.x作为服务器,最近想升 ... -
一个网站性能的问题,寻求帮助!
2008-06-27 16:40 2560网站是一个wap站点,负责将用户访问的web站点的页面转换成为 ...
相关推荐
BP神经网络的典型结构包括输入层、一个或多个隐含层以及输出层。在网络学习过程中,信息从输入层开始,逐层向后传递至输出层,并根据输出与期望值之间的误差,反向调整各层神经元的权重和偏置,直至网络输出误差达到...
因此,建立一个准确可靠的水质预测模型对于大伙房水库的环境管理具有非常重要的意义。 本研究首先收集了大伙房水库的水质历史数据,包括溶解氧、高锰酸盐指数、生化需氧量、氨氮、总磷等多个关键水质指标。随后,...
Java的IO(输入/输出)系统是编程中一个至关重要的部分,它允许程序与外部世界进行数据交换。本文将深入探讨Java IO的一些基础知识,包括基本流、缓冲流、数据流和对象序列化。 首先,我们从最基础的流开始。在Java...
大家看一看,先上传一个线切割教程,不知大伙能不能用的着。
上述知识点详细阐述了观音阁水库输水工程信息自动化系统的设计与应用,涉及了工程的基本概念、系统架构、技术选型、自动监控、软件应用、数据采集、安全支撑以及实施效果等多个方面,为进一步理解和研究此类工程提供...
描述中的“希望大伙在需要时可以轻松找到”,意味着这个压缩包可能包含了多款Flash修改工具,或者是某一款工具的多个版本,以满足不同用户的需求。文件名“flash修改工具”可能是指一个包含这些工具的文件夹或者一个...
1. **交换机与网桥**:减少冲突域,但所有端口在一个广播域内。 ### 网络层 1. **路由器**:执行路径选择(路由决策),通过Routing Table进行广域网接入,并划分广播域。 ### 传输层 1. **TCP**:面向连接,...
大伙房水库信息化工程建设技术研究是一项旨在提升水库管理效率与决策能力的重要项目。该工程于2005年启动,总投资1632万元,其中中央财政投资占比70%,地方自筹30%。其核心目标是构建一个统一的信息平台,集成水文...
Code::Blocks天龙八部之C++实现(下),大伙儿著。
总的来说,长距离输水管线的压力监测数据处理是一个涉及多个学科领域的综合性问题,包括大数据处理、数据分析和水力学等。通过精确的数据分析,可以实现对输水系统的精细化管理和预测性维护,确保供水安全的同时,也...
EasyCode是一款崭新的、性能极为壮大的.Net软件辅助设计与代码生成系统,EasyCode不只 可认为您生成专业级“同时支撑多数据库的三层架构”数据拜访源码,还可认为您生成专业级的系统模块界面 。做前端开发必不可少的...
为了解决这一问题,实现水库防洪与兴利之间的协调,本文提出了一种基于模糊集合理论的方法来确定大伙房水库的分期汛限水位。模糊集合理论是处理不确定性问题的有效工具,尤其适用于涉及模糊性(即不精确或不完全清晰...
这部分内容包含了多个精心设计的Android项目案例,从需求分析、设计思路到实现过程,都有详细的讲解和代码示例。学习者可以通过实际操作,深入了解Android开发的整个流程,提升自己的实战能力。 此外,我们还提供了...
颜色是我们日常设计、编程或网页制作中不可或缺的一部分,精准选取颜色对于作品的视觉效果至关重要。今天分享的是一款非常好用的取颜色小工具,它能够帮助我们轻松获取屏幕上的任何颜色值,大大提升工作效率。 首先...
本系统主要模块 域名注册,虚拟主机,独立主机,企业邮局,网站推广,网站建设,代理专区,以及前后会员功能和强大的后台管理。1、会员注册2、在线订购各类产品(域名,主机,邮局,推广等)3、会员分为三个级别,方便...
改造后的大伙房水库水文自动测报系统由34个遥测站、5个中继站和1个大伙房水库 调度中心站构成。系统应利用遥测、通信、计算机和网络等技术,完成流域及测区内固定站点 内的降水量、水位和流量的遥测。超短波通信是...
关于设计模式的一个便于理解chm 又35个设计模式的实用性小例介绍 简单又便于理解 也方便大伙的查询
为了参加某个作秀活动,研究了一波如何结合小程序、科大讯飞实现语音录入、识别的实现。科大讯飞开发文档中只给出 Python 的 demo,并没有给出 node.js 的 sdk,但问题不大。本文将从小程序相关代码到最后对接科大讯...