Создание

Операции, связанные с созданием объекта DataTable, зависят от того, какой интерфейс DataTable реализован.

SimpleDataTable

Для создания SimpleDataTable необходимо определить ее формат путем создания экземпляра класса TableFormat:

TableFormat tf = new TableFormat(); // For multi-row tables

 

TableFormat tf = new TableFormat(1, 1); // For single-row tables

В большинстве случаев экземпляры TableFormat должны быть объявлены статически, должны конфигурироваться в статических блоках и быть повторно использованы между несколькими таблицами, переменными, функциями, событиями и т.д. Это обеспечивает меньшее потребление памяти в сравнении с нестатическими форматами таблиц.

Добавление полей

После этого необходимо добавить дескрипторы полей к формату таблицы. Каждое поле представлено экземпляром FieldFormat. Существует множество способов создания дескриптора формата поля:

FieldFormat ff = FieldFormat.create("fieldName", FieldFormat.STRING_FIELD); // The simplest method to create a string field

ff.setDescription("Field Description");

ff.setDefault("Default Value");

ff.setNullable(true);

 

FieldFormat ff = FieldFormat.create("fieldName", FieldFormat.STRING_FIELD, "Field Description", "Default Value", true); // Same as above, but specifying all options in constructor

 

FieldFormat ff = FieldFormat.create("<fieldName><S><D=Field Description><A=Default value><F=N>"); // Same as above, but using field format encoding

 

// After field format is created, we can fine-tune it

ff.addSelectionValue("v1", "First option");

ff.addSelectionValue("v2", "Second option");

ff.addValidator(new LimitsValidator(10, 100));

ff.setKeyField(true);

 

//Now we can add our field descriptor to field format:

TableFormat tf = new TableFormat();

tf.addField(ff);

Также возможно избежать создания FieldFormat и передать опции поля в TableFormat.addField():

TableFormat tf = new TableFormat();

 

tf.addField("fieldName", FieldFormat.STRING_FIELD, "Field Description", "Default Value", true);

Установка опций формата

Когда добавляются все поля, мы можем настроить формат таблицы, добавить к ней несколько привязок и валидаторов:

tf.setReorderable(true);

 

tf.addBinding("field2", "{field1} * 2");

 

tf.addTableValidator(new TableKeyFieldsValidator());

Создание таблицы

Когда формат таблицы готов, можно создать таблицу на его основе:

TableFormat tf = new TableFormat(1, 1, FieldFormat.create("fieldName", FieldFormat.STRING_FIELD));

 

DataTable table = new SimpleDataTable(tf);

Когда используется экземпляр TableFormat для создания таблицы, он становится постоянным и не может модифицироваться. Для модификации формата существующей table:

  • Клонируйте формат таблицы: TableFormat cloned = table.getFormat().clone();
  • Клонированный формат будет изменяемым. Внесите в него необходимые модификации.
  • Создайте новую таблицу, используя клонированный формат: DataTable newTable = new SimpleDataTable(cloned);
  • Скопируйте данные из старой таблицы в новую, используя методы статического помощника DataTableReplication.copy(table, newTable) класса DataTableReplication

Добавление записей

Существует несколько способов создания записей.

Первый способ - установка значений поля:

DataRecord rec = table.addRecord();

rec.setValue("firstField", "Value of first field"); // First field is a string-type field

rec.setValue("secondField", true); // First field is a boolean-type field

rec.setValue("thirdField", 12345); // First field is an integer-type field

Второй способ - передача значений поля в addRecord():

DataRecord rec = table.addRecord("Value of first field", true, 12345);

Третий способ - добавление значений по одному:

DataRecord rec = table.addRecord();

rec.addString("Value of first field");

rec.addBoolean(true);

rec.addInt(12345);

 

// Explicit type specification is not necessary

DataRecord rec = table.addRecord();

rec.addValue("Value of first field");

rec.addValue(true);

rec.addValue(12345);

Автоматический тип преобразования

Иногда значение, которое у вас есть, может не полностью подходить для ячейки таблицы. В этом случае используйте метод setValueSmart() от DataRecord. Он справится с задачей преобразования значения в подходящий тип.

Код внутри использует статические методы класса Util, который может быть напрямую использован, чтобы активировать преобразование необработанных объектов в булевые значения, числа и даты.

ResultSetDataTable

Для создания экземпляра ResultSetDataTable, необходим экземпляра класса, который реализует java.sql.ResultSet. Следующий пример показывает, как создать ResultSetDataTable, используя MySQL JDBC соединение:

DriverManager.registerDriver(((Driver) Class.forName("com.mysql.jdbc.Driver").newInstance())); // it is supposed that the required JDBC driver is already on the classpath

Connection con = DriverManager.getConnection("jdbc:mysql://localhost/databasename?user=root&password=123&serverTimezone=Europe/Moscow");

Statement stmt = con.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_UPDATABLE);

 

String query = "SELECT * FROM TABLENAME;"; // here it is supposed that there is a table called "TABLENAME" in the database called "databasename"

ResultSet resultSet = stmt.executeQuery(query);

 

DataTable table = new ResultSetDataTable(resultSet);

// Do not forget to close the instances of ResultSet, Statement, and Connection when they are no longer required

Обратите внимание, что формат создаваемой таблицы данных формируется автоматически на основе схемы связей в наборе результатов.

Добавление записей

Чтобы добавить записи в ResultSetDataTable, лежащий в основе набор результатов должен быть одновременно с прокруткой (то есть не должен быть типа ResultSet.TYPE_FORWARD_ONLY) и обновляемый (ResultSet.CONCUR_UPDATABLE).

Записи можно добавить теми же способами, что и для SimpleDataTable, с одним исключением: метод addRecord() (без аргументов) не поддерживается. Вместо него следует использовать метод addRecord(DataRecord):

DataRecord rec = new DataRecord(table.getFormat);

rec.addString("Value of first field");

rec.addBoolean(true);

rec.addInt(12345);

table.addRecord(rec);

FilteringDataTable

В предыдущей главе говорилось, что экземпляр FilteringDataTable не хранит данные. Чтобы создать экземпляр FilteringDataTable, необходимы, как минимум, два объекта: таблица данных, которая будет служить источником данных, и выражение фильтрации, которое определит условие(я) для фильтра. Выражение фильтрации  может быть либо типа Expression, либо String. Последнее будет автоматически преобразовано в Expression (при условии, что String - корректное Выражение, которое вычисляется в Boolean).

Обратите внимание, что экземпляр DataTable, переданный конструктору FilteringDataTable, становится постоянным.

Ниже приведен пример создания FilteringDataTable:

// Let's suppose we have a SimpleDataTable called "source" that has an Integer field called "intfield". This data table will serve as data source for our FilteringDataTable instance

 

String filterExpression = "{intfield} == 111 || {intfield} == 333";

DataTable filteringTable = new FilteringDataTable(source, filterExpression);

 

// The created FilteringDataTable will have only the records from source that satisfy the conditions defined in filterExpression (i.e. only records with the "intfield" value equal to 111 or 333)

FilteringDataTable не поддерживает операции модификации, то есть добавление и настройка записей невозможны.

ProxyDataTable

Экземпляр ProxyDataTable создается автоматически в Клиенте при попытке получить доступ к экземпляру ResultSetDataTable или FilteringDataTable на Сервере.

ProxyDataTable не поддерживает операции модификации, то есть добавление и настройка записей невозможны.