DataRabbit 轻量的数据访问框架(02) -- IOrmAccesser

简介: (完全限定类名:DataRabbit.ORM.IOrmAccesser)      在DataRabbit框架中,通过IOrmAccesser来对数据库进行ORM访问,只要Entity(即ORM中的“O”)的定义与数据库表的结构完全一致,即可使用IOrmAccesser来对其进行ORM操作。
   (完全限定类名:DataRabbit.ORM.IOrmAccesser)   

   在DataRabbit框架中,通过IOrmAccesser来对数据库进行ORM访问,只要Entity(即ORM中的“O”)的定义与数据库表的结构完全一致,即可使用IOrmAccesser来对其进行ORM操作。

1.Entity
   Entity除了包括成员变量与属性(这些变量与属性与数据库表的结构完全一致)外,不需要包含任何其它元素。在轻量的数据访问框架 --序 的例子代码中,我们已经看到了一个Student Entity的示例。

2.Filter
   我们经常需要依据条件来搜索数据,在DataRabbit的ORM框架中,使用Filter来表示一个单独的条件。Filter从ColumnItem继承,ColumnItem 表示数据列及其对应的值。比如,在进行Update操作时,我们可以使用一个ColumnItem 的List来指定要将哪些列的值更新为指定的值。

   首先,注意,Filter中包含一个GetBooleanExpression()方法,该方法将当前Filter转换为一个标准的Sql条件字句。
   Filter的ComparisonOperator属性表明了采用何种比较符来构建条件表达式。
ComparisonOperators
   在IOrmAccesser接口中,很多方法都接受 params Filter[] conditions 或IList<Filter>参数,比如:
        void  Delete(IList < Filter >  conditions);
        
void  Delete( params  Filter[] conditions);
   比如,要删除数据库Student表中所有Age大于20岁且为男性的学生记录
 stuOrmAccesser.Delete( new  Filter(Student._Age,  20 , ComparisonOperators.Greater),  new  Filter(Student._IsBoy,  true , ComparisonOperators.Equal));
   
   针对接受 params Filter[] conditions 或IList<Filter>参数的方法,在OrmAccesser内部将会对每个Filter所表示的单个条件进行“与”操作,来作为搜索条件。那么如果需要对各个Filter进行“或”操作,或进行更复杂的逻辑组合(如“filter1 && (filter2 || filter3)”),就需要采用对应的接受IFilterTree作为参数的重载方法。

3.IFilterTree
   IFilterTree 用于表示多个Filter的逻辑组合。
   
   注意,IFilterTree中也包含一个GetBooleanExpression()方法,该方法将当前Filter通过逻辑组合转换为一个标准的Sql条件字句。
   当前的IFilterTree有两个默认实现:
(1)SimpleFilterTree
   该实现仅仅支持最简单的对多个条件都进行“与”或都进行“或”的逻辑操作,更复杂的逻辑组合需求,可以使用AgileFilterTree。
   如果将上述的例子,改用IFilterTree可以这样实现:
            IList < Filter >  conditions  =   new  List < Filter > ();
            conditions.Add(
new  Filter(Student._Age,  20 , ComparisonOperators.Greater));
            conditions.Add(
new  Filter(Student._IsBoy,  true , ComparisonOperators.Equal));
            IFilterTree conditionTree 
=   new  SimpleFilterTree(LogicType.And, conditions);
         
   stuOrmAccesser.Delete(conditionTree);

(2)AgileFilterTree
   AgileFilterTree 可以表示非常复杂的多个Filter的逻辑组合。它使用一个logicExpression字符串描述逻辑组合表达式,如"filter1 && (filter2 || filter3)",然后解析这个表达式获取正确的Sql条件语句。
   比如,我们要找出所有年龄在20与25岁之间,或者名字为sky的学生:
            IDictionary < string , Filter >  mapping  =   new  Dictionary < string , Filter > ();
            mapping.Add(
" A " new  Filter(Student._Name,  " sky " , ComparisonOperators.Equal));
            mapping.Add(
" B " new  Filter(Student._Age,  20 , ComparisonOperators.Greater));
            mapping.Add(
" C " new  Filter(Student._Age,  25 , ComparisonOperators.Less));
            IFilterTree agileTree 
