Java中的MySQL模式解析器?

Java中的MySQL模式解析器?,java,mysql,schema,parsing,Java,Mysql,Schema,Parsing,有人知道是否有用于解析MySQL模式的java库吗?在代码中,我希望能够确定模式中指定的表和字段。还是我需要自己写 谢谢你,理查德 编辑:只是想避免不必要地重新发明轮子:)为什么不使用数据库元数据来查找表和列?这假定以SQL表示的模式已针对所连接的数据库运行,但这不是一个难以满足的假设 如果您有CSV格式的数据,MySQL可能可以简单地导入数据。在我编写Java代码来做这样的事情之前,我会深入研究MySQL工具。如果这不起作用,我会找到一个ETL工具来帮助我。编写Java将是我最后的解决方案。回

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

谢谢你,理查德


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

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


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

回答我自己的问题:

我正在使用jsqlparser

这将解析单个语句,而不是模式中的多个语句。因此,在“;”上拆分模式。它也不喜欢“`”字符,因此需要去掉这些字符。获取特定表的列名的代码:

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<String> getColumnNames(String tableName, String schemaFile) throws JSQLParserException, IOException {

    CCJSqlParserManager pm = new CCJSqlParserManager();
    List<String> columnNames = new ArrayList<String>();

    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<ColumnDefinition> 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<String> columnNames = BUDataColumnsFinder.getColumnNames(tableName, schemaFile);

    for (String name : columnNames) {
        System.out.println("name: " + name);
    }

}

}
公共类BUDataColumnsFinder{
公共静态字符串[]readSql(字符串架构)引发IOException{
BufferedReader br=新的BufferedReader(新的InputStreamReader(新的文件InputStream(模式));
字符串mysql=“”;
弦线;
而((line=br.readLine())!=null){
mysql=mysql+行;
}
br.close();
mysql=mysql.replaceAll(“`”,“”);
返回mysql.split(“;”);
}
公共静态列表getColumnNames(String tableName,String schemaFile)抛出JSQLParserException,IOException{
CCJSqlParserManager pm=新的CCJSqlParserManager();
List columnNames=新建ArrayList();
String[]sqlStatements=readSql(schemaFile);
for(字符串sqlStatement:sqlStatements){
语句Statement=pm.parse(新的StringReader(sqlStatement));
if(CreateTable的语句instanceof){
CreateTable create=(CreateTable)语句;
String name=create.getTable().getName();
if(name.equalsIgnoreCase(tableName)){
List columns=create.getColumnDefinitions();
对于(列定义:列){
add(def.getColumnName());
}
打破
}
}
}
返回列名称;
}
公共静态void main(字符串[]args)引发异常{
字符串schemaFile=“/home/john/config/bu schema.sql”;
String tableName=“记录”;
List columnNames=BUDataColumnsFinder.getColumnNames(tableName,schemaFile);
for(字符串名称:columnNames){
System.out.println(“名称:”+name);
}
}
}

<代码> > p>您可能想考虑使用阿里巴巴的代码。尽管设计为一个复杂的连接池库,但该项目支持非常先进的ANSI SQL和非ANSI方言,如MySQL、Oracle、SQL Server等。该项目是开源的,具有非常开放的Apache许可证版本2.0

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

List<SQLStatement> statements = SQLUtils.parseStatements(sql, JdbcConstants.MYSQL);
for (SQLStatement statement : statements) {
   if (statement instanceof MySqlCreateTableStatment) {
      MySqlCreateTableStatment createTable = (MySqlCreateTableStatment) statement;
      // Use methods like: createTable.getTableSource()
   }
}
List statements=SQLUtils.parseStatements(sql,jdbcctants.MYSQL);
for(SQLStatement:statements){
if(mysqlcreatetablestatement的语句instanceof){
mysqlcreateTableStatement createTable=(mysqlcreateTableStatement)语句;
//使用如下方法:createTable.getTableSource()
}
}

不幸的是,此代码(当前)在构建数据库之前运行。但是,我可能会更改内容的顺序,因此感谢Java代码创建数据库(而且不应该),我认为您不应该解析SQL DDL。不,它不会创建数据库。它所做的是为db导入创建一个文件,其中包含模式中定义的列、从包含这些列的源数据文件中获取的值以及以非静态顺序排列的一系列其他列。根据您的需要,可能有一种方法可以以相当简单的方式完成。那么这个应用程序是什么呢?否则看看@bobah-ok yes的答案是-jsqlparser。thanksit看起来似乎不再在该地址维护jsql解析器。github[上的版本更为最新,现在发布在