Mysql
 sql >> база данни >  >> RDS >> Mysql

Как да вмъкнете стойности в таблица с динамични колони Jdbc/Mysql

Можете също да използвате метаданни на базата данни, за да получите имената на колоните. Това има предимството, че дори не е необходимо да знаете имената на колоните, а те се извличат динамично във вашия код.

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

След като имате имената на колоните, можете да го използвате както обикновено (List.size() разбира се ще даде броя на колоните).

АКТУАЛИЗАЦИЯ:

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

Този код предполага, че предавате обекти от правилни типове към метода PreparedStatement.setObject(Object o). Възможно е също така да извлечете типове колони с помощта на информация за базата данни и след това да използвате тази информация за налагане на проверка на типа, но това би направило кода ви много по-сложен



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Импортирайте CSV в MySQL

  2. MySQL и Проверка на ограниченията

  3. Golang Вмъкнете NULL в sql вместо празен низ

  4. MySQL SELECT WHERE дата и час съвпада с ден (и не непременно час)

  5. MySQL правилният синтаксис за използване близо до '' при грешка на ред 1