JdbcColumnModel.java 7.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235
  1. package jnpf.database.model.dbfield;
  2. import jnpf.database.constant.DbAliasConst;
  3. import jnpf.database.constant.RsColumnKeyConst;
  4. import jnpf.database.datatype.db.interfaces.DtInterface;
  5. import jnpf.database.datatype.model.DtModelDTO;
  6. import jnpf.database.model.dbfield.base.DbFieldModelBase;
  7. import jnpf.database.source.DbBase;
  8. import jnpf.database.util.DbTypeUtil;
  9. import lombok.Cleanup;
  10. import io.swagger.v3.oas.annotations.media.Schema;
  11. import lombok.Data;
  12. import lombok.NoArgsConstructor;
  13. import java.sql.*;
  14. import java.util.ArrayList;
  15. import java.util.List;
  16. /**
  17. * JDBC元数据表模型类型
  18. *
  19. * @author JNPF开发平台组 YanYu
  20. * @version V3.2.0
  21. * @copyright 引迈信息技术有限公司
  22. * @date 2021/10/06
  23. */
  24. @Data
  25. @NoArgsConstructor
  26. public class JdbcColumnModel extends DbFieldModelBase {
  27. /**
  28. * 字段别名
  29. */
  30. private String label;
  31. /**
  32. * 字段类型jdbc编码
  33. */
  34. private Integer dtJdbcEncode;
  35. /**
  36. * 字段值
  37. */
  38. private Object value;
  39. /**
  40. * 默认值
  41. */
  42. protected String defaultValue;
  43. /**
  44. * 所属表名
  45. */
  46. private String table;
  47. /**
  48. * 字段长度
  49. */
  50. private String size;
  51. /**
  52. * 字符长度
  53. * (charLength)
  54. */
  55. private Long columnSize;
  56. /**
  57. * 标度
  58. * (precision)
  59. */
  60. private Integer numPrecRadix;
  61. /**
  62. * 精度
  63. * (scale)
  64. */
  65. private Integer decimalDigits;
  66. /**
  67. * 字段位置
  68. */
  69. private String ordinalPosition;
  70. /**
  71. * 自增
  72. */
  73. private String autoIncrement;
  74. /**
  75. * java对应数据类型
  76. */
  77. private String javaDataType;
  78. /* ================== 内部方法 ================= */
  79. /**
  80. * 字段结构
  81. */
  82. public DbFieldModel convertDbFieldModel(String dbEncode) throws Exception {
  83. DbFieldModel dbFieldModel = new DbFieldModel();
  84. dbFieldModel.setField(getField());
  85. dbFieldModel.setComment(getComment());
  86. dbFieldModel.setDataType(getDataType());
  87. dbFieldModel.setIsPrimaryKey(getIsPrimaryKey());
  88. dbFieldModel.setIsAutoIncrement(convertIsAutoIncrement(dbEncode, getAutoIncrement()));
  89. dbFieldModel.setNullSign(getNullSign());
  90. dbFieldModel.setDefaultValue(getDefaultValue());
  91. DtInterface dtEnum = DtInterface.newInstanceByDt(getDataType(), dbEncode);
  92. assert dtEnum != null;
  93. dbFieldModel.setDtModelDTO(new DtModelDTO(dtEnum, this.columnSize, Integer.parseInt(this.columnSize.toString()), this.decimalDigits));
  94. return dbFieldModel;
  95. }
  96. /**
  97. * 自增判断
  98. */
  99. private static Boolean convertIsAutoIncrement(String dbEncode, String sign){
  100. switch (dbEncode){
  101. case DbBase.MYSQL:
  102. return sign.equalsIgnoreCase("YES");
  103. case DbBase.ORACLE:
  104. case DbBase.SQL_SERVER:
  105. case DbBase.KINGBASE_ES:
  106. case DbBase.DM:
  107. case DbBase.POSTGRE_SQL:
  108. // TODO 等待补充
  109. default:
  110. return false;
  111. }
  112. }
  113. /* ================== 静态方法 ================= */
  114. /**
  115. * 获取字段元数据对象集合(所有字段)
  116. * 注意:只能获取结构,无法获取值
  117. * @param conn 数据连接
  118. * @param table 表名
  119. * @return ignore
  120. * @throws SQLException ignore
  121. */
  122. public static List<JdbcColumnModel> getList(Connection conn, String table, List<String> primaryFields) throws Exception {
  123. @Cleanup ResultSet rs = getColumnMetaDateRs(conn, table);
  124. List<JdbcColumnModel> list = new ArrayList<>();
  125. while (rs.next()) {
  126. JdbcColumnModel column = new JdbcColumnModel();
  127. // 表名
  128. column.setTable(rs.getString(RsColumnKeyConst.TABLE_NAME));
  129. // 列名称:
  130. column.setField(rs.getString(RsColumnKeyConst.COLUMN_NAME));
  131. // java.sql.Types
  132. column.setJavaDataType(rs.getString(RsColumnKeyConst.DATA_TYPE));
  133. // 字段类型:
  134. column.setDataType(rs.getString(RsColumnKeyConst.TYPE_NAME));
  135. // 列的大小(标度):当字符类型表示CharLength,数字类型表示Precision
  136. column.setColumnSize(rs.getLong(RsColumnKeyConst.COLUMN_SIZE));
  137. // 小数部分的位数(精度):
  138. column.setDecimalDigits(rs.getInt(RsColumnKeyConst.DECIMAL_DIGITS));
  139. // 描述列的注释:
  140. column.setComment(rs.getString(RsColumnKeyConst.REMARKS));
  141. // 该列的默认值:
  142. column.setDefaultValue(rs.getString(RsColumnKeyConst.COLUMN_DEF));
  143. // 列中的最大字节数:
  144. column.setLength(rs.getString(RsColumnKeyConst.CHAR_OCTET_LENGTH));
  145. // 列的索引:
  146. column.setOrdinalPosition(rs.getString(RsColumnKeyConst.ORDINAL_POSITION));
  147. // 是否允许使用 NULL:
  148. String isNull = rs.getString(RsColumnKeyConst.IS_NULLABLE);
  149. column.setNullSign(isNull.equalsIgnoreCase("YES") ? DbAliasConst.NULL : DbAliasConst.NOT_NULL);
  150. // 指示此列是否自动增加:(部分数据库不支持)
  151. try{ column.setAutoIncrement(rs.getString(RsColumnKeyConst.IS_AUTOINCREMENT));
  152. }catch (Exception ignore){}
  153. // 是否是主键主键
  154. column.setIsPrimaryKey(primaryFields.stream().anyMatch( o -> o.equalsIgnoreCase(column.getField())));
  155. list.add(column);
  156. }
  157. return list;
  158. }
  159. /**
  160. * 获取字段值相对元数据结果集
  161. * @param rs 结果集
  162. * @param isLowercase 别名大小写
  163. * @param isValue 是否取值
  164. * @return 字段集合
  165. * @throws SQLException ignore
  166. */
  167. public static List<JdbcColumnModel> getList(ResultSet rs, Boolean isLowercase, Boolean isValue) throws SQLException {
  168. ResultSetMetaData md = rs.getMetaData();
  169. List<JdbcColumnModel> dbColumnModelList = new ArrayList<>();
  170. for (int i = 1; i <= md.getColumnCount(); i++) {
  171. JdbcColumnModel model = new JdbcColumnModel();
  172. model.setTable(md.getTableName(i));
  173. model.setField(md.getColumnName(i));
  174. // 非空判断
  175. model.setNullSign(md.isNullable(i) == 1 ? DbAliasConst.NULL : DbAliasConst.NOT_NULL);
  176. model.setLabel(isLowercase ? md.getColumnLabel(i).toLowerCase() : md.getColumnLabel(i));
  177. model.setDataType(md.getColumnTypeName(i));
  178. model.setValue(isValue ? rs.getObject(i) : null);
  179. dbColumnModelList.add(model);
  180. }
  181. return dbColumnModelList;
  182. }
  183. public void getOracle(){
  184. }
  185. /* ================================== 结果集 ================================== */
  186. /**
  187. * 从conn中获取数据库的表元数据
  188. * @param conn 数据连接
  189. * @return 返回表元数据
  190. * @throws SQLException ignore
  191. */
  192. public static ResultSet getColumnMetaDateRs(Connection conn, String table) throws Exception {
  193. DatabaseMetaData dbMetaData = conn.getMetaData();
  194. /* % 代表 * ,
  195. ResultSet rs = dbMetaData.getColumns(conn.getCatalog(), "%", table, "%"); */
  196. switch (DbTypeUtil.getDb(conn).getJnpfDbEncode()){
  197. case DbBase.SQL_SERVER:
  198. return dbMetaData.getColumns(conn.getCatalog(), "dbo",table , null);
  199. case DbBase.POSTGRE_SQL:
  200. return dbMetaData.getColumns(conn.getCatalog(), "public",table , null);
  201. case DbBase.KINGBASE_ES:
  202. return dbMetaData.getColumns(conn.getCatalog(), conn.getSchema(),table , null);
  203. case DbBase.MYSQL:
  204. default:
  205. return dbMetaData.getColumns(conn.getCatalog(), dbMetaData.getUserName(), table, null);
  206. }
  207. }
  208. }