Контроллер таблицы#
Контроллер таблицы (Api) служит для транзакционной работы со строками базы данных.
Api-контроллер предоставляет:
кэш строк:
один объект
Entity— одна строка;повторный
load(id)вернёт тот же экземпляр;
список изменений — изменения накапливаются до момента
flush();flush()— все изменения (inserted / updated / deleted) собираются вGsSession.flush()и пишутся пачками;счётчик идентификаторов —
insert()получает уникальныйidиз счётчика.
Для создания контроллера:
Создайте базу данных.
Создайте сущность.
Создайте
Dao.Создайте
Api-контроллер.Скомпилируйте проект.
При компиляции проекта произойдёт генерация необходимых классов.
Сущность#
Сущность описывает таблицу базы данных в терминах ORM.
Для сущности генерируется Dao, а также создаётся таблица в базе данных.
Для создания сущности:
Создайте
data class.Унаследуйте класс от
BaseEntity.Совет
Не создавайте поле
id, так как оно определено вBaseEntity.Добавьте аннотацию
@Entity.Укажите в аннотации имя таблицы базы данных.
Внимание
Имя таблицы должно соответствовать имени класса.
Добавьте класс в список
entitiesбазы данных.Пример:
@Database( entities = [SystemEntity::class, User::class] ) abstract class AppDatabase : RoomDatabase()
Пример сущности:
// db/User.kt
@Entity(tableName = "User")
data class User(
var sName: String? = null,
var nAge : Int? = null
) : BaseEntity() {
override fun copyEntity() = copy()
}
Dao#
Dao содержит набор сгенерированных на основе сущности методов для реализации ORM.
Создайте абстрактный класс.
Унаследуйте его от
BaseDao.
В качестве типа укажите сущность для этогоDao.Аннотируйте класс аннотацией
@Dao.Добавьте переменную с
Daoв класс базы данных.Пример:
abstract class AppDatabase : RoomDatabase() { abstract val userDao: UserDao }
Пример Dao:
// db/UserDao.kt
@Dao
abstract class UserDao : BaseDao<User>()
Создание Api#
Создайте класс.
Класс должен принимать параметрctx: ApiBeanContext. Контекст нужен для работы механизма инъекции зависимостей.Унаследуйте класс от
DbBaseApiGen.
DbBaseApiGenавтоматически подставляетdbRoomиdbSessionчерез DI-процессор.
@GsApiBean
class UserApi(ctx: ApiBeanContext)
: DbBaseApiGen<User, UserDao, AppDatabase>(ctx) {
override val dao get() = dbRoom.userDao
override fun newEntity() = User()
fun seedDemo() {
// инициализация демо-данных
}
}
Создание Api на основе рефлексии#
Создайте класс.
Унаследуйте класс от
DbBaseApi.
Внимание
Раздел находится в разработке.
Оптимизация производительности#
Делайте
insertAll(list)черезApi— это всегда batch безforEach.Используйте
rowCacheдля реконфигурируемых фильтров:
запросили 500id, фильтруете в Kotlin-коде, не дёргая SQL повторно.