AnylineService
AnylineService用来完成大部分的数据库操作(包括关系型与非关系型),各种场景中如何使用AnylineService:
注意数据库操作中只有查询分区分一行还是多行,多行方法一般会带一个s后缀,返回的是一个集合,但SQL不限制是是否能返回多行,查询单行时如果有多行符合条件,只返回第一行,不会抛出异常
插入或更新时提供对象或集合都是用同样的方法
-
通常情况下WEB项目的BaseController可以继承AnylineController,
AnylineController已经注入的AnylineService可以直接调用
比较简单的业务就不需要单独创建一个service了 -
在其他位置也可以根据需要随时注入
@Autowired
@Qualifier("anyline.service")
protected AnylineService service;
注意在多数据源环境中,除主数据源外其他数据源相关的实例会在spring上下文加载完成后,才加载,
所以如果需要@Lazy方式注入 -
项目的Service可以继承AnylineService
如果有比较复杂的业务或需要事务控制的话需要单独的service -
如果连注入都想省了,可以调用ServiceProxy中的静态方法
参数与AnylineService一致,如:
ServiceProxy.querys("CRM_USER") -
在多数据源的情况下,推荐通过ServiceProxy获取相应的service
AnylineService crmService = ServiceProxy.service("crm")
参考【三种方式切换数据源】
AnylineService提供了以下几种操作数据库的方式
-
service.metadata
可以用来查询数据库结构,包括表(主表、子表)、列、标签、索引、约束,如
service.metadata().tables(); //查询当前数据库中所有的表
service.metadata().ptables("crm_user") //查询指定表的所有子表
service.metadata().columns("crm_user") //查询指定表中的所有列
【源码】【示例】 -
service.ddl
可以用来创建删除修改 表、列、所引等, 如
service.ddl.create(new Table()) ;//创建表
service.ddl.alter(new Column()) ;//修改列属性
详细参数请参考源码或示例
-
service.authorize
授权相关
service.authorize().users(); //查询用户
service.authorize().create(new User()); //创建用户
service.authorize().create(new Role()); //创建角色
service.authorize().grant(new User(), new Role());//用户设置角色 -
service.dml
这是项目中最常用的操作,用来操作数据(insert/update/query/delete/save),其中save就是根据主值来决定insert还是update相当于upsert
因为是最常用的操作所以在调用不需要dml前缀,而是通过service直接调用,如:
DataSet set = service.querys("CRM_USER");其中的查询部分也提供了以下几种方式
-
query/querys
这是dml中最操作的方法,会返回DataRow/DataSet
-
cache/caches
与query/querys类似,不同的是需要多提供一个缓存key的参数,service将根据情况决定查询数据库还是缓存
-
select/selects
用来实现对实体类的操作, 会返回Entity/EntitySet,在调用时需要提供实体类的class,如:
EntitySet<User> users = service.querys(User.class);
-
get/gets
与select类似,也会返回Entity/EntitySet,但并不需要提供class,而是根据AnylineService<E>构造时的泛型来确定返回类型
-
map/maps
在通过情况下querys可以完成大部分操作,但如果遇到数据量特别大的情况下,querys返回DataSet时会比较慢,因为DataSet需要处理各种情况,如大小定忽略,大小驼峰忽略,正则,模拟SQL等
这时需要用到maps返回List<Map>结果,因为这个过程中只是创建了Map/List并没有对数据处理,所以速度会比较快
-
query/querys
- 关于跨库操作与数据源自动复制
- JDBC操作clickhouse示例
- 根据SQL获取元数据信息
- 关于Orcle的MERGE INTO 如果存在重复数据 覆盖或忽略
- 关于分页参数
- MySQL LIMIT OFFSET不支持表达式的问题
- 关于PostgreSQL的ON CONFLICT,如果存在重复数据 覆盖或忽略
- mysql表结构导入postgres
- 关于MySQL的insert ignore into和replace into
- insert/update过程中列的控制
- ConfigStore分页相关的参数
- 获取列信息的几种方式
- 异构数据源迁移核心部分代码Mysql到Apache Ignite|VoltDB
- 自定义是查询条件
- druid连接SQL Server异常
- 不具备更新条件
- 关于分页(不)查询总行数
- 先准备基础环境
- 从最简单的查询开始
- 查询部分列(属性)
- 根据情况生成不同的查询条件(FIND_IN_SET)
- 不提供参数值的两种特殊情况
- 为所有的查询sql统一添加查询条件
- 查询条件默认值
- 分页查询
- 查询排序
- 关于默认的jdbc adapter
- 流式查询
- 关于ands
- 关于默认主键
- service.update(DataRow)只更新值有变化的列
- getColumns与getMetadatas区别
- Entity中的集合(数组)属性保存到数据库中
- Data truncation: Cannot create a JSON value from a string with CHARACTER SET 'binary'
- 属性关联表主键生成器注解
- upsert(已存在则更新或跳过,中不存在则插入)
- 关于Apache ignite的MERGE 如果存在重复数据 覆盖或忽略
- insert/update Map时大小写的问题
- 关于元数据(表结构、索引等)缓存
- sequence
- 删除数据的几种场景
- 插入数据后返回主键值
- 数据脱敏
- 查询、更新、插入时 自动屏蔽不存在的字段
- 设置SQL执行的超时时间
- 如果主键不统一怎么办
- 关于查询结果集单行与多行的问题
- 简易方式指定数据源和主键
- 多数据源场景中service注入失败
- 查询条件中空值的处理方式
- 插入数组
- 插入记录时自动建表
- 关于几个 空值 的查询示例
- 查询返回指定列
- 根据所有String类型模糊查询
- 遇到anyline没解析或极特殊类型怎么处理
- 获取表或视图的DDL
- 查询表上的索引
- 关于列的排序
- DDL保存表结构时,删除列和添加列
- 多个ConfigStore合成一个ConfigStore
- 复杂条件的合成
- 关于函数操作
- condition参数与query参数的混淆
- OR查询条件
- 关于数组参数值
- 关于自定义SQL中的变量赋值
- XML中自定义复杂SQL
- 多数据源事务管理器bean.name
- 插入数组类型
- 插入或修改数据时如何判断插入边还是点
- Neo4j基础操作
- MongoDB基础操作
- AnylineService
- 为什么有时update sql不执行
- 需要清空内容的列没有更新
- 关于必须条件
- 关于IN条件
- 关于默认值
- 关于or
- 关于like
- save与insert区别
- 查询时设置主键
- 前端未提交数据情况下清空一列值
- AnylineService注入失败
- 关于几种OR条件查询的情况
- IN条件下多种参数格式的接收
- 关于分页参数
- 关于自动检测表结构
- 关于更新部分属性(列)、忽略部分属性(列)
- 关于insert或update时确定哪些列参与到insert或update中
- 查询数据库返回的数据字段全是大写,字段怎么设置返回小写
- 几个分页查询的示例
- SQL中的变量及占位符格式
- 统一添加查询条件