设计概览

最后更新:2024-03-12 16:12:57 | 状态:未完成
使用之前先看一下大纲,大概明白AnyLine能提供什么再进行下一步
至少需要掌握AnylineService用来完成大部分的数据库操作;以及DataSet/DataRow用来操作查询结果集,如各种数学计算、数据过渡、格式化等。
  • AnylineService(AnylineService.dml/dql)
    这是最核心的类,可以完成所有的数据库DML/DQL操作,如service.query/insert/update/save/delete/truncate/map/select等
    关于批量操作也使用以上同样的方式,只是在最前面加一个int参数表示批量,一及一次执行多少行命令。
    使用时一般是这样注入
    @Autowired
    @Qualifier("anyline.service")
    private AnylineService service;
    参考【示例源码

  • AnylineService.ddl
    主要用来创建表(主表/子表)、索引以及修改表结构等,如service.ddl().create(Table table);
    参考【示例源码

  • AnylineService.metadata
    主要用来查询数据库结构、表(主表/子表)结构、列属性、索引等,  如service.metadata().tables/columns/procedures等
    参考【示例源码

  • ServiceProxy
    这是一个静态方法类,提供了AnylineService/ddl/metadata的所有功能, 使用时直接调用静态方法,不需要注入。
    在静态方法中经常会用到,如Spring启动类中可以直接使用ServiceProxy操作数据库,而不需要注入(注意要在SpringApplication启动之后调用,也就是需要spring上下文环境加载完成)
    新版本中也经常用来实现切换数据源的效果(实际是在切换service),AnylineService service = ServiceProxy.service("sso") ,这样就可以操作sso数据源

  • AnylineController
    如果是web项目中,经常会用到AnylineController,主要提供了一键封装查询参数(包括分页)的方法condition(),有了condition封装查询参数就不需要各种判断各种遍历了,更不需要计算分页了
    参考【示例源码

  • PageNavi
    分页查询参数封装在PageNavi中,但编码中一般不需要显示的调用,经常是这样实现分页service.querys("表名",condition(true,"TYPE:type","NM:nm%","DEPT:[dept]"))
    condition由AnylineController提供,true表示需要分页(在配置项中设置默认每面10行或者直接换成一个int表示每页多少行),会根据request中提供的参数值计算分页
    生成SQL:SELECT * FROM 表 WHERE TYPE = ? AND NM LIKE '?%' AND DEPT IN(?,?,?) LIMIT 0,9
    参考【分页

  • ConfigStore
    AnylineController.condition封装的查询参数通过ConfigStore返回,ConfigStore一般也不需要显式调用
    但是在一些非web环境下或者参数不是从request中获取的情况下会用到
    new DefaultConfigStore() 或DefaultConfigStore.init()
    在一些低代码等前端用户自定义查询场景中经常需要ConfigStore来可以实现更复杂的查询条件
    参考【ConfigStore说明

AnylineService可以返回三种格式的数据
  • DataSet/DataRow
    这是service.querys/query默认返回的数据结构
    其中提供了几乎所有的数据计算函数,如排序、合计、平均值、维度转换、截取、去重、方差、偏差、交集合集差集、分组、忽略大小写对比、行列转换、类SQL过滤筛选(like,eq,in,less,between...)、JSON、XML格式转换等
    DataRow说明】【DataSet说明】有示例的地方基本上都会用到DataSet/DataRow

  • EntitySet/Entity(自定义的实体类如User)
    如果习惯于实体类操作可以在querys时指定class,如 EntitySet<User> users = service.selects(User.class, 查询条件)参数格式与query一样;
    如果有项目中定义的Service也可以UserService<User> ; EntitySet<User> users = service.selects(查询条件)
    参考【示例源码】【EntitySet说明

  • List/Map
    在大量数据处理的场景中,经常需要一次性处理几十上百万行数据,这时应该用List<Map> maps = service.maps(),
    因为会DataSet/DataRow在实例化和模拟查询数据时,需要处理大小写忽略、正则表达式、动态属性、模拟SQL、检测数据库字段类型、JSON/XML/BLOB格式化、加密解密、各种类型间的转换兼容等问题会非常耗时
    而maps()只是简单的把数据库中的数据封装到List<Map>中没有任务额外的处理,所以会比较快

  • 流式查询
    如果数据量再大,不能一次性返回,需要通过流式查询的方式操作游标。根据不同的需求实现几个StreamHandler接口的read方法即可
    参考【流式查询

关于多数据源切换


最近更新 搜索 提交