# annie **Repository Path**: lpzahd_admin/annie ## Basic Information - **Project Name**: annie - **Description**: 构建关联关系,声明你想要的结果 - **Primary Language**: Kotlin - **License**: Apache-2.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2022-07-19 - **Last Updated**: 2022-07-26 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # annie ``` 阿梨说这名字好听 ``` #### 介绍 声明你想要的结果 #### #### 软件目标 从CRUD中脱离出来,告诉我你想要什么 **基于spring的申明式关系库** annie为了解决简单关系,简单逻辑问题的库 目前内容仅处理了关系查询方案,需要自行处理主表的查询。且尚未实现任何优化方案 ## Annie的使用演示步骤 ```kotlin 表示例设计: A(var id: Long, var name: String, var bId: Long) B(var id: Long, var name: String) ``` ### 1.引入依赖 > 目前版本:0.0.1-20220726.024401-14 ```gradle implementation("com.yzc.library:annie:version") ``` ###2. 添加切面 ```kotlin @Aspect @Component class AnnotationVoAspect { @Autowired private lateinit var mProcessor: AnnotationVoProcessor @Pointcut("@annotation(com.yzc.library.annie.anno.AnnieMapper)") fun fillRelationVo() { } @AfterReturning(pointcut = "fillRelationVo()", returning = "result") fun afterReturningAdvice(joinPoint: JoinPoint, result: Any?) { mProcessor.processor(joinPoint, result) } } ``` ### 3. Po表中添加注解 > 在A表中的bid上添加注解RelationPoProperty ```kotlin A { @RelationPoProperty(poClz = B::class) var bId: Long = -1L } ``` 说明:RelationPoProperty申明该字段为关系字段,poClz表示关系的po类型 ### 4. Method方法上添加注解 > 在method上添加注解@AnnieMapper ```kotlin @AnnieMapper override fun findByIdNoNull(id: Long): AVo { return repository.findByIdNoNull(id).copyTo() } ``` ### 5. Vo类上添加注解 ```kotlin @MapperVo(poClz = A::class) class AVo { var id: Long = -1L var name: String = "" @MapperVoIdProperty(poClz = B::class) var bId: Long = -1L @MapperVoProperty(poClz = B::class, propertyName = "name") var bName: String = "" } ``` ## Annie相关注解介绍 ### AnnieMapper >用于申明在method上,目前不强联系,可以自己写aspect拦截任意注解, 表明该方法会进入切面 ### RelationPoProperty > 用于申明在po类里的关联id上, 表明该字段属于关联id用,vo映射会基于此进行查找关联关系 ### MapperVo > 用于申明在vo类上, 表明该当前vo主要关联的主表是哪个po ``` poClz: po类型(申明的是当前vo所在的主表对应的po) poName: 表名。与poClz二选一,优先级次之。 如果采用这个方式,可能需要自定义PoFinder subRelationPos: 当前vo下所有关联表(可不写。使用tag设置别名) eg: @MapperVo( poName = "a", subRelationPos = [ MapperVo.SubRelationPo(poName = "b", tag = "b-tag") ] ) class Vo { var id: Long = -1L @MapperVoIdProperty(tag = "b-tag") var bId: Long = -1L @MapperVoProperty(tag = "b-tag", propertyName = "name") var bName: String = "" } ``` ### MapperVoIdProperty > 用于申明在vo类的关联字段上, 表明该当前vo中关联id的字段 ``` poClz: po类型(申明的是当前vo所在的主表对应的po) tag: po别名(在MapperVo上申明的subRelationPos后才有效) relationPoClz: 中间表表名(当关联关系是在中间表中时申明) relationPropertyName: 当前关联id在中间表中映射的字段 convert: 结果转换器(当一些特殊结果可以自行处理,默认类型相同进行赋值) group: 组(当存在多次关联的时候,会以组的方式进行区分赋值) ``` ### MapperVoProperty > 用于申明在vo类中需要查找的字段上 ``` poClz: po类型(申明的是当前vo所在的主表对应的po) tag: po别名(在MapperVo上申明的subRelationPos后才有效) propertyName: 属性名(对应表里的字段名称) relationPoClz: 中间表表名(当关联关系是在中间表中时申明) convert: 结果转换器(当一些特殊结果可以自行处理,默认类型相同进行赋值) group: 组(当存在多次关联的时候,会以组的方式进行区分赋值) ``` ### MapperVoClass > 用于申明在vo类中需要查找的字段上(当前是字段是一个实体类) ``` poClz: po类型(申明的是当前vo所在的主表对应的po) tag: po别名(在MapperVo上申明的subRelationPos后才有效) group: 组(当存在多次关联的时候,会以组的方式进行区分赋值) ``` ### RelationPoVoProperty > 用于声明在vo类的关联字段字段上(与RelationPoProperty类似,是在vo中声明关系。也可以用作临时关系) ``` poClz: po类型(当前关联id字段上所对应的po类型) ``` ### MapperVoPropertyRelated > 用于申明在vo类中需要查找的字段上(与MapperVoProperty类型,反向映射,当前id是存在与关联表中的) ``` poClz: po类型(申明的是当前vo所在的主表对应的po) tag: po别名(在MapperVo上申明的subRelationPos后才有效) relationPropertyName: 关联表中对应的关联字段。形如:xx_id propertyName: 属性名(对应表里的字段名称) ``` ### MapperVoClassRelated > 用于申明在vo类中需要查找的字段上(与MapperVoClass类型,反向映射,当前id是存在与关联表中的) ``` poClz: po类型(申明的是当前vo所在的主表对应的po) tag: po别名(在MapperVo上申明的subRelationPos后才有效) relationPropertyName: 关联表中对应的关联字段。形如:xx_id ``` ##Annie相关自定义接口 ### PoFinder > 通过名称查询对应po类型 (默认使用mybatis-plus方案) 注解中poName受此影响 ### PoManager > 根据id/关联id查询数据接口 (默认使用mybatis-plus方案) ### TypeSupport > 容器类型支持器 (对代理返回vo类型支持的容器类型作自定义支持。默认支持Collection和PageBean) > > 自定义时需要先自定义TypeSupporter ### ValueProcessor > 实体类型赋值的接口 (默认采用Cglib赋值方案) ## Annie用法注意点 1. vo表中id必须得有 (目前还不支持接口实现) 2. 实体类嵌套的时候,子实体类如果有关联关系,需要申明MapperVo。不申明则不处理子表的关联关系 3. 实体类映射暂时不支持字段名称自定义(关联关系允许) 4. 中间表嵌套暂时未实现,仅实现单中间表