SqlFrameBase.java 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145
  1. package jnpf.database.sql.enums.base;
  2. import jnpf.database.model.dto.PrepSqlDTO;
  3. import jnpf.database.model.entity.DbLinkEntity;
  4. import jnpf.database.model.interfaces.DbSourceOrDbLink;
  5. import jnpf.database.source.DbBase;
  6. import jnpf.database.sql.model.DbStruct;
  7. import jnpf.database.sql.util.SqlFrameUtil;
  8. import jnpf.database.util.DbTypeUtil;
  9. import jnpf.database.util.TenantDataSourceUtil;
  10. import jnpf.exception.DataException;
  11. import jnpf.util.StringUtil;
  12. import java.util.*;
  13. /**
  14. * 类功能
  15. *
  16. * @author JNPF开发平台组 YanYu
  17. * @version V3.2.0
  18. * @copyright 引迈信息技术有限公司
  19. * @date 2022/3/16
  20. */
  21. public interface SqlFrameBase {
  22. /**
  23. * 获取SQL框架
  24. * @return ignore
  25. */
  26. String getSqlFrame();
  27. /**
  28. * 获取数据库编码
  29. * @return ignore
  30. */
  31. String getDbEncode();
  32. /**
  33. * 获取枚举名
  34. * @return ignore
  35. */
  36. String name();
  37. /**
  38. * 设置结构性参数
  39. * @param table 表
  40. * @param dbStruct 结构模型
  41. * @param list 参数
  42. */
  43. default void setStructParams(String table, DbStruct dbStruct, List<String> list){}
  44. /**
  45. * 获取数据库结构性参数
  46. * @param table 表
  47. * @return 结构参数
  48. */
  49. default PrepSqlDTO getPrepSqlDto(DbSourceOrDbLink dataSourceMod, String table){
  50. List<String> list = new ArrayList<>();
  51. TenantDataSourceUtil.initDataSourceTenantDbName(dataSourceMod);
  52. setStructParams(table, dataSourceMod.getDbStruct(), list);
  53. return new PrepSqlDTO(getSqlFrame(), list).withConn((DbLinkEntity) dataSourceMod);
  54. }
  55. /**
  56. * 自动获取数据库SQL框架处理
  57. * 下标(在SQL框架枚举里面找对应关系)
  58. * @param params 参数集
  59. * @return ignore
  60. */
  61. default String getOutSql(String... params) throws DataException {
  62. return getOutSqlByDb(null, params);
  63. }
  64. /**
  65. * 指定数据库SQL框架处理
  66. * @param params SQL参数
  67. * @return SQL语句
  68. * @throws DataException 枚举使用限制
  69. */
  70. default String getOutSqlByDb(String dbEncode, String... params) throws DataException {
  71. SqlComEnum sqlComEnum = null;
  72. SqlFrameBase sqlFrameBase = null;
  73. /* 确定SQL框架枚举 */
  74. // 第一种:未明确引用枚举,提供数据库类型
  75. DbBase dbBase;
  76. try{
  77. dbBase = DbTypeUtil.getEncodeDb(dbEncode);
  78. }catch (Exception e){
  79. dbBase = null;
  80. }
  81. if(this instanceof SqlComEnum){
  82. sqlComEnum = ((SqlComEnum)this);
  83. if(dbBase != null){
  84. sqlFrameBase = sqlComEnum.getSqlFrameEnum(dbEncode);
  85. }
  86. if(sqlFrameBase == null){
  87. sqlFrameBase = sqlComEnum.getBaseSqlEnum();
  88. }
  89. // 第二种:明确引用枚举
  90. }else if(dbBase == null){
  91. for (SqlComEnum conEnum : SqlComEnum.values()) {
  92. sqlFrameBase = conEnum.getSqlFrameEnum(this);
  93. if(sqlFrameBase != null){
  94. sqlComEnum = conEnum;
  95. break;
  96. }
  97. }
  98. // 当引用枚举明确指出时,不允许引用其他枚举
  99. if(sqlFrameBase == null){throw new DataException("此枚举SQL框架未被引用");}
  100. // 第三种:明确引用枚举,提供数据库类型(冲突)
  101. }else {
  102. throw new DataException("请使用SqlComEnum来做引用");
  103. }
  104. return SqlFrameUtil.outSqlCommon(sqlFrameBase, sqlComEnum.getFrameParamList(), params);
  105. }
  106. /**
  107. * SQL框架的一些各自的特殊处理
  108. * @param sqlFrame SQL框架
  109. * @param paramsMap 对应提供参数集合
  110. * @return SQL语句
  111. */
  112. default String createIncrement(String sqlFrame, Map<String, String> paramsMap){
  113. if (StringUtil.isNotEmpty(paramsMap.get("[AUTO_INCREMENT]"))){
  114. // 当自增时,字段非空且不需要默认值
  115. sqlFrame = sqlFrame
  116. .replace("[[NOT] [NULL]]", "")
  117. .replace("[<DEFAULT> {defaultValue}]", "");
  118. }
  119. return sqlFrame;
  120. }
  121. default String createPrimaryKeys(String sqlFrame, Map<String, String> paramsMap){
  122. String primaryStr = "";
  123. if (StringUtil.isNotEmpty(paramsMap.get("{primarykeys}"))){
  124. primaryStr = "\n, PRIMARY KEY (" + paramsMap.get("{primarykeys}") + ")";
  125. }
  126. return sqlFrame.replace("{primarykeys}", primaryStr);
  127. }
  128. default String createIndex(){
  129. return "";
  130. }
  131. }