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中的变量及占位符格式
统一添加查询条件