sql >> Database teknologi >  >> RDS >> Mysql

Sådan indsætter du værdier i en tabel med dynamiske kolonner Jdbc/Mysql

Du kan også bruge databasemetadata til at få kolonnenavnene. Dette har den fordel, at du ikke engang behøver at kende kolonnenavnene, men de bliver hentet dynamisk i din kode.

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 først du har kolonnenavnene, kan du bruge dem, som du plejer (List.size() vil selvfølgelig give antallet af kolonner).

OPDATERING:

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

Denne kode antager, at du sender objekter af korrekt type til metoden PreparedStatement.setObject(Object o). Det er også muligt at hente kolonnetyper ved hjælp af metadatabaseoplysninger og derefter bruge disse oplysninger til at gennemtvinge typekontrol, men det ville gøre din kode meget mere kompliceret



  1. Skift separatoren til et komma, når du sender forespørgselsresultater via e-mail i SQL Server (T-SQL)

  2. ORA-01460:uimplementeret eller urimelig konvertering anmodet

  3. De valgte kolonner har ikke kompatibel type, selv den har samme type

  4. Tjek, om en tabel er refereret af en fremmednøgle i SQL Server med OBJECTPROPERTY()