Java中的MySQL模式解析器?

有谁知道是否有用于解析MySQL模式的java库? 在代码中,我希望能够确定模式中指定的表和字段。 或者我需要自己写吗?

谢谢理查德。

编辑:只是想避免不必要地重新发明轮子:)

回答我自己的问题:

使用jsqlparser http://jsqlparser.sourceforge.net/

它解析单个语句,而不是解析模式中的多个语句。 因此,将模式拆分为“;”。 它也不喜欢”’字符,因此需要将它们删除。 获取特定表的列名的代码:

public class BUDataColumnsFinder { public static String[] readSql(String schema) throws IOException { BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream(schema))); String mysql = ""; String line; while ((line = br.readLine()) != null) { mysql = mysql + line; } br.close(); mysql = mysql.replaceAll("`", ""); return mysql.split(";"); } public static List getColumnNames(String tableName, String schemaFile) throws JSQLParserException, IOException { CCJSqlParserManager pm = new CCJSqlParserManager(); List columnNames = new ArrayList(); String[] sqlStatements = readSql(schemaFile); for (String sqlStatement : sqlStatements) { Statement statement = pm.parse(new StringReader(sqlStatement)); if (statement instanceof CreateTable) { CreateTable create = (CreateTable) statement; String name = create.getTable().getName(); if (name.equalsIgnoreCase(tableName)) { List columns = create.getColumnDefinitions(); for (ColumnDefinition def : columns) { columnNames.add(def.getColumnName()); } break; } } } return columnNames; } public static void main(String[] args) throws Exception { String schemaFile = "/home/john/config/bu-schema.sql"; String tableName = "records"; List columnNames = BUDataColumnsFinder.getColumnNames(tableName, schemaFile); for (String name : columnNames) { System.out.println("name: " + name); } } } 

为什么不使用DatabaseMetaData来查找表和列? 这假定在SQL中表示的模式已经针对您连接的数据库运行,但这并不是一个难以满足的假设。

如果您拥有CSV格式的数据,MySQL可能只需导入数据。 在我编写Java代码来做这样的事情之前,我会深入研究MySQL工具。 如果这不起作用,我会找到一个ETL工具来帮助我。 编写Java将是我的最后解决方案。

您可能需要考虑使用阿里巴巴德鲁伊项目中的代码。 虽然设计为一个复杂的连接池库,但该项目支持非常高级的解析器和AST用于ANSI SQL和非ANSI方言,如MySQL,Oracle,SQL Server等。该项目是开源的,具有非常自由的Apache许可证版本2.0。

这部分库的主要入口点是SQLUtils.java 。 您可以使用从SQLUtils.parseStatements返回的值来访问语句的类型化模型:

 List statements = SQLUtils.parseStatements(sql, JdbcConstants.MYSQL); for (SQLStatement statement : statements) { if (statement instanceof MySqlCreateTableStatment) { MySqlCreateTableStatment createTable = (MySqlCreateTableStatment) statement; // Use methods like: createTable.getTableSource() } }