数据库-Auto注解
#
AUTO注解服务类如果继承自框架的ModeService类,在方法上加上@Auto注解,确定好方法的返回数据类型,无需编写代码,方法体代码将在运行时自动完成编码。 返回值的设计以最大努力达成目标的理念来返回结果,只要返回值的类型符合约定情形,系统都将按要求返回结果。
- 返回类型
返回值的设计以最大努力达成目标的理念来返回结果,支持数据集向下拆解兼容,例如返回结果集是多行记录,如果方法返回值设定为List<Map<String, Object>>或List<Record>等多行数据容器,那么就会返回全部数据,如果方法返回值设定为Map<String, Object>或者Record等单行数据容器就会返回记录集的第一行,如果方法返回值设定为List<String>、String[],那么就会返回记录集的第一列,如果方法返回值设定为简单类型如String,那么就会返回记录集的第一行的第一列。
- 取普通单一返回值时,可以是和字段匹配的简单类型或者可转化的简单类型,例如返回int的结果,可以定义方法返回int、long或String,因为int可以转化为long和String。
- 取单条记录可选返回类型有Record、Map<String, Object>和表对应的模型类型。
- 取多行记录可选返回类型有List<Record>、List<Map<String, Object>>、List<模型>、Record[]、模型[]。
- 取多行记录的第一列集合时返回类型可以是List<字段类型匹配的或可转化的简单类型>、Set<字段类型匹配的或可转化的简单类型>去重、数组,例如List<String>可以兼容各种列集合,因为其他类型都可以转换为String。
- 多行记录二次分组,对已经从数据库查询出的结果集合进行分组,通过@Auto注解的groupColumn参数设置分组字段,支持返回类型有Map<String, List<Record>>、Map<String, List<Map<String, Object>>>、Map<String, List<模型>>。
- 多行记录二次排序,对已经从数据库查询出的结果集合进行排序,通过@Auto注解的sortColumn参数设置二次排序字段,sortBy参数设置二次排序顺序。
- 多行记录二次去重,对已经从数据库查询出的结果集合进行去重,通过@Auto注解的groupColumn参数设置去重字段,支持返回类型有Set<Record>、Set<Map<String, Object>>、Set<模型>、
#
魔术方法方法名以get/update/delete开头,且符合以下特征时,AUTO注解自动完成业务代码。需要注意的是,代码针对的是当前ModeService实例对应的模型和表。
- get系列方法,数量不定,按需取用
get系列方法覆盖了各类常用的单表操作模型,使用规则如下:
- 当方法名get后面跟随的是All/First/TopN(N为数字)/Count/Max/Sum/Min/Avg等关键字时,将自动完成字面意义的代码。 All表示全部记录,First表示第一条记录,TopN表示最前面的N条记录,Count表示记录集数量统计,Max表示求记录集中的最大值,Sum表示求记录集的累加和,Min表示求记录集中的最小值,Avg表示求记录集合的平均值。
- 如果需要增加进一步约束条件,支持在方法名后继续通过ByX(X为表字段名)关键字增加一个条件,但仅限一个条件。另外还可以进一步通过OrderByX(X为表字段名)关键字对结果集合进行排序。注意关键字和字段名首字母需要大写,其他字母小写,如果表字段名是包含有下划线的命名方式,直接转驼峰名即可,即下划线去掉,下划线后的单词首字母大写。且表字段名不能包含有By/OrderBy/GroupBy等会产生冲突的关键字。约束条件目前只支持默认的等于条件,后续将支持更多其他类型的条件。
- 针对Count/Max/Sum/Min/Avg还进一步支持在方法名后继续通过GroupByX(X为表字段名)分组统计。常规查询的GroupBy有另外的实现方式(二次分组,或者后面通过自定义SQL实现),所以GroupByX(X为表字段名)加在常规查询方法后面会被忽略。
- 如果get(All/First/TopN)后面跟有ByX(X为表字段名),那么需要方法提供一个入参,对应该字段,作为查询条件入参。入参必须是和字段匹配的简单类型,也支持用数组和List包装多个入参。
- 结果集排序支持2种方式,方法名中的OrderBy为数据库SQL层排序,即全表排序,注解中指定sortColumn,sortBy是对结果集合的二次排序,属于局部数据排序。
- update系列方法
update目前只支持一种形式:updateByField(value, fieldMap),Field为更新条件字段名;value对应Field字段,为条件的值;fieldMap是更新内容,为Map<String, Object>类型,对应于Map<字段名, 值>;返回值为int;
- delete系列方法
delete目前只支持一种形式:deleteByField(value),Field为删除条件字段名;value对应Field字段,为条件的值;返回值为int;
#
SQL/SQL模版@Auto注解在没有设置value时,按魔术方法规则对方法名进行判断,一旦设置了value就会失去魔术方法名规则。value可以是对应于SQL模版中的sqlId,也可以是直接的SQL语句,区别仅仅是Sql的存放位置。当用@Auto注解时,SQL语句中的表名可以用_TABLE_
代替当前表名,这样无须担心将来修改表名后需要大量修改SQL的问题。
@Auto注解对SQL语句中的参数占位符 "?" 进行了增强,支持 IN ( ? )、Where ? 、Order By ? 、Group By ? 等工作模式。需要注意的是,通过@Auto注解读取SQL模版文件中的SQL时,不支持#param(0)、#param("name")方式的参数,只支持 "?" 占位符。
@Auto注解的SQL模版方式和上面的非模版方式差别较小,仅仅只是SQL的获取方式不同,其他都一样,这里不再进行更多演示。以上只列举部分重点内容,后续逐步完善更多具体的文档,并对重点内容进行专题描述。