=   new  AgileFilterTree( " A||(B&&C) " , mapping);

            IList<Student> list = stuOrmAccesser.GetMuch(agileTree);


4.IOrmAccesser的泛型参数
   IOrmAccesser是一个泛型接口,泛型参数是EntityType--即实体的类型,我们知道,每个EntityType对应着数据库中的一个表,Entity class的名字最好与数据表的名字一致,这样IOrmAccesser就可以根据EntityType知道要访问数据库中的哪个表。如果Entity class的名字最好与数据表的名字不一致,也没关系,我们可以通过向IDataAccesser的OrmCoagent属性注入IOrmCoagent来提供EntityType与数据表名称的映射关系。IOrmCoagent接口定义如下:
     public   interface  IOrmCoagent
    {
        
///   <summary>
        
///  GetTableName 根据Entity类型获取对应的数据库表名
        
///   </summary>         
         string  GetTableName(Type entityType);
    }
   IOrmAccesser可以通过IOrmCoagent的GetTableName()方法来获取EntityType所对应的数据库表的名称。

5.基本"CRUD"方法

   IOrmAccesser提供了基本的“CRUD”方法,如Insert,Update,Delete,GetOne,GetMuch,GetDataSet等等。这些方法都提供了多个重载,以接收单个Filter条件或多个Filter以及IFilterTree。
   大多数方法的含义都特别清晰明了,有几个方法的含义需要特别指出一下:
        ///   <summary>
        
///  GetMuchWithoutBlob 根据参数conditions来提取符合条件的所有Entity,但是Entity的blob字段没有被填充。
        
///   </summary>         
        IList < EntityType >  GetMuchWithoutBlob( params  Filter[] conditions);

        
///   <summary>
        
///  LoadBlob 填充entity的Blob字段
        
///   </summary>         
         void  LoadBlob(EntityType entity);
        ///   <summary>
        
///  Update 更新符合conditions的记录中由columnItems指定的各个Column为对应目标值。
        
///   </summary>         
         void  Update(IList < ColumnItem >  columnItems, IList < Filter >  conditions);

        ///   <summary>
        
///  GetDataSet 选取表中符合条件的row,并且只返回columns指定的列。
        
///   </summary>       
        DataSet GetDataSet(IList < Filter >  conditions,  params   string [] columns);

6.基于主外键关系进行Get获取
    IOrmAccesser会自动依据数据表的主外键关系来进行关系加载,比如,Student表中有MentorID字段(外键),对应Mentor表中的主键。那么,IOrmAccesser的GetParent方法,就可以根据指定的Student对象返回Mentor对象。
Mentor mentor  =  stuOrmAccesser.GetParent < Mentor > (student);
基于主外键关系进行Get的方法包括:
         ///   <summary>
        
///  GetParent 依据entity中外键的值,获取主表中的实体。外键建立了"语义"上的"Master-Detail"关系
        
///   </summary>        
        ParentType GetParent < ParentType > (EntityType entity);

        
///   <summary>
        
///  GetForeigner 依据entity中名为fkeyName外键的值,获取主表中的对应实体。外键没有"语义"上的"Master-Detail"关系
        
///   </summary>        
        ForeignerType GetForeigner < ForeignerType > (EntityType entity , string  fkeyName);

        
///   <summary>
        
///  GetChildList 依据entity中主键的值,获取从表中的所有相关实体
        
///   </summary>
        IList < ChildType >  GetChildList < ChildType > (EntityType entity);

        
///   <summary>
        
///  GetChildDataSet 依据entity中主键的值,获取从表中的所有相关记录
        
///   </summary>
        DataSet GetChildDataSet < ChildType > (EntityType entity);
        
#endregion

   本文简单介绍了IOrmAccesser的一些基本功能和使用,在后面的文章中将介绍一些IOrmAccesser高级用法


