3,ORM组件XCode(简介)

    XCode是一个轻量级的ORM组件(对象与关系数据库映射),提供以面向对象的方式操作数据库的功能,能够解决90%以上的数据库操作场景。

    做为X系列组件最重要的一员,XCode秉承了简单实用的特点,力求以最简单的做法,解决最普遍的问题。

XCode最大的“缺点”就是“不支持”多表查询!为何不支持要加双引号?那是因为XCode实际上支持多表查询,只是用起来非常复杂,也不容易讲清楚,会严重影响基本功能的学习理解,所以逢人问到,我都回答不支持!至于缺点二字加双引号,是因为XCode有一整套替代方案,在绝大多数情况上,更优于多表查询。

    说XCode,就不得不提开发模式。每一个ORM组件,都是在某一种开发模式下,才能表现得最出色,XCode也不例外,我们称之为XCode开发模式。当然,每个人有自己的想法,有自己的开发习惯,可以尝试根据自己的习惯去使用XCode,或者稍微修改自己的习惯,也许能有更精彩的用法。

    XCode专注于对象与关系数据库映射,内部明显分为上下两层:

1,下层以DAL作为入口,IDatabase作为接口,各种数据库实现一个类,实现该接口以支持多数据库。DAL的两大代表是Select(查询SQL,返回DataSet)和Execute(执行SQL,返回影响行数),并且以SQL为key,有一级缓存的支持。DAL还支持DbCommand的查询和操作,不过就不受一级缓存的支持了。

image.png

(DAL层结构图)

2,上层以Entity作为泛型基类,所有实体类继承于它。经典的LoadData能够把DataSet或者DataTable转化为实体对象集合,每行记录实例化一个实体对象,每个表字段的值赋值给实体对象的属性。所以,完全可以以别的方式得到DataSet,然后利用LoadData将其转为实体对象集合,而不一定需要DAL。可以得知,XCode支持视图,复杂查询或者多表查询可以通过视图变相解决,不过一般不推荐这么做。增删改查等操作,XCode实际上通过实体类的元数据等信息,动态拼接SQL,然后调用DAL层实现。

image.png

(加载记录集和数据表)

image.png

(执行插入操作,先拼接SQL,再执行)

    此两层结构说明,实际上就是XCode核心原理,任何人都可以根据这个原理来实现自己的ORM。至于结果组件的优劣程度,就看各自的功力以及对细节的考虑了。

XCode的理念是以面向对象为本,所以于本对象有关的东西都写在本对象内。所以XCode是一个充血模型

    所有查询操作(例如Find、FindAll、FindCount)都是静态方法,因为它与具体对象无关;而对象操作(例如Insert、Update、Save、Delete)都是成员方法,因为它与具体对象密切相关,代表着对具体对象的操作。这是XCode模型的基本思想,同样,为实体类编写业务代码的时候,也应该严格遵循该原则,哪些应该是静态的,哪些应该是成员的,要严格分开。

    当然,XCode实体类也支持贫血模型的一些操作方式,只不过操作类还是自身而已,比如Insert、Update、Save、Delete也有静态方法,而参数就是实体类对象。

XCode的模型,还有一个很重要的意义,就是完全满足数据源组件ObjectDataSource的要求,使得XCode实体类可以直接充当数据提供者。

image.png
image.png

(成对出现的FindAll/FindCount,参数完全一摸一样,正是ObjectDataSource的要求)

    本文仅是XCode的一个简介,说明XCode的结构和开发模式,更详细的说明请关注后文。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏技术与生活

设计模式-命令模式

Client:确定具体的命令和接受者; Command:抽象命令接口,一般是接口类或者抽象类 ConcreteCommand:具体的命令执行,调用接受者 Inv...

13950
来自专栏牛客网

后端开发:深入浅出的知识准备体系分享一、计算机网络二、数据库三、操作系统四、算法LINUX语言部分(PHP)项目

博主渣渣本科,挣扎到十一月秋招终于结束了。面过百度/腾讯/小米/网易/搜狗/知乎/京东/360/瓜子。期间总结了一些面试题目,现在放上来。由于是博主自己的面经记...

455140
来自专栏小狼的世界

locale的详细解释

* Thu Sep 27 2001 Bernhard Rosenkraenzer 2.5-0.f.2

9640
来自专栏GIS讲堂

leaflet加载天地图

leaflet是一个轻量级的并且开源的地图框架,是由esri发起的,由于其轻量、简单而被大家喜欢,本文带你学习如何在leaflet中加载天地图。

99930
来自专栏java一日一条

编写可靠 Shell 脚本的 8 个建议

这八个建议,来源于键者几年来编写 shell 脚本的一些经验和教训。事实上开始写的时候还不止这几条,后来思索再三,去掉几条无关痛痒的,最后剩下八条。毫不夸张地说...

13220
来自专栏一枝花算不算浪漫

[Java定时器]用Spring Task实现一个简单的定时器.

56580
来自专栏用户2442861的专栏

Quartz Spring与Spring Task总结

Spring对Quartz作了一个封装,同时,Spring自己也提供了一个任务定时器(spring-task),现把它总结一下。 对于Quartz,我们使...

21510
来自专栏牛客网

2018秋招面经-后端开发

19930
来自专栏牛客网

CVTE后台实习面经笔试:面试:(现场面,面了65分钟,已挂)

笔试: 选择题 1、AVL树相关的,比如高度之类的, 2、gc方面的,我记得有个选项是说调用System.gc()之后会不会同步gc 3、标记清除算法 4、数据...

39170
来自专栏牛客网

2018秋招面经-后端开发

33430

扫码关注云+社区

领取腾讯云代金券