DbFieldModel.java 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116
  1. package jnpf.database.model.dbfield;
  2. import jnpf.database.constant.DbAliasConst;
  3. import jnpf.database.datatype.model.DtModel;
  4. import jnpf.database.datatype.model.DtModelDTO;
  5. import jnpf.database.enums.DbAliasEnum;
  6. import jnpf.database.model.dbfield.base.DbFieldModelBase;
  7. import jnpf.database.model.dto.ModelDTO;
  8. import jnpf.database.model.interfaces.JdbcGetMod;
  9. import jnpf.database.source.DbBase;
  10. import jnpf.database.util.DbTypeUtil;
  11. import jnpf.exception.DataException;
  12. import jnpf.util.StringUtil;
  13. import io.swagger.v3.oas.annotations.media.Schema;
  14. import lombok.Data;
  15. import java.sql.ResultSet;
  16. import java.sql.SQLException;
  17. /**
  18. * 表字段模型
  19. *
  20. * @author JNPF开发平台组
  21. * @version V3.1.0
  22. * @copyright 引迈信息技术有限公司
  23. * @date 2021/3/12 15:31
  24. */
  25. @Data
  26. public class DbFieldModel extends DbFieldModelBase implements JdbcGetMod {
  27. /**
  28. * 数据类型传递对象
  29. */
  30. private DtModelDTO dtModelDTO;
  31. /**
  32. * 早期注释叫法
  33. */
  34. public String getFieldName(){
  35. return super.getComment();
  36. }
  37. /**
  38. * 数据类型格式化
  39. * -- 创表
  40. */
  41. public String formatDataTypeByView(String dbEncode) throws Exception {
  42. DtModel dataTypeModel;
  43. try{
  44. // 1、前端指定数据类型转换
  45. if(dtModelDTO == null) dtModelDTO = new DtModelDTO(getDataType(), getLength(), dbEncode, true);
  46. // 2、标准数据类型对象转换
  47. dataTypeModel = dtModelDTO.convert();
  48. }catch (DataException e){
  49. e.printStackTrace();
  50. return getDataType();
  51. }catch (Exception e){
  52. e.printStackTrace();
  53. // 准备异常时,使用默认可执行数据类型
  54. dtModelDTO.setConvertType(DtModelDTO.FIX_VAL);
  55. dataTypeModel = dtModelDTO.convert();
  56. }
  57. return dataTypeModel.formatDataType();
  58. }
  59. @Override
  60. public void setMod(ModelDTO modelDTO) throws SQLException {
  61. ResultSet result = modelDTO.getResultSet();
  62. String dbEncode = modelDTO.getDbEncode();
  63. // 根据不同的库进行字段处理
  64. // ============== 字段数据类型 ===============
  65. this.dataType = result.getString(DbAliasEnum.DATA_TYPE.getAlias(dbEncode));
  66. // ============== 字段类型、长度 ===============
  67. try{
  68. DbTypeUtil.getEncodeDb(dbEncode).setPartFieldModel(this, result);
  69. this.dtModelDTO.setConvertType(DtModelDTO.DB_VAL).setConvertTargetDtEnum(this.dtModelDTO.getDtEnum());
  70. this.setLength(this.dtModelDTO.convert().getFormatLengthStr());
  71. }catch (Exception e){
  72. e.printStackTrace();
  73. }
  74. // ============== 字段名 ===============
  75. if(this.field == null) this.field = result.getString(DbAliasEnum.FIELD.getAlias(dbEncode));
  76. // ============== 字段注释 ===============
  77. if(this.comment == null) this.comment = result.getString(DbAliasEnum.FIELD_COMMENT.getAlias(dbEncode));
  78. // ============== 字段主键(0:非主键、1:主键) ==============
  79. if(this.isPrimaryKey == null) this.isPrimaryKey = DbAliasConst.PRIMARY_KEY.getSign(result.getInt(DbAliasEnum.PRIMARY_KEY.getAlias(dbEncode)));
  80. // ============== 字段允空(0:空值 NULL、1:非空值 NOT NULL) ==============
  81. if(this.nullSign == null) this.nullSign = DbAliasConst.ALLOW_NULL.getSign(result.getInt(DbAliasEnum.ALLOW_NULL.getAlias(dbEncode)));
  82. // ============== 自增(0:非自增 1:自增) ==============
  83. try{
  84. if(this.isAutoIncrement == null && DbBase.MYSQL.equals(dbEncode)){
  85. this.isAutoIncrement = DbAliasConst.AUTO_INCREMENT.getSign(result.getInt(DbAliasEnum.AUTO_INCREMENT.getAlias(dbEncode)));
  86. }
  87. }catch (Exception ignore){}
  88. if(this.isAutoIncrement == null && DbBase.DM.equals(dbEncode)) this.isAutoIncrement = result.getInt(DbAliasEnum.AUTO_INCREMENT.getAlias(dbEncode)) == 1;
  89. if(DbBase.POSTGRE_SQL.equals(dbEncode) || DbBase.KINGBASE_ES.equals(dbEncode)){
  90. String columnDefault = result.getString(DbAliasEnum.COLUMN_DEFAULT.getAlias(dbEncode));
  91. String tableName = result.getString(DbAliasEnum.TABLE_NAME.getAlias(dbEncode));
  92. if(StringUtil.isNotEmpty(columnDefault) && StringUtil.isNotEmpty(tableName) && this.field != null) {
  93. this.isAutoIncrement = ("nextval(\'" + tableName + '_' + this.field + "_seq" + "\'::regclass)").equals(columnDefault);
  94. }
  95. }
  96. if(DbBase.ORACLE.equals(dbEncode)){
  97. if(this.isPrimaryKey){
  98. this.isAutoIncrement = result.getInt(DbAliasEnum.AUTO_TRIGGER.getAlias(dbEncode)) > 0;
  99. }
  100. }
  101. if(this.isAutoIncrement == null && DbBase.SQL_SERVER.equals(dbEncode)) this.isAutoIncrement = result.getInt(DbAliasEnum.IS_IDENTITY.getAlias(dbEncode)) == 1;
  102. }
  103. }