近期做项目,由于总要写烦人的Sql,就写了一个简单的ORM小工具,在数据缓存和事务处理还没怎么扩展,由于时间关系后续会补上嘀,废话少说了,看代码:
没有用Hibernate通过xml去动态生成数据库表字段,核心是通过反射取得实体对应数据库表的字段,这个字段可以加属性标识加以区分是否是数据库表字段。
1、实体基类,任何实体子类都要继承这个实体基类:
using System;
using System.Collections.Generic;
namespace SFDC.Model
{
/// <summary>
/// 实体基类
/// </summary>
[Serializable]
public class BaseEntity
{
/// <summary>
/// 数据库操作方式:1-查询,2-新建,3-更新,4-删除。
/// </summary>
public int OperaMode{get;set;}
/// <summary>
/// 只返回需要的表字段,格式:field1,field2,...
/// </summary>
public string TableFields { get; set; }
/// <summary>
/// 实体中有关联的表子集合,[table,relatedID]
/// </summary>
public Dictionary<string, string> DicRelatedTable { get; set; }
}
/// <summary>
/// 数据库操作方式:1-查询,2-新建,3-更新,4-删除。
/// </summary>
public enum OperaEnum
{
Select=1,
Insert=2,
Update=3,
Delete=4,
}
}2、逻辑类图:
using System.Collections.Generic;
using System.Reflection;
using SFDC.Model;
using System.Linq;
using System;
using System.Data.SqlClient;
using SFDC.BLL.Helper;
using System.Data;
using SFDC.Common.Helper;
namespace SFDC.BLL.DALCommon
{
/// <summary>
/// 数据库DAL查询处理
/// </summary>
public class SelectProcessDAL : IProcessDAL
{
public string ProcessSingle<T>(T obj)
{
string tbFields = (obj as BaseEntity).TableFields;
string fields = string.IsNullOrWhiteSpace(tbFields) ? "*" : tbFields;
string sql = string.Format("select {0} from {1}", fields, obj.GetType().Name);
string whereSql = null;
PropertyInfo[] proInfos = obj.GetType().GetProperties();
List<SqlParameter> paras = new List<SqlParameter>();
foreach (var p in proInfos)
{
if (p.DeclaringType.Name.Equals("BaseEntity", StringComparison.OrdinalIgnoreCase))
{
continue;
}
object val = p.GetValue(obj, null);
if( val!= null && !string.IsNullOrWhiteSpace(val.ToString()))
{
whereSql += string.Format("{0}=@{1} and ", p.Name, p.Name);
SqlParameter para = new SqlParameter(string.Format("@{0}", p.Name), val);
paras.Add(para);
}
}
whereSql = string.IsNullOrWhiteSpace(whereSql) ? null : string.Format(" where {0}", whereSql.Substring(0, whereSql.Length - 5));
sql = string.Format("{0} {1};", sql, whereSql);
IList<T> source = DBHelper.FillCollectionDataReader<T>(sql, CommandType.Text, paras.ToArray());
return JsonHelper.JsonSerializer(source);
}
public string ProcessCollection<T>(List<T> obj)
{
return null;
}
}
}可以看到,只要把实体值填充了需要处理的字段会自动生成sql,子表集合可以在
using System.Collections.Generic;
using System.Reflection;
using System.Data.SqlClient;
using SFDC.BLL.Helper;
using System.Data;
using System.Text;
using System;
namespace SFDC.BLL.DALCommon
{
/// <summary>
/// 数据库DAL增加处理
/// </summary>
public class InsertProcessDAL : IProcessDAL
{
public string ProcessSingle<T>(T obj)
{
return DBHelper.ExecuteQuery(GetSingleSql(obj), CommandType.Text, null);
}
public string ProcessCollection<T>(List<T> obj)
{
StringBuilder sb = new StringBuilder();
foreach (var v in obj)
{
sb.Append(GetSingleSql(v));
}
return DBHelper.ExecuteQuery(sb.ToString(), CommandType.Text, null);
}
private string GetSingleSql<T>(T obj)
{
string sql = string.Format("insert into {0}", obj.GetType().Name);
string fields = null;
string values = null;
PropertyInfo[] proInfos = obj.GetType().GetProperties();
foreach (var p in proInfos)
{
if (p.DeclaringType.Name.Equals("BaseEntity", StringComparison.OrdinalIgnoreCase))
{
continue;
}
object val = p.GetValue(obj, null);
if (val != null && !string.IsNullOrWhiteSpace(val.ToString()))
{
fields += string.Format("{0},", p.Name);
values += string.Format("'{0}',", val);
}
}
sql = string.Format("{0} ({1}) values ({2}); ", sql, fields.Substring(0, fields.Length - 1), values.Substring(0, values.Length - 1));
return sql;
}
}
}可以看到处理简单的增、删、改、查在后台是不用再写句代码的,也不需要配置xml文件,还算方便的,后续会加上事务处理和缓存,如果想要代码的可以留言,在优快云不知道怎么上传代码,惭愧!(之前也写过优快云的用户体验,可能是我这个用户笨了哈),欢迎指点出不足,谢谢!
本文介绍了一款简易的ORM工具的设计与实现,该工具通过反射获取实体类对应的数据库表字段,并支持基本的数据库操作如增、删、改、查,无需编写SQL语句或配置XML文件。
1148

被折叠的 条评论
为什么被折叠?



