protected void save(Map<String,String> values) throws SQLException {
		if(isNew()) {
			Data.create(this, values);
			return;
		}
		
		int nColumn = values.size();
		String[] aPiece = new String[nColumn];
		String[] aValue = new String[nColumn];
		
		Iterator<Entry<String,String>> it = values.entrySet().iterator();
		for(int i=0; it.hasNext(); i++) {
			Entry pairs = it.next();
			aPiece[i] = " `" + (String)pairs.getKey() + "` = ? ";
			aValue[i] = (String)pairs.getValue();
			it.remove(); // avoids a ConcurrentModificationException
		}

		// update `$tableName` set `col1` = ? , `col2` = ?, ... where `id` = $id
		PreparedStatement statement = connect.prepareStatement(
				" update `" + tableName + "` set "
				+ StringUtils.join(aPiece, ",")
				+ "where `id` = " + this.id
				);
		
		// fill values
		for(int i=0; i<nColumn; i++) {
			statement.setString(i+1, aValue[i]);
		}
		
		// execute query
		statement.executeUpdate();
		
	}