Как стать автором
Поиск
Написать публикацию
Обновить

TrueSql – заново учимся ходить в базу данных. Часть 2 – количество обновленных строк и сгенерированные колонки

Уровень сложностиПростой
Время на прочтение2 мин
Количество просмотров793

Вступление

В первой части мы научили команду разработчиков пяти Fetch. По запросу ветерана кровавых энтерпрайз-войн из первой части (тот, который разбился на spring-паровозике), мы продолжим двумя короткими но важными темами: получение сгенерированных колонок и количества обновленных строк.

Сгенерированные колонки

В классической бэкенд-разработке часто встречается следующая задача: нужно вставить новую строку в таблицу и забрать её id. Иногда подобную возможность базы данных предоставляют на уровне sql-синтаксиса: returning в PG, Oracle, MariaDB и output в SQL Server. JDBC предлагает переносимое решение – метод .getGeneratedKeys(), который реализует эту функциональность. Разумеется, она доступна и в TrueSql:

var id = ds.q(
  "insert into users values(default, ?, ?)", 
  "Boris", "pro drinker"
).asGeneratedKeys("id").fetchOne(long.class);

Конечно же, .asGeneratedKeys(String cols ...) работает и с .g .

var billDiscount = ds.q("""
  update bill 
  set discount = amount * ?
  where type = ?""", new BigDecimal("0.2"), 3
)
  .asGeneratedKeys("id", "discount")
  .g.fetchList(Discount.class);

Здесь мы сделали скидку на все чеки с типом 3, вернули id чека и размер скидки. Получение сгенерированных колонок в TrueSql делается очень просто и, что важно, без ограничений сочетается с остальными возможностями TrueSql.

Количество обновленных строк

Иногда бывает удобно/необходимо узнать сколько строк обновил наш SQL-запрос. В JDBC для этого предусмотрен .getUpdateCount(), а у нас .withUpdateCount:

var updateCount = ds.q(
   "update bill set discount = ? where bill.date = ?",
   new BigDecimal("0.2"), LocalDate.of(2025, 3, 13)
).withUpdateCount.fetchNone();

В данном примере мы вернули только количество обновленных строк, переменная updateCount будет иметь тип long. В примере ниже рассмотрим сочетание .withUpdateCount с .asGeneratedKeys().

var updatedBills = ds.q(
  "update bill set discount = amount * ?", new BigDecimal("0.2")
)
  .asGeneratedKeys("id", "discount")
  .withUpdateCount
  .g.fetchList(Discount.class);

Переменная updatedBills будет иметь следующую структуру: UpdateResult{Long updateCount, List<Discount> value}. Таким образом, TrueSql продолжает демонстрировать чудеса композиции.

Как правило, самый простой подход оказывается самым эффективным

TrueSql даёт удобный comptime-safe API к возможностям JDBC. Количество кода минимально, он прозрачен. Писать на TrueSql после Spring Data это как есть супчик ложкой, а не вилкой. В следующих сериях мы продолжим борьбу за здравый смысл!

Сайт проекта: https://truej.net/

Наш TG-канал. Тут вы можете задавать свои вопросы, находить ответы.

Документация. Всем, кто уже настрадался с паровозиком Spring Data и его друзьями, предлагаю поставить звездочку. Может это спасет вас от кривой Фреди-Крюгера.

В следующих частях:

  • Транзакции и работа с соединениями

  • Хранимые процедуры

  • unfold-параметры

  • Батчинг

  • Композиция TrueSql DSL

  • Ча-Ча-Ча с базой данных – advanced fetching

Теги:
Хабы:
Всего голосов 1: ↑0 и ↓1-1
Комментарии0

Публикации

Ближайшие события