sql >> Databasteknik >  >> RDS >> Mysql

Hur man infogar värden i en tabell med dynamiska kolumner Jdbc/Mysql

Du kan också använda databasmetadata för att få kolumnnamnen. Detta har fördelen att du inte ens behöver känna till kolumnnamnen, utan de hämtas istället dynamiskt i din kod.

public static List<String> getColumns(String tableName, String schemaName) throws  SQLException{

    ResultSet rs=null;

    ResultSetMetaData rsmd=null;
    PreparedStatement stmt=null;
    List<String> columnNames =null;
    String qualifiedName = (schemaName!=null&&!schemaName.isEmpty())?(schemaName+"."+tableName):tableName;
    try{
        stmt=conn.prepareStatement("select * from "+qualifiedName+" where 0=1");
        rs=stmt.executeQuery();//you'll get an empty ResultSet but you'll still get the metadata
        rsmd=rs.getMetaData();
        columnNames = new ArrayList<String>(); 
        for(int i=1;i<=rsmd.getColumnCount();i++)
            columnNames.add(rsmd.getColumnLabel(i));    
    }catch(SQLException e){
        throw e;//or log it
    }
    finally{
        if(rs!=null)
            try {
                rs.close();
            } catch (SQLException e) {
                // TODO Auto-generated catch block
                throw e
            }
        if(stmt!=null)
            try {
                stmt.close();
            } catch (SQLException e) {
                // TODO Auto-generated catch block
                throw e
            }
    }
    return columnNames;
}

När du väl har kolumnnamnen kan du använda dem som vanligt (List.size() skulle naturligtvis ge antalet kolumner).

UPPDATERING:

//I will assume that your values (data to be inserted) is a List of Object types and that it is already populated



List<Object> data = new ArrayList<>();
    //you will populate this list

    //getting the column names
    List<String> columnNames = getColumns("MyTable", "MyDB");

    String insertColumns = ""; 
    String insertValues = "";

    if(columnNames != null && columnNames.size() > 0){
        insertColumns += columnNames.get(0);
        insertValues += "?";
    }


    for(int i = 1; i < columnNames.size();i++){
      insertColumns += ", " + columnNames.get(i) ;
      insertValues += "?";
    }

    String insertSql = "INSERT INTO MyDB.MyTable (" + insertColumns + ") values(" + insertValues + ")"; 

    try{
    PrepareStatement ps = conn.prepareStatement(insertSql);

    for(Object o : data){
     ps.setObject(o); //you must pass objects of correct type
    }
    ps.execute(); //this inserts your data
    }catch(SQLException sqle){
      //do something with it
    }

Den här koden förutsätter att du skickar objekt av korrekt typ till metoden PreparedStatement.setObject(Object o). Det är också möjligt att hämta kolumntyper med hjälp av metadatabasinformation och sedan använda den informationen för att tvinga fram typkontroll, men det skulle göra din kod mycket mer komplicerad



  1. Vad är det mest effektiva sättet att välja de sista n raderna i en tabell utan att ändra tabellens struktur?

  2. WooCommerce:Hitta produkterna i databasen

  3. Oracle Forms i R12/R12.2

  4. Öppna SQLite-frågeresultat automatiskt i Excel