database-persistence.mdc 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687
  1. ---
  2. description: 数据库持久层架构规范(MyBatis)
  3. globs: src/**/dbdao/**/*.java
  4. alwaysApply: false
  5. ---
  6. # 数据库持久层架构规范
  7. ## 一、目录结构
  8. ```
  9. src/main/java/com/shkpr/service/mcpcenterservice/dbdao/
  10. ├── DBMgrProxy.java # Service单例代理入口
  11. ├── mapper/ # 主数据库访问的 Mapper 定义类
  12. ├── mapper2th/ # 从数据库访问的 Mapper 定义类
  13. ├── mapperLSTM/ # LSTM数据库访问的 Mapper 定义类
  14. ├── providers/ # Mapper 动态 SQL 提供者
  15. ├── tables/ # 表结构/字段定义说明
  16. ├── services/ # DAO Service实现类
  17. │ └── intef/ # DAO Service接口定义类
  18. ├── pgtype/ # PostgreSQL 自定义类型处理
  19. ```
  20. ## 二、核心调用链路
  21. ```
  22. 业务层 (XxxHandler/其他)
  23. DBMgrProxy.getInstance().applyXxxApi(XxxDBService.class)
  24. XxxDBService 继承 BaseDBFuncTemplate
  25. XxxServiceImpl 继承并实现对应的 XxxDBService (@Autowired XxxMapper)
  26. XxxMapper 继承 BaseDBMapper (并通过方法上的注入指定对应的XxxSqlProvider)
  27. XxxSqlProvider 继承 BaseSqlProvider
  28. pgtype (特殊类型处理)
  29. PostgreSQL
  30. ```
  31. ## 三、Table接口规范
  32. - XxxTable接口**必须**定义 `R_INFO` 和 `W_INFO` 两个内部接口
  33. - `R_INFO.TABLE` 用于查询操作(可指向视图或表)
  34. - `W_INFO.TABLE` 用于写入操作(必须是物理表)
  35. - XxxSqlProvider**必须**继承对应的XxxTable接口
  36. ## 四、Mapper规范
  37. ### 4.1 规则
  38. - `BaseDBMapper`接口中定义了数据库可访问的基本方法
  39. - XxxMapper不声明和使用任何实体对象,查询返回记录和插入请求记录只能是`List<Map<String,Object>>`、`Map<String,Object>`等结构
  40. - XxxMapper必须继承`BaseDBMapper`,并实现对应的方法,同时在方法上指定对应的XxxSqlProvider
  41. - XxxMapper可以根据需求扩展`BaseDBMapper`中没有的方法,同时在方法上指定对应的XxxSqlProvider
  42. - XxxSqlProvider必须继承`BaseSqlProvider`
  43. - 复杂动态SQL可在XxxSqlProvider中拼接,**禁止**字符串拼接直接嵌入不可信输入
  44. - 批量操作默认每批200条
  45. ### 4.2 BaseDBMapper中基本方法
  46. | 方法 | 用途 |
  47. |:--------------------|:-----------------|
  48. | `totalCounts()` | 查询统计 |
  49. | `listAllWiths()` | 分页列表查询(支持JOIN优化) |
  50. | `batchQueryWiths()` | 多条件复合查询 |
  51. | `batchQueryIn()` | 多条件IN查询 |
  52. | `getOne()` | 单条查询 |
  53. | `existLine()` | 存在性判断 |
  54. | `insertsWheres()` | 带条件的单条插入 |
  55. | `inserts()` | 单条插入 |
  56. | `batchInserts()` | 多条插入 |
  57. | `updateWiths()` | 条件更新 |
  58. | `insertOrUpdate()` | 插入或更新 |
  59. ## 五、注意事项
  60. 1. 整个dbdao持久层**与实体对象解耦**,不在dbdao持久层的任何地方声明或使用实体对象
  61. 2. **禁止**修改`BaseSqlProvider`中的任意方法
  62. 3. **禁止**在XxxSqlProvider中直接字符串拼接嵌入不可信输入
  63. 4. **禁止**业务层直接`new Mapper`实例
  64. 5. **禁止**业务层直接`@Autowired`注入`Mapper`
  65. 6. **禁止**在Table接口中写业务逻辑