设计概览

使用之前先看一下大纲,大概明白AnyLine能提供什么再进行下一步
  • AnylineService
    这是最核心的类,可以完成所有的数据库DML操作,使用时一般是这样注入
    @Autowired
    @Qualifier("anyline.service")
    private AnylineService service;
    参考【示例源码

  • AnylineService.ddl
    主要用来创建表(主表/子表)、索引等
    参考【示例源码

  • AnylineService.metadata
    主要用来查询数据库结构、表(主表/子表)结构、列属性
    参考【示例源码

  • ServiceProxy
    这是一个静态方法类,提供了AnylineService/ddl/metadata的所有功能, 使用时直接调用静态访求,不需要注入。
    在静态方法中经常会用到,如Spring启动类中可以直接使用ServiceProxy操作数据库,而不需要注入(注意要在SpringApplication启动之后调用)
    另外并不是每个人都执着于面向对象、设计模式、MVC等,还有许多人就是想简单明了的操作个数据库而已,那就用ServiceProxy

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

  • PageNavi
    分页查询参数封装在PageNavi中,但编码中一般不需要显示的用到,经常是这样实现分页service.querys("表名",condition(true,"TYPE:type","NM:nm%","DEPT:[dept]"))
    condition由AnylineController提供
    生成SQL:SELECT * FROM 表 WHERE TYPE = ? AND NM LIKE '?%' AND DEPT IN(?,?,?)

  • 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.querys(User.class);
    参考【示例源码】【EntitySet说明

  • List/Map
    在大量数据处理的场景中,经常需要一次性处理几十上百万行数据,这时应该用service.maps(),不要用DataSet/DataRow,因为会非常耗时,为什么耗时

关于多数据源切换

  • DataSourceHolder、AnylineService、ServiceProxy都提供了数据源注册及切换的方法 DataSourceHolder.setDataSource("sso");
    如果是固定的数据源可以在配置文件中配置,如果是动态数据源可以在运行时注册示例源码
    String url = "jdbc:mysql://192.168.220.100:3306/simple_sso?useUnicode=true&characterEncoding=UTF8&useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true";
    DataSourceHolder.reg("sso", "com.zaxxer.hikari.HikariDataSource", "com.mysql.cj.jdbc.Driver", url, "root", "root");
  • 注意这里的切换数据源一般是指在同一个方法中来回切换不同的数据源,不要与分库分表混淆。