设计概览
最后更新:2024-08-27 17:29:45
|
状态:未完成
使用之前先看一下大纲,大概明白AnyLine能提供什么再进行下一步
至少需要掌握AnylineService用来完成大部分的数据库操作;以及DataSet/DataRow用来操作查询结果集,如各种数学计算、数据过渡、格式化等。
至少需要掌握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等
参考【示例源码】 -
AnylineService.authorize
授权相关,用来设置用户、角色、权限
-
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说明】
-
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方法即可
参考【流式查询】
关于多数据源切换
- 参考【五种注册数据源】 【三种方式切换数据源】 【动态多数据源切换实现原理】