动态网站制作指南 [  QQ表情  ]
[ 投票调查 ]
[ 企业邮箱 ]
[ 网站空间 ]
网络编程 | 站长之家 | 网页制作 | 图形图象 | 操作系统 | 冲浪宝典 | 软件教学 | 网络办公 | 邮件系统 | 网络安全 | 认证考试 | 系统进程
ASP源码 | .Net源码 | PHP源码 | JSP源码 | JAVA源码 | CGI源码 | VB源码 | C++源码 | Delphi源码 | PB源码 | VF源码 | 汇编 | 服务器
Firefox | IE | Maxthon | 迅雷 | 电驴 | BitComet | FlashGet | QQ | QQ空间 | Vista | 输入法 | Ghost | Word | Excel | wps | Powerpoint
asp | .net | php | jsp | Sql | c# | Ajax | xml | Dreamweaver | FrontPages | Javascript | css | photoshop | fireworks | Flash | Cad | Discuz!
当前位置 > 网站建设学院 > 网络编程 > Java教程
Tag:注入,存储过程,分页,安全,优化,xmlhttp,fso,jmail,application,session,防盗链,stream,无组件,组件,md5,乱码,缓存,加密,验证码,算法,cookies,ubb,正则表达式,水印,索引,日志,压缩,base64,url重写,上传,控件,Web.config,JDBC,函数,内存,PDF,迁移,结构,破解,编译,配置,进程,分词,IIS,Apache,Tomcat,phpmyadmin,Gzip,触发器,socket
网络编程:ASP教程,ASP.NET教程,PHP教程,JSP教程,C#教程,数据库,XML教程,Ajax,Java,Perl,Shell,VB教程,Delphi,C/C++教程,软件工程,J2EE/J2ME,移动开发
文章搜索服务
邮件订阅
输入你的邮件地址,
你将不会错过任何关于:
[ Java教程 ]的信息

本月文章推荐
.在Eclipse中运行带参数的 Java 程.
.J2EE TM 蓝图摘要.
.Add 方法 (Dictionary).
.使用档案文件提高applet的加载速.
.java多线程设计模式详解之三.
.oracle中的数据库乱码的原因与解.
.Java套接字编程(上)(3).
.通过Java Swing看透MVC设计模式.
.在Java程序中实现高精度打印.
.Java多媒体框架设计自动播放机实.
.Java陷阱一箩筐----面试题集.
.JavaWebStart1.0.1_01的安装向导.
.(6)CLDC API.
.了解J2ME在实际开发中的可选包MM.
.定制你的Java--根据应用剪裁Java.
.如何在Java中实现Job Scheduling.
.用Java开发代理服务器.
.你所需要的《Just Java 2》.
.Java 语法介绍(一):Java语言的基.
.如何在JAVASE中使用Hibernate.

使用属性和反射过渡从数据存取层到业务物件

