数据字典

  • 开发中,往往需要将数据库中的表结构数据展示到页面管理,这个存储数据库中所有表结构信息的表称为数据字典。

数据字典设计

  • 第一种:较为复杂,作为所有数据库表的元数据,程序中的业务表并不实际存在,所有的业务表结构皆存在于数据字典中,需要使用到业务表时,从数据字典中获取表结构。这种设计对于开发人员要求较高,整体业务逻辑更为抽象。

  • 第二种:较为简单,仅作为展示用,并不具备实际业务功能,便于管理数据库表格信息。程序中的业务表皆是实际存在的,数据字典仅存储这些业务表格的结构,作为展示。

  • 此处简单测试系统,甚至不做存储,每次访问都可以直接扫描数据库所有业务表的结构进行展示。

数据字典开发

  • information_schema 数据库跟 performance_schema 一样,都是 MySQL 自带的信息数据库。
  • 其中 performance_schema 用于性能分析,而 information_schema 用于存储数据库元数据(关于数据的数据),例如数据库名、表名、列的数据类型、访问权限等。
  • information_schema 中的表实际上是视图,而不是基本表,因此,文件系统上没有与之相关的文件。

information_schema

  • 查询数据库的信息

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    mysql> use information_schema;
    Database changed

    mysql> show tables;
    +---------------------------------------+
    | Tables_in_information_schema |
    +---------------------------------------+
    | CHARACTER_SETS |
    | COLLATIONS |
    | COLLATION_CHARACTER_SET_APPLICABILITY |
    | COLUMNS |
    | COLUMN_PRIVILEGES |
    | ENGINES |
    | EVENTS |
    | FILES |
    | GLOBAL_STATUS |
    | GLOBAL_VARIABLES |
    | KEY_COLUMN_USAGE |
    | OPTIMIZER_TRACE |
    | PARAMETERS |
    | PARTITIONS |
    | PLUGINS |
    | PROCESSLIST |
    | PROFILING |
    | REFERENTIAL_CONSTRAINTS |
    | ROUTINES |
    | SCHEMATA |
    | SCHEMA_PRIVILEGES |
    | SESSION_STATUS |
    | SESSION_VARIABLES |
    | STATISTICS |
    | TABLES |
    | TABLESPACES |
    | TABLE_CONSTRAINTS |
    | TABLE_PRIVILEGES |
    | TRIGGERS |
    | USER_PRIVILEGES |
    | VIEWS |
    | INNODB_LOCKS |
    | INNODB_TRX |
    | INNODB_SYS_DATAFILES |
    | INNODB_FT_CONFIG |
    | INNODB_SYS_VIRTUAL |
    | INNODB_CMP |
    | INNODB_FT_BEING_DELETED |
    | INNODB_CMP_RESET |
    | INNODB_CMP_PER_INDEX |
    | INNODB_CMPMEM_RESET |
    | INNODB_FT_DELETED |
    | INNODB_BUFFER_PAGE_LRU |
    | INNODB_LOCK_WAITS |
    | INNODB_TEMP_TABLE_INFO |
    | INNODB_SYS_INDEXES |
    | INNODB_SYS_TABLES |
    | INNODB_SYS_FIELDS |
    | INNODB_CMP_PER_INDEX_RESET |
    | INNODB_BUFFER_PAGE |
    | INNODB_FT_DEFAULT_STOPWORD |
    | INNODB_FT_INDEX_TABLE |
    | INNODB_FT_INDEX_CACHE |
    | INNODB_SYS_TABLESPACES |
    | INNODB_METRICS |
    | INNODB_SYS_FOREIGN_COLS |
    | INNODB_CMPMEM |
    | INNODB_BUFFER_POOL_STATS |
    | INNODB_SYS_COLUMNS |
    | INNODB_SYS_FOREIGN |
    | INNODB_SYS_TABLESTATS |
    +---------------------------------------+
    61 rows in set (0.00 sec)

