• jxTMS设计思想之数据访问(一)


    jxTMS是以低成本快速定制为核心诉求的、SaaS模式的二次开发平台:jxTMS简介
    本文是讲述jxTMS平台中数据访问部分是如何设计的,整个系列请访问:jxTMS设计思想

    jxTMS中的ORM

    对于一个二次开发平台,数据访问是最重要、最基本但也是最平常的组成部分了。我们一般用ORM【对象关系映射】来解决该问题,ORM就是数据库中的数据与程序空间中的对象的映射机制。

    jxTMS所实现的ORM是笔者自己开发,因为这可以充分满足jxTMS对数据访问的独特需求。

    从本质上说,ORM就是用java中的反射机制获取了数据类的属性信息【名称与类型】和标记所指定的数据定义【如关系数据表中的主键、索引、长度等】,用这些信息来组装SQL语句,并在读写数据库时完成数据库中的数据类型和属性数据类型的转换。

    所以,在jxTMS中,数据类和普通的类并无任何区别,只是在某些属性上做了ORM的标记,如下面的jxTMS内置数据类people中部分数据属性的定义是:

    @ORM(keyType = KeyType.PrimaryKey)  
    public Long ID;  
      
    @ORM  
    public Date CreateTime;  
      
    @ORM(Index = 1,Length = 126)  
    public String LoginName;  
      
    @ORM(fulltext = true,Length = 126, Assert = "姓名不能为空")  
    public String Name;
    
    ......
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    jxTMS收集了people的ORM标记后,分别组装成create table、insert、update、delete、select等语句然后在不同的场景中加以运用:

    • 热机刷新时,对数据类检测是否在组织私有数据库中存在同名表,如果不存在则调用该数据类所对应的create table自动创建同名的数据表

    • 列表查询、调用jxTMS所提供的各种内部数据读取函数、手段查询时,根据开发者提供的查询条件,动态生成select语句从数据库中读取行数据,并自动将每行数据转换为相应类型的数据对象或json对象

    • 用户程序对数据对象的属性修改后,只要执行update函数,jxTMS会自动生成相应的update语句,将对数据对象属性的修改更新到数据库中

    • 开发者调用orm.create【jxTMS内置数据类】或pyORM.create【用户在data文件中自定义的数据类】,则jxTMS自动创建一个相应数据类的实例对象返回给调用者,并生成一条insert语句将该对象插入数据库中,之后对该对象的修改用update即可

    • jxTMS只对两个内置的数据类tag和Relation提供了删除接口,其它数据类,包括内置数据类和用户自定义的数据类都不允许删除。而tag和Relation只要调用delete函数就可以将该数据对象从数据库中删除了

    相关函数说明请参考:jxTMS在线编程手册之数据访问

    此外,业务开发中经常需要同时处理多个数据对象,所以jxTMS提供的数据库操作接口是基于数据库事务的,一个事件响应函数中所有的数据库修改操作都在一个数据库事务中,如果出现异常,则统一被回滚掉而不会对数据库有任何影响。

    上述people内置类,在数据库中自动创建的people数据表是:

    mysql> desc people;
    +-----------------+--------------+------+-----+---------+-------+
    | Field           | Type         | Null | Key | Default | Extra |
    +-----------------+--------------+------+-----+---------+-------+
    | ID              | bigint(20)   | NO   | PRI | NULL    |       |
    | LoginName       | varchar(126) | NO   | MUL | NULL    |       |
    | CreateTime      | datetime     | NO   |     | NULL    |       |
    | Name            | varchar(126) | NO   | MUL | NULL    |       |
    ......
    +-----------------+--------------+------+-----+---------+-------+
    17 rows in set (0.00 sec)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    相应的建表语句是:

    mysql> show create table people;
    ......
    | people | CREATE TABLE `people` (
      `ID` bigint(20) NOT NULL,
      `LoginName` varchar(126) NOT NULL,
      `CreateTime` datetime NOT NULL,
      `Name` varchar(126) NOT NULL,
      ......,
      PRIMARY KEY (`ID`),
      KEY `index_people_1` (`LoginName`),
      ......
      FULLTEXT KEY `index_people_F2` (`Name`) /*!50100 WITH PARSER `ngram` */ 
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 |
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    如大家所看到的,建表语句中各字段都是NOT NULL,但表描述时各列的缺省值却都是NULL。但大家不要担心,在向表中插入时,所有未赋值的属性,jxTMS会自动以各属性相应数据类型的java缺省值填入。

    凭空捏造一个数据类在python中来用

    jxTMS是二次开发平台,具体的编程是在python中展开的,所以必须在python中也能运用自如才是有价值的。

    而jxTMS中的python环境是用jython运行在jxTMS的java平台之上的,所以jxTMS将ORM的实现用一个类:pyORM进行了封装,然后提供给python环境中使用。其基本的解决思路如下:

    有了基础的ORM实现,jxTMS就可以凭空捏造出一个根本不存在的数据类【用pyORM来伪装】,但其在数据库中有对应的数据表,可以通过上述一样的语句完成对应的数据库操作。

    因为本质上ORM并非依赖于java的反射机制,其本质上就是收集信息来自动组装SQL语句而已。所以只要有了数据表中各字段的名称、数据类型、主键、索引等信息就可以实现数据库操作的自动化。

    而如果有了这样的基础信息,只要我们拦截python对象的set和get操作,就可以在python中模拟出一个同名的数据类,可以和通常的python对象一样使用,最后调用update函数将对该对象的修改更新到数据库中。

    这样一来,开发者只需调用pyORM.create就可以得到一个模拟自己在data文件中定义的数据类的一个实例对象,然后就可以在capa中和使用一般的python对象一样读取、设置该实例对象的属性值了,最后用update函数更新到数据库就好了。

    有了这个凭空手搓数据对象的能力,那我们只要按图索骥,提供一套定义虚拟数据类的语法,就可以让用户在data文件中自己定义数据类了。这些被凭空捏造出来的数据类的使用和jxTMS内置的数据类毫无二致,对开发者来说,并没有任何的区别,只是创建实例对象的方法不同。

    概括一下,用户自定义的数据类的工作机制是:

    • 用户在data文件中定义一个数据类,该数据类既不存在于jxTMS的java平台中,也不存在python空间中

    • 但jxTMS会提供一个对该数据类的模拟:在热机刷新后,创建一个表征该数据类的ORM信息结构,并用此结构中的信息在数据库中创建一个同名的数据表

    • 当开发者调用pyORM.create时,jxTMS就用代表该数据类的信息结构仿真出一个pyORM对象,由其来模拟开发者需要的数据类的一个实例。同时向数据库中插入该实例所对应的数据行

    • 操作完毕,执行update函数时,jxTMS用相应的信息结构自动生成一条update语句,将对该实例的修改更新到数据库中

    由此,在python空间中就得到了一个看起来真实存在的数据类,可以创建该类的实例对象、修改该数据对象的属性、然后调用update函数就可以将这些修改更新到数据库中,还可以从同名数据表中查询数据并转换为本类的数据对象。

    目前jxTMS已经开放个人注册试用,欢迎大家注册试用:

    注册到jxTMS

    下面的系列文章讲述了如何用jxTMS开发一个实用的业务功能:

    如何用jxTMS开发一个功能

    下面的系列文章讲述了jxTMS的一些基本功能:

    jxTMS的HelloWorld

  • 相关阅读:
    自定义MVC增删改查
    支持寄存器模型读写功能的AHB driver实现——导读
    嵌入式系统开发笔记92:感受开源之美
    WPF 视频硬解码渲染播放(无空域)(支持4K、8K、高帧率视频)
    IntelliJ IDEA自定义菜单(Menus)、任务栏(toolbars)详细教程
    GBase8s数据库对 STANDARD 或 RAW 结果表排序
    新手用mac电脑,对文件的疑问和gpt回应
    基于stm32单片机智能交通灯设计Proteus仿真
    dpdk 网卡初始化 —— 收包
    谷粒商城错误总结
  • 原文地址:https://blog.csdn.net/jxandrew/article/details/126243320