发表日期:2008-1-5 |



  简介
  当然,ado.net比起ado和oledb来说要简单多了.我所知道的是打开connection我可以通过dataset和datareader读取数据库.当然你也可以通过你的需要来恢复数据.
  
  我意识到dataset功能强大而且能节省我的时间,但是我还是愿意选择自己的方式了处理数据库程序.我喜欢用一个类来调用方法去更新数据. 因此当用数据库中的一条记录的时候我就会创建一个物件实例,设置它的属性和调用的的更新方法,就是这么简单.
  
  但是这样以来我不得不写老多的代码,业务物件类,数据库更新代码和数据库读取代码.开始的时候,我没有使用存储过程更新数据库,因此我要对没一个业务物件来写sql语句.在我修改数据库或业务物件的时候,这样的工作就显得非凡的乏味.
  
  我的方案
  我的方案是以创建简单的类开始的,是我写较少的代码来更新物件. 所有我做得就是增加字段的名字,值和类,然后生成sql语句. 当我结束这一切的时候,我一周都沉醉在快乐之中…
  
  可是当我开始使用sqlServer代替Access的时候,我的情绪变化了.我不能使用单纯的sql语句来更新我的物件,我不得不用存储过程.不幸又开始了…我不得不创建成打的sql语句来更新物件.枯燥的工作又开始了…
  
  我注重到我能写简单的类来生成参数,正如sql语句生成类一样.尽管这个方案能使我写少一点的代码,但是无论何时我的方案要是有所改动的话,我仍然要去检查我的更新代码.
  
  接着我有了在数据库中如何创建持续化类的想法.使用属性来描述数据库的表,这样属性就可以被映射到表中的字段了.这样我就可以仅仅修改业务物件类了.
  
  为了你更轻易读懂,我把这篇文章分成了三部分.第一部分展示使用属性来描述一个业务类.第二部分展示我是如何采集信息,最后我将展示完整的方案.
  
  I - Attributes
  attributes是用来描述装配件,类,属性,方法和字段的.在.net 架构里已经有些地方使用了.但是你可以创建自己的属性.
  
  我使用attributes来描述一个类是如何被存储到数据库中的.在一个类中,我将指出那些属性应该被持续化,正如存储过程是如何更新数据库的.为了描述表里的列,我在类的属性里面使用了attributes. 列可以是一个简单的数据字段,唯一的键或外键.
  
  如何创建自己的attribute?
  相当轻易,你可以创建一个继续于System.Attribute的类.至于命名习惯你可以加上个Attribut后缀.当你创建一个attribute,你要知道该attribute如何被用.是否应该被用在类?属性,或多个定义是答应的?
  
  现在是来看些代码的时候了.这些attributes被用来描述一个业务物件类:
  
  using System;
  
  using System.Data;
  
  namespace DAL
  
  {
  
  [AttributeUsage(AttributeTargets.Property)]
  
  public class BaseFieldAttribute : Attribute
  
  {
  
  string columnName;
  
  public BaseFieldAttribute(string columnName)
  
  {
  
  this.columnName = columnName;
  
  }
  
  public string ColumnName
  
  {
  
  get { return columnName; }
  
  set { columnName = value; }
  
  }
  
  }
  
  [AttributeUsage(AttributeTargets.Property)]
  
  public class DataFieldAttribute : BaseFieldAttribute
  
  {
  
  DBType dbType = DbType.String;
  
  int  size  = 0;
  
  public DataFieldAttribute(string columnName) : base(columnName)
  
  {
  
  }
  
  public DbType Type
  
  {
  
  get { return dbType; }
  
  set { dbType = value; }
  
  }
  
  public int Size
  
  {
  
  get { return size; }
  
  set { size = value; }
  
  }
  
  };
  
  [AttributeUsage(AttributeTargets.Property)]
  
  public class KeyFieldAttribute : BaseFieldAttribute
  
  {
  
  public KeyFieldAttribute(string columnName) : base(columnName)
  
  {
  
  }
  
  };
  
  [AttributeUsage(AttributeTargets.Property)]
  
  public class ForeignKeyFieldAttribute : BaseFieldAttribute
  
  {
  
  public ForeignKeyFieldAttribute(string columnName) : base(columnName)
  
  {
  
  }
  
  };
  
  [AttributeUsage(AttributeTargets.Class AttributeTargets.StrUCt)]
  
  public class DataTableAttribute : Attribute
  
  {
  
  string tableName;
  
  string updateStoredProcedure  = "";
  
  public DataTableAttribute(string tableName)
  
  {
  
  this.tableName = tableName;
  
  }
  
  public string TableName
  
  {
  
  get { return tableName; }
  
  set { tableName = value; }
  
  }
  
  public string UpdateStoredProcedure
  
  {
  
  get { return updateStoredProcedure; }
  
  set { updateStoredProcedure = value; }
  
  }
  
  }
  
  }
  
  正如你看到的,每个类的上面有个attributeusage attribute.它是来指示attribute是如何被使用的.
  
  我是如何使用这些 attribute来描述一个类的呢?
  
  假设你有一个应用来保存用户和联系的信息.在OO设计中,我们以一个Person来开始,那么联系信息就是一个person加上地址和信息.用户就是联系信息加上购买信息. 当然用户和别人是有依靠关系的.假如我在别的文章使用这些当然是相当愚蠢的.^_^
  
  这个类的代码如下:
  
  using System;
  
  using System.Data;
  
  using DAL;
  
  namespace TestApp
  
  {
  
  public class Person
  
  {
  
  string name = "";
  
  int age = 0;
  
  int id = 0;
  
  [KeyField("id")]
  
  public int Id
  
  {
  
  get { return id; }
  
  set { id = value; }
  
  }
  
  [DataField("name", Size=50)]
  
  public string Name
  
  {
  
  get { return name; }
  
  set { name = value; }
  
  }
  
  [DataField("age")]
  
  public int Age
  
  {
  
  get { return age; }
  
  set { age = value; }
  
  }
  
  public override string ToString()
  
  {
  
  return string.Format("{0}, {1} years old", Name, Age);
  
  }
  
  }
  
  [DataTable("contact", UpdateStoredProcedure="sp_UpdateContact")]
  
  public class Contact : Person
  
  {
  
  string phone = "";
  
  string email = "";
  
  string address = "";
  
  string address2 = "";
  
  string city = "";
  
  string postalCode = "";
  
  string state = "";
  
  string country = "";
  
  [DataField("phone", Size=20)]
  
  public string Phone
  
  {
  
  get { return phone; }
  
  set { phone = value; }
  
  }
  
  [DataField("email", Size=80)]
  
  public string Email
  
  {
  
  get { return email; }
  
  set { email = value; }
  
  }
  
  [DataField("address", Size=80)]
  
  public string Address
  
  {
  
  get { return address; }
  
  set { address = value; }
  
  }
  
  [DataField("address2", Size=80)]
  
  public string Address2
  
  {
  
  get { return address2; }
  
  set { address2 = value; }
  
  }
  
  [DataField("city", Size=50)]
  
  public string City
  
  {
  
  get { return city; }
  
  set { city = value; }
  
  }
  
  [DataField("postalCode", Size=20)]
  
  public string PostalCode
  
  {
  
  get { return postalCode; }
  
  set { postalCode = value; }
  
  }
  
  [DataField("state", Size=4)]
  
  public string State
  
  {
  
  get { return state; }
  
  set { state = value; }
  
  }
  
  [DataField("country", Size=50)]
上一篇:让Java.net合作开发 Borland推跨平台工具 人气:433
下一篇:用Factory Method模式扩展MyMSDNTVLibrary 人气:303
浏览全部Java的内容 Dreamweaver插件下载 常用网页广告代码全集
  最新网站源码 最新软件下载
2008-10-13 爬爬思特新闻管理系统 v2.0 Beta1
2008-10-13 Pligg v9.9.5 Beta
2008-10-13 广优邮件发送系统 v2.1
2008-10-13 缤纷互动视频交友 v3.1 RC
2008-10-13 MyShop网络商城 build 081005
2008-10-13 Chyrp 超轻量级开源博客引擎 v2.
2008-10-13 162100静态(论坛/文章)系统 v2.4
2008-10-13 金博人才招聘求职网黄金版 v4.2
2008-10-13 愚人笔记 v4.0
2008-10-11 联系人分组工具 v1.1 中文破解版
2008-10-11 FaceMelter变脸 v2.0 汉化破解版
2008-10-11 PathTracker道路跟踪仪 v1.2 破解
2008-10-11 Rooms手机聊天室 v0.6.7 破解版
2008-10-11 RemoteDesktop远程桌面 v1.0 破解
2008-10-11 ProRemote远程调音台 v1.0.1 破解
2008-10-11 PicShare照片共享 v1.0.0 破解版
2008-10-11 Photogene照片编辑器 v1.5 汉化破
2008-10-11 WriteRoom共享文档 v1.0 破解版
  发表评论
姓 名: 验证码:
内 容:
站长工具:网站收录查询 | Google PR查询 | ALEXA排名查询 | CSS在线编辑器 | 广告代码 | js/vbs加密 | md5加密 | 进制转换 | UTF-8 转换工具 | Html转换js | Html转换asp | Html转换php | Html转换perl
实用工具:汉字翻译拼音 | 拼音字典 | 符号对照表 | 个税计算 | 实时汇率查询换算 | 经典小工具 | 汉字简繁转换 | 普通单位换算 | 公制单位换算 | 生辰老黄历 | 国内电话区号 | 国家代码与域名缩写 | 文字加密解密 | 健康查询 | 万年历 | 汉字横竖排版 | 手机号码查询 | 计算器 | ip搜索
业务联系 | 广告刊登 | 频道合作 | 投稿荐稿 | 联系方式 | 加入收藏 | RSS订阅
Copyright © 2000-2008 www.knowsky.com All rights reserved | 网络实名:动态网站制作指南 | 沪ICP备05001343号
ホームページ制作 不動産検索システム 求人情報
防水工事·改修工事 フットサル大会 探偵
SEO対策 中国語教室 ホームページ作成