用C#模拟 Java Bean (二)—— SqlPojo
来源:互联网 发布:50 seo 编辑:程序博客网 时间:2024/05/01 10:44
恩,之前已经展示了一个简单粗暴的 DBHelper 类。
该类不做任何检查就直接操作数据库了。
DBHelper最后出现了直接操作数据库实体对象(SqlPojo)的方法,明显,这需要SqlPojo的支持。
这里描述一下SqlPojo需要对此提供的支持:
- 自动生成SQL语句,增删改,查的话,暂不考虑
- 直接自查询结果中加载属性,明显,一个SqlPojo实例对应一个DataRow
啊,C#的注释没太搞清楚,谁能告诉我怎么让注释换行?
最好给个C#注释规则给我参考下。
using System;using System.Collections.Generic;using System.Linq;using System.Web;using System.Reflection;using System.Collections;using System.Data;/// <summary>/// <br>SqlPojo -- 对应数据库的实体</br>/// <br>模仿 Java 里 Hibernate JavaBean 而制作的虚基类</br>/// </summary>public abstract class SqlPojo{public SqlPojo(){//// TODO: 在此处添加构造函数逻辑// this.AddTime = DateTime.Now;} private const string Delimiter = ", "; private const string SingleTemplate = "Select * From [{0}] Where ({1})"; private const string InsertTemplate = "Insert Into [{0}] ({1}) Values ({2})"; private const string DeleteTemplate = "Delete From [{0}] Where ({1})"; private const string UpdateTemplate = "Update [{0}] Set {1} Where ({2})"; private const string FieldTemplate = "[{0}]"; private const string ValueTemplate = "'{0}'"; private const string SetNullTemplate = "[{0}] = NULL"; private const string SetValueTemplate = "[{0}] = '{1}'"; protected const string KeyTemplate = "[{0}] = '{1}'"; private DateTime _AddTime; private DateTime _UpdTime; /// <summary> /// <br>返回此数据库实体进入数据库时的时间</br> /// </summary> public virtual DateTime AddTime { get { return _AddTime; } set { _AddTime = value; } } /// <summary> /// <br>返回此数据库实体的最近一次更新时间</br> /// </summary> public virtual DateTime UpdTime { get { return _UpdTime; } set { _UpdTime = value; } } /// <summary> /// <br>返回此类实体对于数据库的主键限定语句</br> /// <br>例如:"Uid = this.Uid"</br> /// <example>"Oid = this.Oid AND Gid = this.Gid"</example> /// </summary> protected abstract string GetKeyCondition(); /// <summary> /// <br>返回此类实体所属的数据库表</br> /// <example>"User.Login"</example> /// </summary> protected abstract string GetTableName(); /// <summary> /// <br>返回此实体的默认状态值</br> /// <br>已放弃使用,因为并不是所有表都需要StatusCode这一列</br> /// <example value = "1500">1500</example> /// </summary> protected int GetDefaultST() { return 0; } /// <summary> /// <br>返回此实体所对应的 Insert 语句.</br> /// <br>注意,添加实体的时候应设定 AddTime 为 Now</br> /// </summary> public string ToInsertString() { //this._UpdTime = DateTime.Now; string fieldstr = ""; string valuestr = ""; bool first = true; foreach (PropertyInfo property in this.GetType().GetProperties()) { // this.InsertString 也会出现在 this.GetType().GetProperties() 中,从而导致 堆栈溢出,但它是只读的. // 剔除 只读 的属性 if (property.CanWrite == false) { continue; } // 剔除 空值 属性 和 零值属性 if (Constants.IsNull(property.GetValue(this))) { continue; } // if (first != true) { fieldstr += SqlPojo.Delimiter; valuestr += SqlPojo.Delimiter; } fieldstr += string.Format(SqlPojo.FieldTemplate, property.Name); valuestr += string.Format(SqlPojo.ValueTemplate, property.GetValue(this).ToString()); first = false; } return string.Format(SqlPojo.InsertTemplate, this.GetTableName(), fieldstr, valuestr); } /// <summary> /// <br>返回此实体对应的 Delete 语句</br> /// <br>请确保此时此实体的 GetKeyCondition 可用</br> /// </summary> public string ToDeleteString() { return string.Format(SqlPojo.DeleteTemplate, this.GetTableName(), this.GetKeyCondition()); } /// <summary> /// <br>返回此实体对应的 Update 语句</br> /// <br>请确保此时此实体的 GetKeyCondition 可用</br> /// <br>注意,更新的时候将 UpdateTime 设定为 Now</br> /// </summary> public string ToUpdateString() { //this._UpdTime = DateTime.Now; string fieldstr = ""; bool first = true; foreach (PropertyInfo property in this.GetType().GetProperties()) { // 剔除 只读 的属性 if (property.CanWrite == false) { continue; } if (first != true) { fieldstr += SqlPojo.Delimiter; } if (property.GetValue(this) == null) { fieldstr += string.Format(SqlPojo.SetNullTemplate, property.Name); } else { fieldstr += string.Format(SqlPojo.SetValueTemplate, property.Name, property.GetValue(this)); } first = false; } return string.Format(SqlPojo.UpdateTemplate, this.GetTableName(), fieldstr, this.GetKeyCondition()); } /// <summary> /// 返回此以 GetKeyCondition() 为条件的查询语句以获取单条记录 /// </summary> /// <returns></returns> public string ToSingleString() { return string.Format(SqlPojo.SingleTemplate, this.GetTableName(), this.GetKeyCondition()); } /// <summary> /// <br>从 Hashtable 中加载属性到实体中</br> /// </summary> /// <param name="param">哈希集合</param> public void LoadFromHashtable(Hashtable param) { foreach (PropertyInfo property in this.GetType().GetProperties()) { // 剔除 只读 的属性 if (property.CanWrite == false) { continue; } if (param.ContainsKey(property.Name) && param[property.Name] != null) { try { Type propertyType = property.PropertyType; string s = param[property.Name].ToString(); if (propertyType == typeof(string)) { property.SetValue(this, s); } else if (propertyType == typeof(long)) { property.SetValue(this, long.Parse(s)); } else if (propertyType == typeof(int)) { property.SetValue(this, int.Parse(s)); } else if (propertyType == typeof(bool)) { property.SetValue(this, bool.Parse(s)); } else if (propertyType == typeof(DateTime)) { property.SetValue(this, DateTime.Parse(s)); } } catch (Exception e) { Console.WriteLine(e.Message); } } } } public void LoadFromDataRow(DataRow dr) { foreach (PropertyInfo property in this.GetType().GetProperties()) { if (property.CanWrite == false) { continue; } if(dr.Table.Columns.Contains(property.Name)) { if(dr[property.Name] is System.DBNull) { property.SetValue(this, null); } else { property.SetValue(this, dr[property.Name]); } } } } public override string ToString() { Type tp = this.GetType(); return this.GetType().Name; }}
啊,发现有些注释是旧的,额,应该没关系,大家能理解就行。
0 0
- 用C#模拟 Java Bean (二)—— SqlPojo
- 用C#模拟 Java Bean (一)—— DBHelper
- 用C#模拟 Java Bean (三)—— Control
- 用C#模拟 Java Bean (四)—— Manage
- 用C#模拟 Java Bean (五)—— index.html
- 用C#模拟 Java Bean (六)—— Demo.zip
- 用C#模拟 Java Bean (七) —— 里程碑的思考
- EJB——会话bean(二)
- Spring基础—装配bean(二)
- Spring基础—装配bean(二)
- Spring基础—装配bean(二)
- Spring(18)——使用Java类的形式配置bean(二)
- C#模拟超人和小怪兽赛跑——多线程学习之(二)牛刀小试
- 模拟模拟交易系统(二)——系统设计
- 浅谈spring——Bean的生命周期(二)
- Spring 学习笔记(二)——装配 bean
- 【Spring】Spring实战(二)——装配Bean
- Spring(二)——Spring管理Bean的原理
- 杭电1063
- 动态规划算法
- 6道2-SAT题 (模板)
- Java归并排序
- Java基础从入门到精通
- 用C#模拟 Java Bean (二)—— SqlPojo
- TextView属性大全
- EasyUI DataGrid getChecked 总是只返回一条数据
- poj 1088
- UIPageControl的使用
- CSS - 三角形
- 字符串的一些算法
- ubuntu无线上网静态ip配置
- poj 1658