在写基于数据库的程序中发现,通常关系数据库中一个表可以抽象为一个类,数据表中的每条数据都可以看做是该类的一个实例。
例如用户表Users有三个字段:id(varchar2),name(Varchar2),age(number)。用户理所当然要抽象成一个类(当然,这里谈的是面向对象设计),而该类的数据成员应该是Users表中的三个字段。至于用户类的方法,总少不了增删改查这些操作,例如添加新用户,修改用户信息,查询用户等等。
问题来了,如果我们有N个表,要对这N个表进行操作,写N个类,他们的数据成员(其实就是数据表字段)不一样,却有着一些相同的方法(增删改查),是不是要给每一个类一一地写这些实现呢?如果N>10,你是否感觉很累呢?以后如果还有类似的项目,你又要重新再写N个类,买噶的,我都要疯了,不知道你有何感想?
我们是程序员,但不能傻傻的闷声写程序,那样键盘敲破了都不会有进步。写程序之前,想一想,我的代码怎么样才能设计的更加精巧更加容易复用呢?
我在前面的博客中好像写过利用抽象工厂模式实现不同数据库的自由切换(?时间太长,不大记得了)。这里再写一个抽象的数据表数据实体类作为基类,为他的每个子类实现增删改查这些数据库操作,子类只要向基类传入表名和列名就可以了。这样,以后每个项目你都不用再染指关于数据库的东西了。
首先是一个数据项类,该类把列名和数据绑定起来,方便操作。
然后是本文的核心,数据表实体对象类,比较长,呵呵
例如用户表Users有三个字段:id(varchar2),name(Varchar2),age(number)。用户理所当然要抽象成一个类(当然,这里谈的是面向对象设计),而该类的数据成员应该是Users表中的三个字段。至于用户类的方法,总少不了增删改查这些操作,例如添加新用户,修改用户信息,查询用户等等。
问题来了,如果我们有N个表,要对这N个表进行操作,写N个类,他们的数据成员(其实就是数据表字段)不一样,却有着一些相同的方法(增删改查),是不是要给每一个类一一地写这些实现呢?如果N>10,你是否感觉很累呢?以后如果还有类似的项目,你又要重新再写N个类,买噶的,我都要疯了,不知道你有何感想?
我们是程序员,但不能傻傻的闷声写程序,那样键盘敲破了都不会有进步。写程序之前,想一想,我的代码怎么样才能设计的更加精巧更加容易复用呢?
我在前面的博客中好像写过利用抽象工厂模式实现不同数据库的自由切换(?时间太长,不大记得了)。这里再写一个抽象的数据表数据实体类作为基类,为他的每个子类实现增删改查这些数据库操作,子类只要向基类传入表名和列名就可以了。这样,以后每个项目你都不用再染指关于数据库的东西了。
首先是一个数据项类,该类把列名和数据绑定起来,方便操作。
- /// <summary>
- /// 数据项类 包括数据库字段名称和值
- /// </summary>
- public class DataItem
- {
- private static IDatabaseFactory m_fac = SqlHelper.CreateDatabaseFactory(); //这个数据库抽象工厂,会在后面列出来
- private readonly string m_name;
- private object m_value;
- /// <summary>
- /// 构造 数据项实例
- /// </summary>
- /// <param name="name">数据库字段名称</param>
- public DataItem(string name)
- {
- this.m_name = name;
- }
- /// <summary>
- /// 获取 数据库字段名称
- /// </summary>
- public string Name
- {
- get { return m_name; }
- }
- /// <summary>
- /// 获取或设置 字段对应的值
- /// </summary>
- public object Value
- {
- get { return m_value; }
- set { m_value = value; }
- }
- /// <summary>
- /// 获取 值在SQL语句中的字符串表示
- /// </summary>
- public string ValueSqlString
- {
- get
- {
- if (m_value == null)
- {
- return "null";
- }
- else if (m_value.GetType() == typeof(string))
- {
- return "'" + m_value.ToString().Replace("'","''") + "'";
- }
- else if (m_value.GetType() == typeof(int))
- {
- return m_value.ToString();
- }
- else if (m_value.GetType() == typeof(DateTime))
- {
- return m_fac.ToDBTimeString(Convert.ToDateTime(m_value));
- }
- else
- {
- return "null";
- }
- }
- }
- public override string ToString()
- {
- return m_name + "="+ValueSqlString;
- }
- }
- /// <summary>
- /// 与数据库表紧密相关 的 实体类
- /// </summary>
- public class DataTableObject
- {
- protected readonly string m_tableName;
- protected DataItem m_key;
- protected IList<DataItem> m_col;
- /// <summary>
- /// 构造 一个数据表实体类
- /// </summary>
- /// <param name="tableName">表名</param>
- /// <param name="keyName">主键名</param>
- /// <param name="colN