使用Druid解析Sql获取数据库信息
业余时间针对项目中的 Mybatis Xml 写了一个简单的 代码生成 ,一开始使用JDBC去读取表的字段,备注等等信息,由于对JDBC不是很熟悉,总是有些数据取不到或者不完全。后来转换思路由 druid
进行sql解析,轻而易举的解决了这个问题
解析sql
添加依赖
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.1.19</version>
</dependency>
-
show create table xxxx
获取建表语句。 - 使用
SchemaStatVisitor
解析sql语句获取我们想要的数据,列,注释,主键等等。
新建 ColumnTableAliasVisitor
继承 druid
的 SchemaStatVisitor
进行解析,代码如下
/**
* @author chenshun00@gmail.com
* @since 2019/5/9
*/
public class ColumnTableAliasVisitor extends SchemaStatVisitor {
public ColumnTableAliasVisitor() {
super("mysql");
}
public Map<String, String> columnComment = new HashMap<>();
public boolean visit(SQLColumnDefinition x) {
String tableName = null;
SQLObject parent = x.getParent();
if (parent instanceof SQLCreateTableStatement) {
tableName = ((SQLCreateTableStatement) parent).getName().toString();
}
if (tableName == null) {
return true;
} else {
String columnName = x.getName().toString();
String normalize = DbKit.normalize(columnName);
//获取列注释,如果注释为空则使用列名做为注释
String comment = x.getComment() == null ? normalize : x.getComment().toString();
columnComment.put(normalize, StringUtils.isBlank(comment) ? normalize : DbKit.normalize(comment));
TableStat.Column column = this.addColumn(tableName, columnName);
if (x.getDataType() != null) {
column.setDataType(x.getDataType().getName());
}
for (Object item : x.getConstraints()) {
if (item instanceof SQLPrimaryKey) {
column.setPrimaryKey(true);
} else if (item instanceof SQLUnique) {
column.setUnique(true);
}
}
return false;
}
}
}
反射获取表的主键,完整代码地址 ==> 代码片段
Field tableElementList = stmt.getClass().getSuperclass().getDeclaredField("tableElementList");
tableElementList.setAccessible(true);
List<SQLTableElement> sqlTableElements = (List<SQLTableElement>) tableElementList.get(stmt);
for (SQLTableElement sqlTableElement : sqlTableElements) {
if (sqlTableElement instanceof MySqlPrimaryKey) {
mySqlPrimaryKeys.add((MySqlPrimaryKey) sqlTableElement);
}
}
到这里所有的数据都收集了,可以继续写我的代码生成了 , 项目地址 generator :)