public static <D extends Data> void create(D holder, Map<String, String> values) throws SQLException {
		int nColumn = values.size();
		
		String[] aColumn = new String[nColumn];
		String[] aValue = new String[nColumn];
		
		// get column and value array
		Iterator<Map.Entry<String, String>> it = values.entrySet().iterator();
	    for (int i=0; it.hasNext(); i++) {
	        Map.Entry pairs = it.next();
	        aColumn[i] = "`" + (String)pairs.getKey() + "`";
	        aValue[i] = (String)pairs.getValue();
	        
	        it.remove(); // avoids a ConcurrentModificationException
	    }
	    
	    // create a pattern of (col1, col2, col3)
	    String colJoined = "(" + StringUtils.join(aColumn, ",") + ")";
		
		// create a pattern of (?,?,?...)
		String[] toJoin = new String[nColumn];
		Arrays.fill(toJoin, " ?");
		String joined = "(" + StringUtils.join(toJoin, ",") + ")";
		
		// insert into tablename (col1,col2,col3...) values (?,?,?...)
		PreparedStatement statement = connect
		          .prepareStatement("insert into `" + holder.getTableName() + "` " + colJoined + " values " + joined, Statement.RETURN_GENERATED_KEYS);
		
		// fill values
		for(int i=0; i<nColumn; i++) {
			statement.setString(i+1, aValue[i]);
		}
	    
	    // execute query
	    statement.executeUpdate();
	    
	    
	    // get generated key
	    ResultSet generatedKeys = statement.getGeneratedKeys();
	    if (generatedKeys.next()) {
            holder.id = generatedKeys.getLong(1);
        }
        else {
            throw new SQLException("Creating user failed, no ID obtained.");
        }
	}