Mysql
 sql >> Datenbank >  >> RDS >> Mysql

So fügen Sie Werte in eine Tabelle mit dynamischen Spalten ein Jdbc/Mysql

Sie können auch Datenbankmetadaten verwenden, um die Spaltennamen abzurufen. Das hat den Vorteil, dass Sie nicht einmal die Spaltennamen kennen müssen, sondern sie werden dynamisch in Ihrem Code abgerufen.

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;
}

Sobald Sie die Spaltennamen haben, können Sie sie wie gewohnt verwenden (List.size() würde natürlich die Anzahl der Spalten angeben).

AKTUALISIEREN:

//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
    }

Dieser Code geht davon aus, dass Sie Objekte des richtigen Typs an die Methode PreparedStatement.setObject(Object o) übergeben. Es ist auch möglich, Spaltentypen mithilfe von Metadatenbankinformationen abzurufen und diese Informationen dann zu verwenden, um die Typprüfung zu erzwingen, aber das würde Ihren Code viel komplizierter machen