XDataBase(简称为XDB),一个为TDD而生的JDBC数据库。将数据存储于KV中,以便进行JUnit的重复测试。可通过简单的加载DML,DDL,实现一个支持事务,ACID特性,支持Oracle,MySQL内置函数,Function,存储过程,序列,同义词,触发器等的简单数据库。同时也提供将KV持久化为File。
XDB诞生的愿景是因为TDD,在TDD中有大量的单元测试需要运行,但是如果要访问数据库的话,就必须使用事务回滚来解决对数据库持久化的影响。这还不是诞生XDB的最主要原因,最主要原因是来自于基础数据的潜变。当你写好了一个测试案例,但是他依赖于一个用户信息,这个用户信息是被之前初始化进数据库的,当时测试确实能够通过测试用例,但是过一阵子,因为其他原因(其他人或者其他功能没有回滚)导致基础数据被删除或者改变,这样就导致以前能通过的测试用例无法再次运行通过。基于以上原因我们考虑是否应该有一个数据库的底层存储是被TDD的用户操作的呢?为了降低难度,我们是否可以考虑使用KV来存储呢?是否可以存在以下这样的一个测试案例呢?
publicvoidtest1(){//1.创建KVMaptable1=newHashMap();//2.绑定注册KV到表XDBTookit.bind("TABLE1",table1);//3.客户端实体持久操作Table1Entry1entry1=newTable1Entry1();entry1.setId(2);//PKentry1.setName("张三");entry1.setAge(20);entry1.setJob("程序猿");//ORM操作//MyBatis进行持久,提交事务//4.获取KV中的持久数据Table1Entry1persistenceEntry=XDBTookit.getEntry("TABLE1",newObject[]{2},Table1Entry1.class);//5.断言Assert.assertEquals(entry1.getName(),persistenceEntry.getName());//也可以这样//4.获取KV中的数据Stringrecord=table1.get("{id:2}");//5.断言Assert.assertTrue(record.contains("name:\"张三\""));}DML创建表CREATETABLE表名称(列名称1数据类型,列名称2数据类型,列名称3数据类型,....)在JDBC执行过程中,根据表名称在tableRegister成员中注册。tableRegister实质是一个KV,K为表名称,V为表所对应的Map;tableMetadataRegister成员实质也是一个KV,K为表名称,V为列表,其中为元信息。
DCL显式提交事务COMMITDML语句,执行完之后,处理的数据,都会放在回滚段中(除了SELECT语句),等待用户进行提交(COMMIT)或者回滚(ROLLBACK),当用户执行COMMIT/ROLLBACK后,放在回滚段中的数据就会被删除。XDB中的回滚段UndoLog实际上是一个KV,K为LogId编号。V为KV,与Table对应的KV保持一致。COMMIT执行后,UndoLog中对应的LogId对应数据写入tableRegister中对应表名的KV中。
DDL数据查询SELECT列名称FROM表名称WHERE真假值表达式[AND|OR]真假值表达式或者SELECT*FROM表名称WHERE真假值表达式[AND|OR]真假值表达式查询数据,根据表名称获取tableRegister中对应表名的KV,根据真假值表达式中的运算,创建临时视图数据;如果有排序指令,根据字段进行排序算法排序;如果存在分组聚合,则根据分组字段和列名称中的聚合函数创建临时视图。
评论