Кто-либо знает, существует ли библиотека Java для парсинга схемы MySQL? В коде я хочу смочь определить таблицы и поля, указанные в схеме. Или я должен буду записать свое собственное?
Спасибо Richard.
Править: Просто не хочу изобретать велосипед излишне :)
Отвечая на свой вопрос:
Я использую 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<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);
}
}
}
Почему бы просто не использовать DatabaseMetaData, чтобы узнать таблицы и столбцы? Это предполагает, что схема, выраженная в SQL, была запущена против базы данных, к которой вы подключены, но это предположение не сложно удовлетворить.
MySQL может быть в состоянии просто импортировать данные, если у вас есть данные в формате CSV. Я бы углубился в инструменты MySQL, прежде чем писать код на Java для выполнения такой задачи. Если это не сработает, я бы нашел инструмент ETL, который бы мне помог. Написание Java было бы моим последним решением.