数据字典展示
数据字典
- 开发中,往往需要将数据库中的表结构数据展示到页面管理,这个存储数据库中所有表结构信息的表称为数据字典。
数据字典设计
第一种:较为复杂,作为所有数据库表的元数据,程序中的业务表并不实际存在,所有的业务表结构皆存在于数据字典中,需要使用到业务表时,从数据字典中获取表结构。这种设计对于开发人员要求较高,整体业务逻辑更为抽象。
第二种:较为简单,仅作为展示用,并不具备实际业务功能,便于管理数据库表格信息。程序中的业务表皆是实际存在的,数据字典仅存储这些业务表格的结构,作为展示。
此处简单测试系统,甚至不做存储,每次访问都可以直接扫描数据库所有业务表的结构进行展示。
数据字典开发
- 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
70mysql> 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;
命令从这个表获取结果。
- 提供了 mysql 可用字符集的信息。
SCHEMATA 表
- 当前 mysql 实例中所有数据库的信息。
SHOW DATABASES;
命令从这个表获取数据。
- 当前 mysql 实例中所有数据库的信息。
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
*/
public class SysDataDictionary implements Serializable {
private static final long serialVersionUID = 1L;
private String tableName;
private String columnName;
private String dataType;
private String columnComment;
private String isNullable;
private Double length;
private String columnDefault;
}1
2
3
4
5
6
7
8
9
10
11
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
17public interface SysDataDictionaryService extends IService<SysDataDictionary> {
public List<SysDataDictionary> scanDataTable(String database);
public List<SysDataDictionary> scanDataTable(String database, String table);
}
public class SysDataDictionaryServiceImpl extends ServiceImpl<SysDataDictionaryMapper, SysDataDictionary> implements SysDataDictionaryService {
public List<SysDataDictionary> scanDataTable(String database) {
return this.baseMapper.scanDataTable(database);
}
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
<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>
测试
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 凉月の博客!
评论