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. MySQLの複数挿入パフォーマンス

    2. SQLは、別のテーブルの別の列から1つの列を更新します

    3. トリガーを介してテーブルに列権限を適用する

    4. AndroidSQLiteMultiTableデータベースの開発