Tern Model层解析

com.tern.db

db对JDBC做了封装,提供了一系列的对数据库的操作。函数提供了链式的操作。db获取app.yml中的配置进行数据库的连接(ConnectionPool类),支持了如MySql、Oracle、Sqlite等多种数据库。查询等获取的数据库的数据以DataTable(返回一张表的数据),或者以DataRow(返回一条数据行的数据)作为对象返回。

com.tern.dao

dao是对db的再一次做的封装,从而满足MVC中的Model层的要求。

1、Model

dao中的核心类之一,实现了数据模型的封装。其定义了数据表名称、所包含的列(属性)的信息(如:列名、列数据类型、约束条件)和与其他模型之间的关系信息。MoodelReader是模型的读取器(抽象类),DefaultModelReader(数据库元数据读取)、YamlModelReader(Yaml文件读取)、DBModelReader(数据库读取)是三个实现。

获取Model的方法

form(String name, Database db)这是一个静态工厂方法,它实际去调用protected声明的构造方法Model(String name, Database h),该构造方法中,首先尝试去从yaml中读取数据模型的schema,若不存在的话才会去数据库中获取schema。构造方法中调用ModelReader的实现类去读取schema,读取columns的信息、caption、title等数据并解析(这些数据都是以键值对的形式作存储,map,方便解析)。
在元数据库中存储了对于Model定义、Model的列/字段定义、Model之间的关系定义、关系中的字段映射关系的数据,分别为iap_entities、iap_columns、iap_relations、iap_relation_map这几张表。

2、Record

抽象意义是一条数据记录。Recrod是一个实现了Map<String, Object>接口的类。每一个Record类的内部都持有该数据记录的model,row即是该Record数据中的所有列的键值对。有这两个内部实例,Record类即可表示所有定义了Model的实际数据库对象。

3、RecordSet

抽象意义是数据记录的集合。其持有数据模型model,还有一个Query类(db提供的数据库查询的工具类)。通过model中的表名称,和Query类,RecordSet可以查询数据库中并返回记录。返回的记录以RecordSet的对象存储。RecordSet定义了很多访问数据库返回数据的方法。

4、Model中的CURD

Model中提供了query(String where, Object[] params)等方法,读取数据库,返回RecordSet数据。其实是调用了RecordSet的方法。
另外Model提供了新增、删除、修改的方法。

总结

com.tern.db的封装是提供一种访问数据库的简便方法,com.tern.dao的封装是提供一种操作模型简便方法。简单来说,在实际开发之中设计好数据库之后,可以先行一步配置好Model,tern平台提供了ide的网页平台将Model录入进元数据库中。这样做的好处是,不用在实际的项目之中再编写entity类,因为模型model已经存在,而且得益于record的抽象。Model可以去数据库读取数据,而返回的数据可以用record的容纳。