自己开发轻量级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 ...
随机推荐
- ZOJ 3935 2016
简单规律题...没看懂题目直接从输出中找到了规律. 先不管是不是闰年,前后两项的差值会形成一个等差数列,公差是64... 输出的时候再判一下闰年即可. #include<cstdio> # ...
- iOS设置状态栏的字体颜色
设置statusBar的[前景色部分] 1.plist设置statusBar 在plist里增加一行 UIStatusBarStyle(或者是“Status bar style”也可以),这里可以设置 ...
- 如何使用UDP进行跨网段广播(转)
源:如何使用UDP进行跨网段广播 广播域首先我们来了解一下广播域的概念.广播域是网络中能接收任一台主机发出的广播帧的所有主机集合.也就是说,如果广播域内的其中一台主机发出一个广播帧,同一广播域内所有的 ...
- c++初学(电梯实验)
模拟电梯载人实验 Elevator.h class Elevator{public: Elevator(); ~Elevator(); void getNowNum(); ...
- JAVA文件的两种读取方法和三种写入方法
在使用java对文件进行读写操作时,有多种方法可以使用,但不同的方法有不同的性能. 此文对常用的读写方法进行了整理,以备不时之需. 1.文件的读取 主要介绍两种常用的读取方法.按行读取和按字符块读取. ...
- VIM 第二天--快捷键
好吧,今天是重新学习vim的第二天,不得不说,收货丰厚. 先来勉励一下自己: 存活(目前状态) 感觉很好 感觉更好,更强,更快 吃用vim超能力 vimtutor练到lesson 7了,略微总结一下, ...
- 详解JavaScript中的事件处理
在漫长的演变史,我们已经告别了内嵌式的事件处理方式(直接将事件处理器放在HTML元素之内来使用),今天的事件,它已是DOM的重要组成部分,遗憾的是,IE继续保留它最早在IE4.0中实现的事件模型,以后 ...
- LNAMP 中的PHP探针
<?php /* ----------------本探针基于YaHei.net探针------------------- */ error_reporting(0); //抑制所有错误信息 @h ...
- apache的工作模式 和 最大连接数设置
经过测试 效果明显 (1)首选查看apache的工作模式 windows下的查看apache的工作模式命令:httpd -l 如果列出mod_win32.c,则表示是 win32.c 工作方式. 列出 ...
- MariaDB10自动化安装部署
去MariaDB官网下载MariaDB本文用的是MariaDB 10.1.16 https://downloads.mariadb.org 选择二进制版本,下载到/root目录下 mariadb-10 ...