Mysql
 sql >> Baza danych >  >> RDS >> Mysql

Jak wstawić wartości do tabeli z dynamicznymi kolumnami Jdbc/Mysql

Możesz również użyć metadanych bazy danych, aby uzyskać nazwy kolumn. Ma to tę zaletę, że nie musisz nawet znać nazw kolumn, a raczej są one pobierane dynamicznie w kodzie.

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

Gdy masz już nazwy kolumn, możesz ich używać w normalny sposób (List.size() oczywiście podaje liczbę kolumn).

AKTUALIZACJA:

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

Ten kod zakłada, że ​​do metody PreparedStatement.setObject(Object o) przekazujesz obiekty poprawnych typów. Możliwe jest również pobieranie typów kolumn za pomocą informacji z metadanych, a następnie użycie tych informacji do wymuszenia sprawdzania typów, ale to znacznie bardziej skomplikowałoby Twój kod



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Jeden do wielu SQL SELECT w jednym wierszu

  2. Nieobsługiwana opcja dostarczona do mysql_options()

  3. Wyszukiwanie pełnotekstowe MySql w PHP przy użyciu ciągu zawierającego słowa kluczowe

  4. EXTRACT() Przykłady – MySQL

  5. Liczba Mysql liczba dopasowań regex na pole