Cache学习(四)创建持久类(实体类)
cache数据库最大的特点是global:
global就像全区变量一样,是一个广义的全局变量。数据库表中的一些重要的字段名以字符串的形式存入global(字段与字段之间用^),配合m语言。根据主索引可以轻易取出想要的字段。数据表的索引全部储存在global中。当然数据库信息也可用sql语句查询得到。详细的品味global,再用global配合m语言操作表的时候,感觉global下封装了类似sql的代码。在java中操作数据库的时候,需要加载驱动器,新建连接,等一系列。反正挺麻烦的。在m语言中只是通过global。而且m语言的中写sql语言也很方便。这是为什么呢。感觉m语言更像操作数据库的语言一样,有的语言是面向对象的。m语言是面向表的。
cache数据库没有外键,每张表都以id作为主键,表与表直接的联系以id做指针。这样让表的结构十分容易理解
csp文件作为view,csp文件中可以写js,也和写m语言。类似java的jsp文件一样
cls文件作为control,一些逻辑性的东西在这里面写。也可以建表,可以在里面写一些方法逻辑。
js文件作为后台cls文件与前台csp文件的交流之用,可以在里面调用cls文件的方法,然后输出前台(在js中调用cls的方法,主要还是js中可以写m语言,用 '#(m语言)#' )
-
创建持久类
在cache中创建持久类,同时能创建表。和其它编程语言对比省去了连接数据库的步骤,也不用单独创建包对数据库进行crud操作。
-
持久类建表相关基础知识
下图为创建学生类的代码:
下图为重新命名数据库的列名:
下图为安排数据库列名排序:
下图为创建索引,创建后要生成索引:
生成索引:
查看索引:
通过加存储,添加字段:
两种查询(storage)的查询方法
点击storage
新建global name
定义数据顺序:
定义数据层级:
表的计数器:记录最大rowid
-
建表过程
创建表 Class User.DHCXueBiaoTable Extends Persistent [ SqlRowIdName = DHC_RowId, SqlTableName = DHC_XueBiaoTable, StorageStrategy = XueBiaoTableStorage ] { Property DHCCode As String [ SqlColumnNumber = 2, SqlFieldName = DHC_Code ]; // 课程代码 // SqlColumnNumber表示行序号从2开始 Property DHCDesc As String [ SqlColumnNumber = 3, SqlFieldName = DHC_Desc ]; // 课程描述 Property DHCDateFrom As Date [ SqlColumnNumber = 4, SqlFieldName = DHC_DateFrom ]; // 开始日期 Property DHCActive As String(DISPLAYLIST = ",Yes,No", MAXLEN = 3, TRUNCATE = 1, VALUELIST = ",Y,N") [ SqlColumnNumber = 5, SqlFieldName = DHC_Active ]; // 课程活动 Property DHCUserDr As User.SSUser [ SqlColumnNumber = 6, SqlFieldName = DHC_User_Dr ]; // 课程老师,相当于外键指向SSUser表
1.我们已经建了一个person类,接下来就是表的存储结构
2.打开Inspector,先输入rowid名字为p_RowID,选class->Storage
3.新建一个Storage,选择CacheSQLStorage,在SqlIdExpression中输入$i(^mdata(“Person”))是\$不是S
意思是设置Rowid为自增,注意StremLocation的写法
4.Caché 以多维数组存储数据,所有数据都是保存Global中。Global以如下形式表示:^名称(下标1,下标2,下标3…)=值
SET ^Y(3,6,7)=”third”
SET ^Y(3,6,8)=”fourth”
SET ^Y(3,6,7,8,4)=”fifth”
SET ^Y(3,6,7,8,9)=”sixth”
Global的树状结构如下:
5.打开SQL storage map建立索引,点击add,选择map type为data,输入global名,一般为类名的大写
6.点击左侧data,选择add添加glabal的三条数据,用“^”隔开
7.点击左侧Subscripts,输入{p_RowID}
8.点击左侧Rowid,输入如图所示
9.这时就建立了一个主索引,通过rowid可以查询表数据
^PERSON(1)=xiaoming^18^man
^PERSON是global名,(1)表示rowid为1,后面的数据位置根据data里的位置排列
10.接下来,我们在建一个索引,在NewStorage1里add一个索引,map type选择index,输入global名
11.Subscripts建立如图所示,这里表示了global的四个层级,第一和第二层级是自己起的名字,方便理解global存储的信息,三四层是具体内容
12.rowid如图所示,是第四层
13.这个以名字建立的索引我们以global来理解
^PERSONi(0,”name”,”xiaoming”,1)=0
索引的特点
可以对一个字段进行索引,也可以对多个字段进行索引
练习1:创建默认storage存储
定义学生表DHCStudentSFC:
选择持久类
输入表名(使用sql查就使用这个表名)
确定字段:St_RowId,St_Code,St_Name,St_Sex_DR(Ct_Sex),St_Dob(Date),其中rowid自动生成。性别St_Sex_DR(Ct_Sex),指向表,指向Ct_Sex。定义变量时变量不能使用下划线。
编译完成生成默认存储:
定义sqlrowid
insert时rowid可以忽略,自动递增
SELECT * FROM DHC_StudentSFC
INSERT INTO DHC_StudentSFC VALUES('2','zhangsan2','2','2120-01-01')
UPDATE DHC_StudentSFC SET St_Name ="lisi" WHERE St_RowId = 2
TRUNCATE TABLE DHC_StudentSFC
查看global存储位置
$lb:将字段里的值放入list中,与字符串不同
继承的类生成索引,添加完执行命令:
/// 对学号创建索引
///d ##class(User.DHCStudentSFC).%BuildIndices()
Index CodeIdx On StCode [ Unique ];
也可以在class中通过向导添加类
练习2:创建sqlstorage存储(CacheSQLStorage)
新建第二个表:
根据向导创建好,添加好类后,不要编译,在storage中右键新建storage
先加map,确认GLOBALName
再在Data中按之前定义的列顺序添加
再添加节点:
如果一个global多个表再用就需要添加额外的节点区分
根据节点值输入rowID,并指明rowid在第几层
定义St_RowId,引用的主键值必须先定义
添加sql表达式,$i:设定自增主键,(变量,数字)数字可缺省
设置rowid开始值,否则查询默认0开始
rowid的0开始,目的是通过$i计数一共有几条数据,0是表的计数器,此时还没有索引,建表步骤完成。
map中添加索引
选择map类型,存储global,选择当population type为nonull,意思是当数据存储为空时不创建索引
索引不需要添加DATA,直接定义节点即可
第二层“code”是为了在global第三层显示字符
(为什么定义节点有了RowId还要添加st_code)应该是根据stcode查询时,索引到最后一层获取rowid,最后根据rowid在global层找到数据
添加RowId
若Global其中已经有了数据,需要在终端中调用命令
d ##class(User.DHCStudentSFCA).%BuildIndices()
为2的是rowid计数器,为空的是新建索引
同理可以创建name索引
也可以创建多个字段的索引
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现