常用的表

  • CHARACTER_SETS 表

    • 提供了 mysql 可用字符集的信息。SHOW CHARACTER SET; 命令从这个表获取结果。
  • SCHEMATA 表

    • 当前 mysql 实例中所有数据库的信息。SHOW DATABASES; 命令从这个表获取数据。
  • TABLES 表

    • 存储数据库中的表信息(包括视图),包括表属于哪个数据库,表的类型、存储引擎、创建时间等信息。SHOW TABLES FROM XX; 命令从这个表获取结果。
  • COLUMNS 表

    • 存储表中的列信息,包括表有多少列、每个列的类型等。SHOW COLUMNS FROM schemaname.tablename 命令从这个表获取结果。
  • STATISTICS 表

    • 表索引的信息。SHOW INDEX FROM schemaname.tablename; 命令从这个表获取结果。
  • USER_PRIVILEGES 表

    • 用户权限表。内容源自 mysql.user 授权表。是非标准表。
  • SCHEMA_PRIVILEGES 表

    • 方案权限表。给出了关于方案(数据库)权限的信息。内容来自 mysql.db 授权表。是非标准表。
  • TABLE_PRIVILEGES 表

    • 表权限表。给出了关于表权限的信息。内容源自 mysql.tables_priv 授权表。是非标准表。
  • COLUMN_PRIVILEGES 表

    • 列权限表。给出了关于列权限的信息。内容源自 mysql.columns_priv 授权表。是非标准表。
  • COLLATIONS 表

    • 提供了关于各字符集的对照信息。SHOW COLLATION; 命令从这个表获取结果。
  • COLLATION_CHARACTER_SET_APPLICABILITY 表

    • 指明了可用于校对的字符集。相当于 SHOW COLLATION 命令结果的前两个字段。
  • TABLE_CONSTRAINTS 表

    • 描述了存在约束的表。以及表的约束类型。
  • KEY_COLUMN_USAGE 表

    • 描述了具有约束的键列。
  • ROUTINES 表

    • 提供了关于存储子程序(存储程序和函数)的信息。此时,ROUTINES 表不包含自定义函数(UDF)。名为“mysql.proc name”的列指明了对应于 INFORMATION_SCHEMA.ROUTINES 表的 mysql.proc 列。
  • VIEWS 表

    • 给出了关于数据库中的视图的信息。需要有 show views 权限,否则无法查看视图信息。
  • TRIGGERS 表

    • 提供了关于触发程序的信息。必须有 super 权限才能查看该表。

数据字典对象

  • 创建数据字典实体类(不建表)(同步创建相关的mapper及service)

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    /**
    * 数据字典对象
    * @since 2019-08-06
    */
    @Data
    @EqualsAndHashCode(callSuper = false)
    @Accessors(chain = true)
    @ApiModel(value="SysDataDictionary对象")
    public class SysDataDictionary implements Serializable {
    private static final long serialVersionUID = 1L;
    @ApiModelProperty(value = "表名")
    private String tableName;
    @ApiModelProperty(value = "字段")
    private String columnName;
    @ApiModelProperty(value = "字段类型")
    private String dataType;
    @ApiModelProperty(value = "字段描述")
    private String columnComment;
    @ApiModelProperty(value = "可否为空")
    private String isNullable;
    @ApiModelProperty(value = "字段长度")
    private Double length;
    @ApiModelProperty(value = "字段默认值")
    private String columnDefault;
    }
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    @Mapper
    public interface SysDataDictionaryMapper extends BaseMapper<SysDataDictionary> {
    /**
    * 扫描所有数据库表结构
    */
    List<SysDataDictionary> scanDataTable(String database);
    /**
    * 扫描指定数据库表结构
    */
    List<SysDataDictionary> scanDataTableOf(String database,String table);
    }
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    public interface SysDataDictionaryService extends IService<SysDataDictionary> {
    public List<SysDataDictionary> scanDataTable(String database);

    public List<SysDataDictionary> scanDataTable(String database, String table);
    }

    @Service
    public class SysDataDictionaryServiceImpl extends ServiceImpl<SysDataDictionaryMapper, SysDataDictionary> implements SysDataDictionaryService {
    @Override
    public List<SysDataDictionary> scanDataTable(String database) {
    return this.baseMapper.scanDataTable(database);
    }
    @Override
    public List<SysDataDictionary> scanDataTable(String database, String table) {
    return this.baseMapper.scanDataTableOf(database, table);
    }
    }

mapper文件

  • SysDataDictionaryMapper.xml

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
    <mapper namespace="pers.fulsun.demo.springcloud.mapper.SysDataDictionaryMapper">

    <!-- 通用查询映射结果 -->
    <resultMap id="BaseResultMap" type="pers.fulsun.demo.springcloud.entity.SysDataDictionary">
    <result column="table_name" property="tableName" ></result>
    <result column="key" property="key" ></result>
    <result column="type" property="type" ></result>
    <result column="description" property="description" ></result>
    <result column="not_null" property="notNull" ></result>
    <result column="length" property="length" ></result>
    </resultMap>

    <select id="scanDataTable" resultType="pers.fulsun.demo.springcloud.entity.SysDataDictionary">
    SELECT
    TABLE_NAME,
    COLUMN_NAME,
    DATA_TYPE,
    CHARACTER_MAXIMUM_LENGTH length,
    IS_NULLABLE,
    COLUMN_DEFAULT,
    COLUMN_COMMENT
    FROM
    INFORMATION_SCHEMA.COLUMNS
    where
    table_schema= #{database}
    </select>
    <select id="scanDataTableOf" resultType="pers.fulsun.demo.springcloud.entity.SysDataDictionary">
    SELECT
    TABLE_NAME,
    COLUMN_NAME,
    DATA_TYPE,
    CHARACTER_MAXIMUM_LENGTH length,
    IS_NULLABLE,
    COLUMN_DEFAULT,
    COLUMN_COMMENT
    FROM
    INFORMATION_SCHEMA.COLUMNS
    where
    table_schema= #{database}
    and
    table_name=#{table}
    </select>
    </mapper>

测试