• 推荐
  • 评论
  • 收藏

NET实现之(简易ORM)

2022-11-30    4491次浏览

ORM模型在现在的项目开发中用的还是比较多的,他的好坏我们就不讨论了,已学习为主吧;

ORM模型的大概思想就是实体与我们库中的表的对应关系,一个实体就好比表中的一行数据,将实体的操作视为对表的操作,如增、删、该、查就是对表的同样操作,我们只需要简单的封装一下就可以省很多的重复劳动,通过ORM模型对我们的代码的简洁程度还是有目共睹的,我们将对数据库的操作通过ORM转换后执行,前者我们省掉了很多复杂的SQL组装,后者其实是一样的只不过将SQL的组装通过ORM将MODEL的一些属性通过反射的方式获取然后拼接SQL去执行,在项目的数据库变更,很容易就切换了上下文的数据库访问代码,将诸如SqlConnection、SqlCommand之类的针对性的数据访问代码,封装起来实现简单灵活的访问,ORM模型确实为我们的开发提高了效率,下面我就用我写的简单的ORM模型来讲解一下ORM模型的大概实现方式和基本原理;[王清培版权所有,转载请给出署名]

1:

这是我测试数据库中的一张tb_user表,其中id是自动增长主键,下面我们就用这张表来讲解我是怎么通过ORM来实现对这张表的增、删、该、查的;

2:

这是我项目中的与上图对应的MODEL,我用两个特性标记出MODEL中与表对应的信息,表名、列的主键、是否自增长;用这些特性的目的就是在ORM模型的核心部分拼接SQL代码时,在做删除、更新时知道那一列是对应数据库中的主键,在做增加时我要知道那些列是自增长的等等;

3:

这是我的项目中的具体类型信息,本人已上传全部源码,为了便于大家学习我就简单的介绍一下这些类型具体是什么意思;

上图是两个项目,第一个CommandLib.Test是做测试使用的,里面有一个TB_user类型,它对应我库中的一张表;X.CommandLib是ORM模型的实现;我就从Data目录往下介绍一下,ColumnAttribute是MODEL的列特性信息,用来标识列是否是主键、自增长;DataSourceType是不同数据源类型枚举如:SqlServer、Oracle、OLEDB等;IDataParameterFactory是所有数据源操作时的IDataParameter接口的工厂,这样就可以很方便的切换不同数据源的操作参数类型;IDataSourceType是一个接口类型,这个接口的作用就是用来说明,不管是哪种数据源的操作对象都必须实现这一组规范,这样可以严格控制我们上层在调用的时候很顺手方便,在这个接口里面基本上就是对数据库的常用操作了;IDataSourceTypeFactory是一个IDataSourceType接口的工厂,这个工厂通过读取配置文件来确定当前程序的上下文使用什么类型的数据源操作对象;OledbSource是实现了IDataSourceType接口的Oledb数据源操作类;OracleSource也是实现了IDataSourceType接口的ORACLE数据源操作类;ORMHelper是核心ORM模型的实现,这里面就是所有的MODEL与SQL代码之间的转换实现;SQLServerSource也是实现了IDataSourceType接口的SQLServer数据源的实现;TableActionType是ORM模型在操作时需要确定当前对表的操作类型(增、删、改、查);TableAttibute是MODEL中的表信息特性,用来确定当前的MODEL是对应于库中的哪一站表;所有的类型就介绍完了,下面给出总体的结构图,以便读者对上图的结构很清晰明了;[王清培版权所有,转载请给出署名]

4:

下面我就简单讲解一下ORMHelper.cs实现细节,如果有兴趣可以下载源码学习;[王清培版权所有,转载请给出署名]

5:

ORMHelper.cs里面只有一个字段和一个只读属性,作用就是用来保存Model首次使用时,保存当前Model中的所有的主键信息;以便下次使用时我好方便的读取;6:

这是本人测试的例子,1.统一数据源封装实现,我们通过IDataSourceTypeFactory工厂获取当前上下问的数据源访问对象,其实我们上面也讲了,IDataSourceType是对数据源访问的封装实现(如:SqlConnection、SqlCommand、SqlParameter)已一个简单的对象呈现使用;

2.通过ORMHelper实现用MODEL插入数据,插入方法是一个泛型方法,大概的实现思路是这样的,我们通过反射读取传进来的Model实例中的各个特性信息,如表名称、列主键等;然后拼接SQL语句,执行,其实增、删、改、查都是同一个道理,在具体的拼接SQL的过程可能稍有不同;本人贴出ORMHelper.cs全部源码,以供大家学习使用;

由于代码编写时的目的是供学习使用,所以在代码上可能存在不足,只要能说明问题就行了;

全部源码:X.CommandLib [王清培版权所有,转载请给出署名]

原文地址:https://www.cnblogs.com/Leo_wl/p/2049471.html