返回到:轻量的数据访问框架 --序  

 



 
目录
相关文章
|
druid Java 数据库连接
什么是连接池?为什么需要连接池呢?连接池的组成原理又是什么呢?
什么是连接池?为什么需要连接池呢?连接池的组成原理又是什么呢?
1993 0
什么是连接池?为什么需要连接池呢?连接池的组成原理又是什么呢?
|
6月前
|
传感器 监控 物联网
《解锁分布式软总线:构建智能设备统一管理平台》
随着智能设备数量激增,如何有效管理这些设备成为一大挑战。分布式软总线技术应运而生,作为一种创新通信技术,它整合Wi-Fi、蓝牙、NFC等优势,打破设备间连接壁垒,提供统一通信接口,极大降低开发难度。通过设备自发现机制、灵活组网方式及抽象控制模型,分布式软总线实现了设备的统一管理。在智能家居中,用户可一键控制多品牌设备;智能办公场景下,任务可在多设备间无缝流转;工业互联网领域,实时监控与智能调度显著提升生产效率。这一技术为智能化生活和工作提供了强大支撑,推动各行业向数字化、智能化发展。
167 0
|
存储 网络协议 安全
阿里云服务器2核8G、4核16G、8核32G选型参考:经济型、通用算力型和通用型选择参考
2核8G、4核16G、8核32G配置是用户关注度比较高的热门配置,在阿里云服务器的实例规格中,这些配置一般有经济型e、通用算力型u1、通用型g7和通用型g8y等多种实例规格,虽然配置相同,但是这些实例规格之间的性能和价格差别是很大的,因此,我们有必要弄清楚他们之间的差别,这样才能根据自己的需求选择最适合自己的实例。本文将为您详细解析这些实例规格的性能、价格及应用场景,以供参考和选择。
阿里云服务器2核8G、4核16G、8核32G选型参考:经济型、通用算力型和通用型选择参考
|
11月前
|
JSON Java 数据格式
springboot中表字段映射中设置JSON格式字段映射
springboot中表字段映射中设置JSON格式字段映射
438 1
|
Ubuntu Shell
ubuntu追加path环境变量
以上是追加PATH环境变量的方法。不同的方法适用于不同的应用场景,你可以根据自己的需求选择适合的方法。需要注意的是,在对系统文件进行更改时,一定要确保正确无误,避免系统的命令路径出错导致不必要的麻烦。
568 3
ubuntu追加path环境变量
|
机器学习/深度学习 数据挖掘 TensorFlow
从数据小白到AI专家:Python数据分析与TensorFlow/PyTorch深度学习的蜕变之路
【9月更文挑战第10天】从数据新手成长为AI专家,需先掌握Python基础语法,并学会使用NumPy和Pandas进行数据分析。接着,通过Matplotlib和Seaborn实现数据可视化,最后利用TensorFlow或PyTorch探索深度学习。这一过程涉及从数据清洗、可视化到构建神经网络的多个步骤,每一步都需不断实践与学习。借助Python的强大功能及各类库的支持,你能逐步解锁数据的深层价值。
224 0
|
存储 Java Unix
(八)Java网络编程之IO模型篇-内核Select、Poll、Epoll多路复用函数源码深度历险!
select/poll、epoll这些词汇相信诸位都不陌生,因为在Redis/Nginx/Netty等一些高性能技术栈的底层原理中,大家应该都见过它们的身影,接下来重点讲解这块内容。
286 0
|
Java 项目管理 Maven
【揭秘】Maven聚合与继承:如何轻松实现项目依赖管理?
Maven的聚合和继承是Java开发中重要的概念。聚合允许将多个项目组合成一个构建单元,简化多模块项目的构建过程,提高构建效率。继承则让子项目重用父项目的配置和属性,避免了重复定义,增强了项目的一致性和可维护性。通过聚合和继承,Maven为多模块项目的构建和管理提供了高效且灵活的支持,减少了配置冗余,提升了开发效率。
277 0
【揭秘】Maven聚合与继承:如何轻松实现项目依赖管理?
|
存储 编译器 C语言
位域
位域。
70 1