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索引

也可以创建多个字段的索引

 

posted @   HY10-SALTEST-FISH  阅读(593)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示