Java:在具有外部源代码的netbeans上自动完成源代码的方法

Java:在具有外部源代码的netbeans上自动完成源代码的方法,java,netbeans,autocomplete,static-analysis,Java,Netbeans,Autocomplete,Static Analysis,首先,我不确定标题或标签是否正确。如果没有,请有人纠正我 我的问题是,是否有任何工具或方法可以创建一个包含来自外部源的项目的自动完成列表,让netbeans对其进行解析,并在出现任何错误时向我发出警告 --问题:我使用JDBC,我希望以某种方式对我的所有模式、表和列进行建模,以便netbeans可以解析它,并在我有任何错误时向我发出警告。例如,正常使用JDBC时,我会有一个函数: ResultSet execSelect( String cols, String table ){ re

首先,我不确定标题或标签是否正确。如果没有,请有人纠正我

我的问题是,是否有任何工具或方法可以创建一个包含来自外部源的项目的自动完成列表,让netbeans对其进行解析,并在出现任何错误时向我发出警告

--问题:我使用JDBC,我希望以某种方式对我的所有模式、表和列进行建模,以便netbeans可以解析它,并在我有任何错误时向我发出警告。例如,正常使用JDBC时,我会有一个函数:

ResultSet execSelect( String cols, String table ){
     return statement.executeQuery("SELECT "+cols+" FROM "+table); }
问题是,有些人应该确切地知道哪些参数可用于传递正确的字符串

我希望netbeans以某种方式向我显示一个包含所有可用选项的自动完成列表

另外,我在构建web应用程序时遇到了完全相同的问题,我希望以某种方式获取外部资源的所有路径,如图像、.js文件、.css文件等

--迄今为止的想法
到目前为止,我的想法是放一个带有公共静态最终字符串变量的.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作为参数

下面是代码(我认为没有经过测试,但想法很清楚)

publicstaticvoidgeneratemysqlmodel(stringoutputfile)抛出IOException,SQLException{
//**收集数据库模型
//映射模式->表->列
HashMap模型=
新的HashMap();
openDatabase();
连接sqlConn=DriverManager.getConnection(url、用户名、密码);
DatabaseMetaData md=sqlConn.getMetaData();
ResultSet schemas=md.getSchemas();//获取架构
而(schemas.next()){//
String schemaName=schemas.getString(1);
put(schemaName,newhashmap());
ResultSet tables=md.getTables(null,null,“%”,null);//获取表
而(tables.next()){//对于每个表
String tableName=tables.getString(3);
get(schemaName).put(tableName,newarraylist());
//获取表的列
语句s=sqlConn.createStatement();//获取列
s、 执行(“在“+tables.getString(3)+”;”中显示列”;
ResultSet columns=s.getResultSet();
而(columns.next()){//
String columnName=columns.getString(1);
get(schemaName).get(tableName).add(columnName);
}
}
}
closeDatabase();
//**从收集的模型创建java文件
新建文件(outputFile).createNewFile();
BufferedWriter bw=新的BufferedWriter(新的FileWriter(outputFile));
append(“公共类数据库模型{\n”);
append(“\t公共接口数据库模式{};\n”);
append(“\t公共接口数据库表{};\n”);
append(“\t公共接口数据库列{};\n\n”);
for(字符串架构:model.keySet()){
HashMap schemaTables=model.get(schema);
append(“\tpublic static final class”+schema+”实现数据库模式{\n”);
//append(“\t\tpublic static final String \=\”+schema+“\”;\n”);
for(字符串表:schemaTables.keySet()){
系统输出打印项次(表);
ArrayList tableColumns=schemaTables.get(表);
append(“\t\tpublic static final class”+table+”实现DatabaseTable{\n”);
//append(“\t\t\tpublic static final String \=\”+table+“\”;\n”);
for(字符串列:tableColumns){
System.out.println(“\t”+列);
append(“\t\t\t公共静态最终类”+列+”实现DatabaseColumn{”
+“公共静态最终字符串\=\”“+列+\”;\n”
+“}\n”);
}
append(“\t\t\t公共静态字符串val(){返回this.toString();}”);
追加(“\t\t}\n”);
}
append(“\t\t公共静态字符串val(){返回this.toString();}”);
追加(“\t}\n”);
}
追加(“}\n”);
bw.close();
}
对于web应用程序中的资源案例,我想有人可以递归地从“resources”文件夹中获取所有文件,并填充模型变量。这将创建一个带有文件路径的java文件。在这种情况下,接口可以是文件类型或您想要的任何其他“文件视图”

我还认为,在任何情况下,从XML文件创建.java文件都是有用的,因此任何人都可以为此在XML文件中创建某种定义。 如果有人实现了类似的功能,可以在这里发布

欢迎提出任何意见/改进

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{};\n\n" );
    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( "\t\tpublic static final String _ = \""+schema+"\";\n" );
        for( String table : schemaTables.keySet() ){
            System.out.println(table);
            ArrayList<String> tableColumns = schemaTables.get(table);
            bw.append( "\t\tpublic static final class "+table+" implements DatabaseTable{\n" );
            //bw.append( "\t\t\tpublic static final String _ = \""+table+"\";\n" );
            for( String column : tableColumns ){
                System.out.println("\t"+column);
                bw.append( "\t\t\tpublic static final class "+column+" implements DatabaseColumn{"
                        + " public static final String _ = \""+column+"\";\n"
                        + "}\n" );
            }
            bw.append( "\t\t\tpublic static String val(){ return this.toString(); }" );
            bw.append( "\t\t}\n" );
        }
        bw.append( "\t\tpublic static String val(){ return this.toString(); }" );
        bw.append( "\t}\n" );
    }
    bw.append( "}\n" );

    bw.close();
}