数据读取过程

最后更新:2024-12-06 12:39:04 | 状态:未完成
在操作数据时先要确定数据源,根据数据源名称获取到就的service,如
AnylineService service = ServiceProxy.service(“fi”)获取针对fi数据源的service
 
[读取数据的过程]
serivce(接收参数) > dao(统一RunPrepare)  > dataper(语法兼容) > actuator(执行器) > driver(官方驱动) > adapter(类型兼容) > DataReaderFactory > DataReader(类型转换) >DataSet<DataRow>(如果是流式读取则回调handler)
 
service主要用来接入输入参数和分流缓存数据和数据库数据。有缓存的从缓存中读取,没有缓存的数据交给dao 处理
 
dao主要用来封装统一的RunPrepare,因为service为了方便调用提供了大量的重载导致输入参数多种多样,dao这一步会把service参数统一处理。并交给adapter
 
adapter已经绑定了具体的数据源类型,接收到上一步RunPrepare后会根据数据源类型生成适合当前数据库的命令(Run对象)如不同的数据库有不同的分页方式,再把生成的命令交给actuator执行
 
actuator把命令解析成驱动需要的格式,调用驱动返回数据给adapter
 
adapter收到驱动返回的数据后会根据数据类型及数据库类型通过DataReaderFactory获取到相应的DataReader,然后由DataReader将数据处理成Java原生类型或anyline定义类型或项目定义类型,如果没有相应的reader则根据默认的TypeMetadataAlias和StandardTypeMetadata中定义的类型执行转换,最终作到类型已知并统一(实际上在adapter生成查询条件时也会执行这一步用来实现参数类型与列类型匹配)
 
驱动返回的数据分Java原生类型和驱动自定义类型
Java原生类型一般不处理,原样返回
但有特殊情况如Point类型有些数据库会返回byte[]数组,这时一般需要转换成Point对象方便后续操作

驱动自定义类型一般需要执行转换,常见的如Blob,Clob不同的驱动经常返回不同的自定义类型,需要转换成String或byte[]
 
DataReaderFactory分SystemDataReaderFactory和UserDataReaderFactory
SystemDataReaderFactory预定义了不同数据类型之前的转换
在遇到SystemDataReaderFactory中未定义的类型时可以通过UserDataReaderFactory在具体项目中注册新的DataReader
DataReader实现示例
DataReaderFactory.reg(new Object[]{NClobProxyImpl.class }, new DataReader() { //NClobProxyImpl.class指官方驱动返回的数据类型,在遇到这种类型时会调用当前DataReader.read方法
    @Override
    public Object read(Object value) { //Value 是驱动返回的实际数据,在这个方法中把数据转换成实际需要的类型
if(value instanceof NClobProxyImpl){
    try {
        NClobProxyImpl clob = (NClobProxyImpl) value;
        long len = clob.length();
        if (len > 0) {
            return clob.getSubString(0, (int)len);
        }
    }catch (Exception e){
        e.printStackTrace();
    }
}
        return value;
    }
});
 

首页 最近更新 搜索 提交 回复