设计概览
使用之前先看一下大纲,大概明白AnyLine能提供什么再进行下一步
至少需要掌握AnylineService用来完成大部分的数据库操作;以及DataSet/DataRow用来操作查询结果集,如各种数学计算、数据过渡、格式化等。
至少需要掌握AnylineService用来完成大部分的数据库操作;以及DataSet/DataRow用来操作查询结果集,如各种数学计算、数据过渡、格式化等。
-
AnylineService(AnylineService.dml)
这是最核心的类,可以完成所有的数据库DML操作,使用时一般是这样注入
@Autowired
@Qualifier("anyline.service")
private AnylineService service;
参考【示例源码】
-
AnylineService.ddl
主要用来创建表(主表/子表)、索引以及修改表结构等
参考【示例源码】
-
AnylineService.metadata
主要用来查询数据库结构、表(主表/子表)结构、列属性、索引等
参考【示例源码】
-
ServiceProxy
这是一个静态方法类,提供了AnylineService/ddl/metadata的所有功能, 使用时直接调用静态方法,不需要注入。
在静态方法中经常会用到,如Spring启动类中可以直接使用ServiceProxy操作数据库,而不需要注入(注意要在SpringApplication启动之后调用,也就是需要spring上下文环境加载完成)
另外并不是每个人都执着于面向对象、设计模式、MVC等,还有许多人就是想简单明了的操作个数据库而已,那就用ServiceProxy
-
AnylineController
如果是web项目中,经常会用到AnylineController,主要提供了一键封装查询参数(包括分页)的方法condition(),有了condition封装查询参数就不需要各种判断各种遍历了,更不需要计算分页了
参考【示例源码】
-
PageNavi
分页查询参数封装在PageNavi中,但编码中一般不需要显示的调用,经常是这样实现分页service.querys("表名",condition(true,"TYPE:type","NM:nm%","DEPT:[dept]"))
condition由AnylineController提供,true表示需要分页,会根据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一样);
参考【示例源码】【EntitySet说明】
-
List/Map
在大量数据处理的场景中,经常需要一次性处理几十上百万行数据,这时应该用List<Map> maps = service.maps(),
因为会DataSet/DataRow在实例化和模拟查询数据时,需要处理大小写忽略、正则表达式、动态属性、模拟SQL、检测数据库字段类型、JSON/XML/BLOB格式化、加密解密、各种类型间的转换兼容等问题会非常耗时
而maps()只是简单的把数据库中的数据封装到List<Map>中没有任务额外的处理,所以会比较快
关于多数据源切换
- 参考【三种注册数据源】 【三种方式切换数据源】 【动态多数据源切换实现原理】