自己开发轻量级ORM(二)
上一篇简单的对轻量级ORM开发开了个头。这篇主要聊下ORM框架的设计思路。
ORM本质上是对数据库操作的抽象。大体上我将其分为对数据结构的抽象和对执行方法的抽象。
我的ORM设计图:

ORM框架需要完成.net数据和数据库中数据的相互转换,以及对SQL语句中经典的增删改查操作的抽象封装。
封装方法代码:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data;
using System.Data.Common;
using Model.Entities; namespace DAL.ErpSqlDAL.SqlFactory
{
/// <summary>CRUD方法抽象
/// 创建人:雷旭鹏(leo) 2014-1-13
/// 联系方式:leixupeng823@163.com
/// </summary>
/// <typeparam name="T"></typeparam>
public abstract class OperateEntity<T>:ResolveEntity<T> where T :BaseEntity
{
public OperateEntity(DbCmd dbCmd, string entityName, Type entityType)
: base(dbCmd, entityName, entityType)
{
} /// <summary>添加实体
/// </summary>
/// <param name="entityList">要添加的内容</param>
/// <returns></returns>
public virtual object AddEntity(IList<T> entityList)
{
try
{
base.SourceEntity = entityList;
base.ConditionEntity = null;
base.OperateType = OperateType.INSERT;
base.EntityToSql(); string strSql = base.CommandString; return DBHelper.ExecuteScalar(dbCmd.Cmd, CommandType.Text, strSql, base.Parameters.ToArray());
}
catch (Exception ex)
{
throw ex;
}
}
/// <summary>修改实体,要修改的内容和条件一一对应
/// </summary>
/// <param name="entityList">要修改的内容</param>
/// <param name="conditionList">条件</param>
/// <returns></returns>
public virtual int ModEntity(IList<T> entityList, IList<T> conditionList)
{
try
{
base.SourceEntity = entityList;
base.ConditionEntity = conditionList;
base.OperateType = OperateType.UPDATE; base.EntityToSql();
string strSql = base.CommandString;
return DBHelper.ExecuteNonQuery(dbCmd.Cmd, CommandType.Text, strSql, base.Parameters.ToArray());
}
catch
{
throw;
}
}
/// <summary>根据主键修改实体
/// </summary>
/// <param name="entityList">要修改的内容和包含主键值的实体</param>
/// <returns></returns>
public virtual int ModEntity(IList<T> entityList)
{
try
{
IList<T> cndEntity = new List<T>();
CreatePKConditionFromSourceEntity(entityList, cndEntity);
return ModEntity(entityList, cndEntity);
}
catch
{
throw;
}
}
/// <summary>删除实体
/// </summary>
/// <param name="conditionList">删除的条件</param>
/// <returns></returns>
public virtual int DelEntity(IList<T> conditionList)
{
try
{
base.SourceEntity = conditionList;
base.ConditionEntity = conditionList;
base.OperateType = OperateType.DELETE; base.EntityToSql();
string strSql = base.CommandString;
return DBHelper.ExecuteNonQuery(dbCmd.Cmd, CommandType.Text, strSql, base.Parameters.ToArray());
}
catch
{
throw;
}
}
/// <summary>得到实体
/// </summary>
/// <param name="condition">查询条件</param>
/// <returns></returns>
public virtual IList<T> GetEntity(T condition)
{
try
{
if (condition != null)
{
IList<T> coditionLists = new List<T>();
coditionLists.Add(condition); base.ConditionEntity = coditionLists;
base.SourceEntity = coditionLists;
}
base.OperateType = OperateType.SELECT; base.EntityToSql();
string strSql = base.CommandString;
return base.DateSetToEntity(DBHelper.GetDataSet(dbCmd.Adapter, dbCmd.Cmd, CommandType.Text, strSql, base.Parameters.ToArray()));
}
catch
{
throw;
}
}
/// <summary>得到一个值
/// </summary>
/// <param name="conditionList">查询条件</param>
/// <returns></returns>
public virtual Object GetValue(T conditionList)
{
try
{
IList<T> coditionLists = new List<T>();
coditionLists.Add(conditionList); base.SourceEntity = coditionLists;
base.ConditionEntity = coditionLists;
base.OperateType = OperateType.SELECT; base.EntityToSql();
string strSql = base.CommandString;
return DBHelper.ExecuteScalar(dbCmd.Cmd, CommandType.Text, strSql, base.Parameters.ToArray());
}
catch
{
throw;
}
} //exce by sql
/// <summary>执行存储过程得到一个值
/// </summary>
/// <param name="sqlStr">存储过程的名称</param>
/// <param name="Parameters">参数</param>
/// <returns></returns>
protected virtual Object GetValueByProc(string sqlStr, params DbParameter[] Parameters)
{
try
{
return DBHelper.ExecuteScalar(dbCmd.Cmd, CommandType.StoredProcedure, sqlStr, Parameters);
}
catch
{
throw;
}
}
/// <summary>执行SQL语句得到一个值
/// </summary>
/// <param name="sqlStr">SQL语句</param>
/// <param name="Parameters">参数</param>
/// <returns></returns>
protected virtual Object GetValueBySql(string sqlStr, params DbParameter[] Parameters)
{
try
{
return DBHelper.ExecuteScalar(dbCmd.Cmd, CommandType.Text, sqlStr, Parameters);
}
catch
{
throw;
}
}
/// <summary>执行SQL,返回受影响的函数
/// </summary>
/// <param name="sqlStr">存储过程的名称</param>
/// <param name="Parameters">参数</param>
/// <returns></returns>
protected virtual int ExecuteSql(string sqlStr, params DbParameter[] Parameters)
{
try
{
return DBHelper.ExecuteNonQuery(dbCmd.Cmd, CommandType.Text, sqlStr, Parameters);
}
catch
{
throw;
}
}
/// <summary>执行存储过程,返回受影响的函数
/// </summary>
/// <param name="sqlStr">存储过程的名称</param>
/// <param name="Parameters">参数</param>
/// <returns></returns>
protected virtual int ExecuteProc(string sqlStr, params DbParameter[] Parameters)
{
try
{
return DBHelper.ExecuteNonQuery(dbCmd.Cmd, CommandType.StoredProcedure, sqlStr, Parameters);
}
catch
{
throw;
}
} /// <summary>通过SQL语句得到实体
/// </summary>
/// <param name="sqlStr">SQL</param>
/// <returns></returns>
protected virtual IList<T> GetEntityBySql(string sqlStr)
{
try
{
return base.DateSetToEntity(DBHelper.GetDataSet(dbCmd.Adapter, dbCmd.Cmd, CommandType.Text, sqlStr, null));
}
catch
{
throw;
}
}
/// <summary>通过SQL语句得到DataSet
/// </summary>
/// <param name="sqlStr">SQL</param>
/// <returns></returns>
protected virtual DataSet GetDataSetBySql(string sqlStr)
{
try
{
return DBHelper.GetDataSet(dbCmd.Adapter, dbCmd.Cmd, CommandType.Text, sqlStr, null);
}
catch
{
throw;
}
}
/// <summary>通过SQL语句得到实体
/// </summary>
/// <param name="sqlStr">SQL</param>
/// <param name="Parameters">参数</param>
/// <returns></returns>
protected virtual IList<T> GetEntityBySql(string sqlStr, params DbParameter[] Parameters)
{
try
{
return base.DateSetToEntity(DBHelper.GetDataSet(dbCmd.Adapter, dbCmd.Cmd, CommandType.Text, sqlStr, Parameters));
}
catch
{
throw;
}
}
/// <summary>通过存储过程,语句得到实体
/// </summary>
/// <param name="sqlStr">SQL</param>
/// <param name="Parameters">参数</param>
/// <returns></returns>
protected virtual IList<T> GetEntityByProc(string sqlStr, params DbParameter[] Parameters)
{
try
{
return base.DateSetToEntity(DBHelper.GetDataSet(dbCmd.Adapter, dbCmd.Cmd, CommandType.StoredProcedure, sqlStr, Parameters));
}
catch
{
throw;
}
}
}
}
下一篇将讲下从代码上如何实现上面的设计图。
自己开发轻量级ORM(二)的更多相关文章
- 自己开发轻量级ORM(一)
在开发ORM之前,先简单的介绍下ORM的基本概念. 对象关系映射(Object Relational Mapping,简称ORM)是一种为了解决面向对象与关系数据库存在的互不匹配的现象的技术. 简单的 ...
- 自己开发轻量级ORM(三)
上一篇中简单分享了下ORM的设计思路.现在开始讲如何用代码来实现上篇的设计模型. 我们建2个类库来分别抽象数据库表结构关系映射和SQL增删改查操作. 打开VS2010,新建2个类库.分别起名为Mode ...
- 轻量级ORM框架 QX_Frame.Bantina(二、框架使用方式介绍)
轻量级ORM框架QX_Frame.Bantina系列讲解(开源) 一.框架简介 http://www.cnblogs.com/qixiaoyizhan/p/7417467.html 二.框架使用方式介 ...
- 轻量级ORM框架 QX_Frame.Bantina(一、框架简介)
轻量级ORM框架QX_Frame.Bantina系列讲解(开源) 一.框架简介 http://www.cnblogs.com/qixiaoyizhan/p/7417467.html 二.框架使用方式介 ...
- .NET轻量级ORM框架Dapper入门精通
一.课程介绍 本次分享课程包含两个部分<.NET轻量级ORM框架Dapper修炼手册>和<.NET轻量级ORM框架Dapper葵花宝典>,阿笨将带领大家一起领略轻量级ORM框架 ...
- .NET轻量级ORM组件Dapper葵花宝典
一.摘要 为什么取名叫<葵花宝典>? 从行走江湖的世界角度来讲您可以理解为一本"武功秘籍",站在我们IT编程的世界角度应该叫"开发宝典". 如果您在 ...
- 连表查询都用Left Join吧 以Windows服务方式运行.NET Core程序 HTTP和HTTPS的区别 ASP.NET SignalR介绍 asp.net—WebApi跨域 asp.net—自定义轻量级ORM C#之23中设计模式
连表查询都用Left Join吧 最近看同事的代码,SQL连表查询的时候很多时候用的是Inner Join,而我觉得对我们的业务而言,99.9%都应该使用Left Join(还有0.1%我不知道在 ...
- Farseer.net轻量级ORM开源框架 V1.x 入门篇:表的数据操作
导航 目 录:Farseer.net轻量级ORM开源框架 目录 上一篇:Farseer.net轻量级ORM开源框架 V1.x 入门篇:表实体类映射 下一篇:Farseer.net轻量级ORM开源框 ...
- [入门级] 基于 visual studio 2010 mvc4 的图书管理系统开发初步 (二)
[入门级] 基于 visual studio 2010 mvc4 的图书管理系统开发初步 (二) Date 周六 10 一月 2015 By 钟谢伟 Category website develop ...
随机推荐
- hibernate--联合主键--annotation
有3种方式: 1.@Embeddedable 2.@EmbeddedId 3. @IdClass 2,3 最常用 一, @Embeddedable 1.新建TeacherPK.java, 加入@Emb ...
- iOS关于UITabView和UIAlertController,UIAlertAction以及UINavigation,值修改的传递页面推送
关于UITabView和UIAlertController,UIAlertAction以及UINavigation,值修改的传递 集合嵌套集合的操作 声明 两个必须的的代理 实现部分代码 - (voi ...
- mrql初级教程-概念、使用(一)
以下是本人原创,如若转载和使用请注明转载地址.本博客信息切勿用于商业,可以个人使用,若喜欢我的博客,请关注我,谢谢!博客地址 感谢您支持我的博客,我的动力是您的支持和关注!如若转载和使用请注明转载地址 ...
- python模块 ---logging模块
摘要by crazyhacking: 与log4cxx一样,分为三个部分,logger, handler,formatter. 详细内容参考:1官网http://docs.python.org/2/h ...
- iPhone Info.plist属性说明
1.) <key>BadgeStyle</key> 设置这个属性就是修改通知标记 出现在未接电话短信邮件的那个小数字 可以改变字体 颜色 位置等 2.) <key> ...
- UIAlertView使用全解
举例: UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:@"Default Alert View"messa ...
- HDU1429 bfs
胜利大逃亡(续) Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Su ...
- C#键盘事件处理(来源网上)
C#键盘事件处理 如果你希望用户按F1弹出chm帮助,代码如下: private void FrmMain_Load(object sender, EventArgs e) { this.KeyPre ...
- UVa 10034 - Freckles
题目大意:给出n个点的坐标(x,y),要求用线段将n个点连接起来,求最小的线段和. 最小生成树问题,用Kruskal算法进行求解,其中用到了并查集.将所有的点连接,构成一张图,对每一条边进行编号,两点 ...
- Reactive 手机网络状态
RAC([UIApplication sharedApplication], networkActivityIndicatorVisible)