首先,我不确定标题或标签是否正确。如果没有,请有人纠正我的
我的问题是,是否有任何工具或方法可以使用来自外部源的项目创建一个自动完成列表,让netbeans对其进行解析,并在出现任何错误时警告我。
--问题:我使用JDBC,我想以某种方式对我的所有模式、表和列进行建模,以便netbeans能够解析它,并在我有任何错误时警告我。例如,对于JDBC的正常使用,我会有一个函数:
ResultSet execSelect( String cols, String table ){
return statement.executeQuery("SELECT "+cols+" FROM "+table); }
问题是,应该有人确切地知道哪些参数可以用来传递正确的字符串。
我希望netbeans以某种方式向我显示一个包含所有可用选项的自动完成列表。
PS。我在构建web应用程序时也遇到了同样的问题,我想以某种方式获取外部资源的所有路径,如图像、.js文件、.css文件等。
--迄今为止的想法:
到目前为止,我的想法是放一个带有public static final String vars的.java文件,其中包含一些嵌套的静态类,这样我就可以从任何地方访问。例如:
DatabaseModel.MySchema.TableName1.ColumnName2
将是具有"ColumnName2"列和"TableName1"表的字符串变量。这将有助于我实现自动完成,但问题是没有类型检查。换句话说,有人可以使用任何字符串,无论是否全局定义为表和列,这都是不正确的。我正在考虑以某种方式使用嵌套枚举来涵盖这些关于类型检查的情况,但我不确定在任何情况下这是否是一个好的解决方案。
有什么想法吗?
最后,我编写了一个"脚本",连接到mysql,获取所有元数据(每个模式的每个表的每一列),并创建一个带有预定义类和字符串的java文件,用于描述模型。例如:
-如果您想从模式S1的表T1中获得列C1的名称,您可以键入DatabaseModel.S1.T1.C1._,这是一个带有列名的公共静态最终字符串
-如果您想从模式S2中获得表T2,您可以键入DatabaseModel.S2.T2,它是一个实现DatabaseTable接口的类。因此,函数execSelect可以使用DatabaseTable和DatabaseColumn作为参数。
这是代码(没有经过测试,但我认为想法很清楚)。
public static void generateMysqlModel(String outputFile) throws IOException, SQLException{
//** Gather the database model
// Maps a schema -> table -> column
HashMap<String,HashMap<String,ArrayList<String>>> model =
new HashMap<String,HashMap<String,ArrayList<String>>>();
openDatabase();
Connection sqlConn = DriverManager.getConnection(url, username, password);
DatabaseMetaData md = sqlConn.getMetaData();
ResultSet schemas = md.getSchemas(); // Get schemas
while( schemas.next() ){ // For every schema
String schemaName = schemas.getString(1);
model.put( schemaName, new HashMap<String,ArrayList<String>>() );
ResultSet tables = md.getTables(null, null, "%", null); // Get tables
while (tables.next()) { // For every table
String tableName = tables.getString(3);
model.get(schemaName).put( tableName, new ArrayList<String>() );
// Get columns for table
Statement s = sqlConn.createStatement(); // Get columns
s.execute("show columns in "+tables.getString(3)+";");
ResultSet columns = s.getResultSet();
while( columns.next() ){ // For every column
String columnName = columns.getString(1);
model.get(schemaName).get(tableName).add( columnName );
}
}
}
closeDatabase();
//** Create the java file from the collected model
new File(outputFile).createNewFile();
BufferedWriter bw = new BufferedWriter( new FileWriter(outputFile) ) ;
bw.append( "public class DatabaseModel{n" );
bw.append( "tpublic interface DatabaseSchema{};n" );
bw.append( "tpublic interface DatabaseTable{};n" );
bw.append( "tpublic interface DatabaseColumn{};nn" );
for( String schema : model.keySet() ){
HashMap<String,ArrayList<String>> schemaTables = model.get(schema);
bw.append( "tpublic static final class "+schema+" implements DatabaseSchema{n" );
//bw.append( "ttpublic static final String _ = ""+schema+"";n" );
for( String table : schemaTables.keySet() ){
System.out.println(table);
ArrayList<String> tableColumns = schemaTables.get(table);
bw.append( "ttpublic static final class "+table+" implements DatabaseTable{n" );
//bw.append( "tttpublic static final String _ = ""+table+"";n" );
for( String column : tableColumns ){
System.out.println("t"+column);
bw.append( "tttpublic static final class "+column+" implements DatabaseColumn{"
+ " public static final String _ = ""+column+"";n"
+ "}n" );
}
bw.append( "tttpublic static String val(){ return this.toString(); }" );
bw.append( "tt}n" );
}
bw.append( "ttpublic static String val(){ return this.toString(); }" );
bw.append( "t}n" );
}
bw.append( "}n" );
bw.close();
}
PS。对于web应用程序中的resources案例,我想有人可以递归地从"resources"文件夹中获取所有文件,并填充模型变量。这将创建一个带有文件路径的java文件。这种情况下的接口可以是文件类型或您想要的任何其他"文件视图"。
我还认为,在任何情况下,从XML文件创建.java文件都是有用的,所以任何人都可以为此在XML文件中创建某种定义。如果有人实现了类似的东西,可以在这里发布。
欢迎任何意见/改进。