自己开发轻量级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 ...
随机推荐
- avi格式详细介绍
百度:http://wenku.baidu.com/link?url=KB7qKc6UG4aeU-i9FtXeV8Uou4JHPceiyz3HNbzCrQw4phY-qRlcp3tTSwYPeIgdx ...
- 深度学习框架Caffe的编译安装
深度学习框架caffe特点,富有表达性.快速.模块化.下面介绍caffe如何在Ubuntu上编译安装. 1. 前提条件 安装依赖的软件包: CUDA 用来使用GPU模式计算. 建议使用 7.0 以上最 ...
- 使用RGBa和Filter实现不影响子元素的CSS透明背景
点击查看原文 问题 如果我们想要一个元素拥有半透明的背景,我们有两个选择: 使用CSS和 opacity 做一张 24-bit PNG 背景图片 在CSS中使用opacity有两个问题,一是为了适应所 ...
- 控制流之for
for..in是另外一个循环语句,它在一序列的对象上 递归 即逐一使用队列中的每个项目.我们会在后面的章节中更加详细地学习序列.使用for语句~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ...
- [即时通讯]openfire启动失败解决办法
当你发现你的电脑上的openfire无论你是重新安装还是重启都无法启动的情况下你可以按照我下面写的那些终端指令来启动你的openfire不用再去重新做你的系统了. 一般你发现你的openfire打开出 ...
- Android中SQLite的使用
SQLite是Android中内置的数据库,SQLite是轻量级数据库,支持标准的SQL语法,并且支持ACID事物. 在Android中提供了SQLIteOPenHelper类,帮助我们使用SQLit ...
- 在Android studio环境下使用EventBus
EventBus是一个订阅/发布消息总线,实现在应用程序里面,组件之间,线程之间的通信.因为event是任意的类型,所以这个使用起来非常方便. eventbus中的角色: event:当然就是事件啦 ...
- 使用DLL进行不同语言之间的调用(转)
源:使用DLL进行不同语言之间的调用 __declspec(dllexport) 是告诉编译器用来导出函数的,在代码中不另作说明了. extern "C" 的意思就是用C的方式来导 ...
- IOS_FMDB有关字典、数组存储及获取问题
http://blog.csdn.net/betterbb/article/details/25984455 FMDB存储字典或数组时会变成字符串存入sqlite里,但如果不将其转换成json格式存储 ...
- iOS的横屏(Landscape)与竖屏(Portrait)InterfaceOrientation
http://www.molotang.com/articles/1530.html 接着上篇写的触摸事件,这次借机会整理下iOS横屏和竖屏的翻转方向支持,即InterfaceOrientation相 ...