最近有同事看到字节跳动产品设计文档里有数据库表er图。就想问问又没有现成的工具也给直接生成一个er图,经查找验证发现并没有。因为现在表关系都是用的逻辑外键而非物理外键约束的,所以像navicat等工具就算生成了也没有描述关系的连接线。那么为了满足需求,这边就略微出手写了个代码实现er关系的工具。(注意:这里只有后端部分,如需更直观使用请配合前端进行页面渲染)
一:首先获取数据库的所有表名和表的字段sql代码如下:
<!-- 获取所有表名 -->
<select id="showTables" resultType="java.lang.String">
SHOW TABLES;
</select>
<!--根据表名获取该表下的所有字段-->
<select id="showColumns" resultType="com.alibaba.fastjson.JSONObject">
SHOW COLUMNS FROM ${tableName};
</select>
二:mapper接口层代码如下:
/**
* 获取所有表名
* @return 该数据库下的所有表名
*/
List<String> showTables();
/**
* 根据表名获取该表下的所有字段
* @param tableName 要获取字段的表名
* @return 该表下的所有字段
*/
List<JSONObject> showColumns(@Param("tableName") String tableName);
三:业务代码如下:(为了方便看这里省略业务层直接在controller实现)
@Autowired
private ERMapper erMapper;
@GetMapping("/getEr")
@ApiOperation(value = "获取er关系")
public Map getEr(){
List<String> list = erMapper.showTables();
Map<String, List<String>> map = new HashMap<>();
Map<String, String> tableMap = new HashMap<>();
List<String> ts = new ArrayList<>();
for (String s : list) {
String table = s.replace("erp_", "");
ts.add(table);
tableMap.put(table, s);
}
for (String s : list) {
List<JSONObject> jsonList = erMapper.showColumns(s);
String erp_ = s.replace("erp_", "");
ArrayList<String> tList = new ArrayList<>();
for (JSONObject jsonObject : jsonList) {
String field = jsonObject.getString("Field");
if (field.endsWith("_id")){
String replaceId = field.replace("_id", "");
if (ts.contains(replaceId)){
tList.add(tableMap.get(replaceId));
}
}
}
map.put(s, tList);
log.info("s:{}", erp_);
}
return map;
}