XDataBase

JDBC数据库
授权协议 MIT
开发语言 Java
所属分类 数据库相关、 数据库服务器
软件类型 开源软件
地区 国产
投 递 者 阎雪峰
操作系统 跨平台
开源组织
适用人群 未知
 软件概览

XDataBase(简称为XDB),一个为TDD而生的JDBC数据库。将数据存储于KV中,以便进行JUnit的重复测试。可通过简单的加载DML,DDL,实现一个支持事务,ACID特性,支持Oracle,MySQL内置函数,Function,存储过程,序列,同义词,触发器等的简单数据库。同时也提供将KV持久化为File。

XDB诞生的愿景是因为TDD,在TDD中有大量的单元测试需要运行,但是如果要访问数据库的话,就必须使用事务回滚来解决对数据库持久化的影响。这还不是诞生XDB的最主要原因,最主要原因是来自于基础数据的潜变。当你写好了一个测试案例,但是他依赖于一个用户信息,这个用户信息是被之前初始化进数据库的,当时测试确实能够通过测试用例,但是过一阵子,因为其他原因(其他人或者其他功能没有回滚)导致基础数据被删除或者改变,这样就导致以前能通过的测试用例无法再次运行通过。基于以上原因我们考虑是否应该有一个数据库的底层存储是被TDD的用户操作的呢?为了降低难度,我们是否可以考虑使用KV来存储呢?是否可以存在以下这样的一个测试案例呢?


public void test1(){
    //1.创建KV
    Map table1 = new HashMap();
    //2.绑定注册KV到表
    XDBTookit.bind("TABLE1", table1);
    //3.客户端实体持久操作
    Table1Entry1 entry1 = new Table1Entry1();
    entry1.setId(2);//PK
    entry1.setName("张三");
    entry1.setAge(20);
    entry1.setJob("程序猿");
    //ORM操作
    //MyBatis进行持久,提交事务
    //4.获取KV中的持久数据
    Table1Entry1 persistenceEntry = XDBTookit.getEntry("TABLE1",new Object[]{2}, Table1Entry1.class);
    //5.断言
    Assert.assertEquals(entry1.getName(), persistenceEntry.getName());
    
    //也可以这样
    //4.获取KV中的数据
    String record = table1.get("{id:2}");
    //5.断言
    Assert.assertTrue(record.contains("name:\"张三\""));
}


  • DML
  1. 创建表


CREATE TABLE 表名称
(
   列名称1 数据类型,
   列名称2 数据类型,
   列名称3 数据类型,
   ....
)

在JDBC执行过程中,根据表名称在tableRegister成员中注册。tableRegister实质是一个KV,K为表名称,V为表所对应的Map;tableMetadataRegister成员实质也是一个KV,K为表名称,V为列表,其中为元信息。


  • DCL


  1. 显式提交事务


COMMIT

DML 语句,执行完之后,处理的数据,都会放在回滚段中(除了 SELECT 语句),等待用户进行提交(COMMIT)或者回滚 (ROLLBACK),当用户执行 COMMIT / ROLLBACK后,放在回滚段中的数据就会被删除。XDB中的回滚段UndoLog实际上是一个KV,K为LogId编号。V为KV,与Table对应的KV保持一致。COMMIT执行后,UndoLog中对应的LogId对应数据写入tableRegister中对应表名的KV中。



  • DDL



  1. 数据查询


SELECT 列名称 FROM 表名称 WHERE 真假值表达式 [AND|OR] 真假值表达式
或者
SELECT * FROM 表名称 WHERE 真假值表达式 [AND|OR] 真假值表达式

查询数据,根据表名称获取tableRegister中对应表名的KV,根据真假值表达式中的运算,创建临时视图数据;如果有排序指令,根据字段进行排序算法排序;如果存在分组聚合,则根据分组字段和列名称中的聚合函数创建临时视图。






 相关资料
  • 表元数据 下面这些方法用于获取表信息: 列出数据库的所有表 $this->db->list_tables(); 该方法返回一个包含你当前连接的数据库的所有表名称的数组。例如: $tables = $this->db->list_tables(); foreach ($tables as $table) { echo $table; } 检测表是否存在 $this->db->table_

  • 我的应用程序有两个数据源。第一个数据源使用JdbcTemplate访问Postgre。第二个数据源使用Spring数据JPA访问CockroachDb。 所以我为这个数据源创建了两种配置。 除了具有空间数据的对象之外,坚持使用这两个数据源工作正常。当我试图保存空间数据到CockroachDb,我得到一个错误: Hibernate:选择geoobject0_. id为id1_2_0_,geoobje

  • 6.9.3 Database ItemWriters 虽然文本文件和XML都有自己特定的 ItemWriter, 但数据库和他们并不一样。这是因为事务提供了所需的全部功能。 对于文件来说 ItemWriters 是必要的, 因为如果需要事务特性,他们必须充当这种角色, 跟踪输出的 item,并在适当的时间 flushing/clearing。使用数据库时不需要这个功能,因为写已经包含在事务之中。

  • SQLAlchemy 1.4 / 2.0 Tutorial 此页是 SQLAlchemy 1.4/2.0教程 . 上一页: 处理事务和DBAPI |下一步: |next| 使用数据库元数据 随着引擎和SQL执行的停止,我们准备开始一些炼金术。SQLAlchemy Core和ORM的核心元素是SQL表达式语言,它允许流畅、可组合地构造SQL查询。这些查询的基础是表示数据库概念(如表和列)的Pytho

  • 本文向大家介绍Android 将数据插入数据库,包括了Android 将数据插入数据库的使用技巧和注意事项,需要的朋友参考一下 示例            

  • 我试图从Firebase数据库中读取数据,我已经到处阅读和查找,但我已经走到了死胡同。 这就是我所做的一切。 依赖项: 实现'com.google.firebase: Firebase存储: 9.2.1' 实现'com。谷歌。firebase:firebase数据库:9.2。1' 实现'com。谷歌。firebase:firebase授权:9.2。1' 实现'com。谷歌。火基:火基核心:9.2。

  • 本文向大家介绍node.js从数据库获取数据,包括了node.js从数据库获取数据的使用技巧和注意事项,需要的朋友参考一下 本文需要用node.js做一个从Sqlserver获取数据并显示到页面上的小功能,下面就为大家分享: app.js: 接下来就直接在页面中使用get方式请求即可,当然post方式也是类似原理。 还有我发现textarea控件在改变其text和html属性的时候,value还保

  • 我正在尝试将mysql数据库导入新版本的xampp(v7.1.8)。按下导入按钮后,我收到数百条此错误消息: 请注意.\vendor\phpmyadmin\sql parser\src\UtfString.php#128未初始化字符串偏移量:516 回溯 .\vendor\phpmyadmin\sql parser\src\Lexer.php\823:phpmyadmin\SqlParser\Ut