服务热线:13616026886

技术文档 欢迎使用技术文档,我们为你提供从新手到专业开发者的所有资源,你也可以通过它日益精进

位置:首页 > 技术文档 > JAVA > 新手入门 > 基础入门 > 查看文档

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


  简介
  当然,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)]

扫描关注微信公众号