archidata/doc/SQL_wrapper.md

4.8 KiB

Wrapping over the DB

In the current version we consider 2 DB access: MySQL and SQLite, We commonly use the SQLite in test mode to permit to test is a real case.

Generic Access:

Some generic function are available to permit you to simply request the DB

Create a new Value:

MyDataModel dataToInsert = ...;
MyDataModel dataCreated = DataAccess.insert(dataToInsert);

Get a full table:

List<MyDataModel> data = DataAccess.gets(MyDataModel.class);

Get a single element in the DB:

UUID id = ...;
MyDataModel data = DataAccess.get(MyDataModel.class, id);

Note: The Id type fully managed are UUID and Long

Removing the Data:

UUID id = ...;
DataAccess.delete(MyDataModel.class, id);

Note: Removing the data automatically detect if it is a software remove or definitive remove

Updating the Data:

The update of the data can be managed by 2 way:

  • Direct update of the Object with direct injection (Good for PUT)
  • Update with input json (Good for PATCH)

The second way is preferable for some reasons

  • When jakarta transform the data in you object, we can not detect the element set at null or not set (We consider user of Optional il all data class will create a too bug amount of unneeded code in all dev parts)
  • Throw in the jakarta parsing are not well catch when we will generate generic error
  • The Check will permit to explain what is wrong better than a generic Json parser.

Updating with JSON:

UUID id = ...;
String jsonRequest = "{...}";
DataAccess.updateWithJson(MyDataModel.class, id, jsonRequest);

Updating with direct data:

UUID id = ...;
MyDataModel dataToUpdate = ...;
// This update all fields:
DataAccess.update(dataToUpdate, id);
// Select the field to update:
DataAccess.update(dataToUpdate, id, List.of("field1","field2"));

Generic option of the request:

Many API have a generic multiple option available like:

public static <T> List<T> getsWhere(final Class<T> clazz, final QueryOption... option) throws Exception

You just need to add your options in the list of option.

Filter the list of field read:

public FilterValue(final String... filterValue)
public FilterValue(final List<String> filterValues)
// example:
new newFilterValue("field1", "field2");

Add a condition more detail

public Condition(final QueryItem items)

Order the request:

public OrderBy(final OrderItem... childs);
// example:
new OrderBy(new OrderItem("name", Order.DESC));

Limit the :

public Limit(final long limit)
// example:
new Limit(50);

Read all column like update date and create date or delete field

public ReadAllColumn()

Condition models:

Creating a condition independent of the DB model use need to have a little abstraction of the query model:

For this we propose some condition that update with the internal "auto" condition that is added (like the soft delete...)

default generic comparator

This is the base of the comparison tool. It compare a column with a value

public QueryCondition(final String key, final String comparator, final Object value);

Simple DB comparison element. Note the injected object is injected in the statement and not in the query directly.

Example:

String nameToCheck = "plop";
new QueryCondition("fieldName", "=", nameToCheck);
// OR:
UUID uuid = ...;
new QueryCondition("uuid", "=", uuid);

List comparator

It permit to check a column is (NOT) in a list of value

public QueryInList(final String key, final List<T> value)
public QueryInList(final String key, final T... value)

and his opposite:

public QueryNotInList(final String key, final List<T> value)
public QueryNotInList(final String key, final T... value)

example

new QueryInList("uuid", List.of(uuid1, uuid2));

NULL and NOT NULL checker

This permit to check an element is NULL or not NULL

public QueryNull(final String key);
public QueryNotNull(final String key);

The group condition:

The generic OR group:

public QueryOr(final List<QueryItem> child);
public QueryOr(final QueryItem... child);

Or the generic `AND group:

public QueryAnd(final List<QueryItem> child);
public QueryAnd(final QueryItem... child);

Full example:

List<MyDataModel> result = DataAccess.getsWhere(MyDataModel.class, 
        new Limit(50),
        new OrderBy(new OrderItem("name", Order.DESC)),
        new Condition(
            new QueryAnd(
                QueryNull("Field3")
                new QueryOr(
                    new QueryInList("Field4", 5, 55, 65, 62, 27, 84),
                    new QueryCondition("cityID", ">", 78000);
                )
            )
        )
    );