
Exposed - это легкая библиотека SQL на вершине драйвера JDBC для языка Kotlin. Exposed имеет два вкуса доступа к базе данных: Typesafe SQL Crapping DSL и легкие объекты доступа к данным (DAO).
С помощью Exposed у вас есть два варианта доступа к базе данных: обертка DSL и легкий DAO. Наш официальный талисман-это каракатировка, которая хорошо известна своей выдающейся способностью мимикрии, которая позволяет им плавно вписаться в любую среду. Подобно нашему талисману, выставка может использоваться для имитации различных двигателей баз данных, что помогает вам создавать приложения без зависимости от какого -либо конкретного двигателя базы данных и переключаться между ними с очень небольшими или без изменений.
H2 (версии 2.x; 1.x версия устарела и будет удалена в будущих выпусках)
(Кроме того, PostgreSQL с использованием драйвера PGJDBC-NG JDBC)
Выпуски открытых доступны в центральном репозитории Maven. Вы можете объявить этот репозиторий в своем сценарии сборки следующим образом:
ПРЕДУПРЕЖДЕНИЕ: вам может потребоваться установить свою цель Kotlin JVM на 8, а при использовании Spring to 17, чтобы это работало правильно:
Репозитории {// версии после 0.30.1 // версии до 0.30.1 недоступны для nowmavencentral ()
}Центральный репозиторий Maven включен по умолчанию для пользователей Maven.
Exposed состоит из следующих модулей:
базовый модуль выставленного ядра, который содержит оба DSL API вместе с картированием
Exposed-Crypt-предоставляет дополнительные типы столбцов для хранения зашифрованных данных в DB и кодировать/декодировать их на стороне клиента
открытый -дао - Dao API
Расширение Date-Time Day-Time на основе Java8 Time API
Exposed -JDBC - Внедрение уровня транспорта на основе JAVA JDBC API
Раскрытие Jodatime-расширения даты времени на основе библиотеки Jodatime
Расширения типа данных JSON и JSON и JSONB
Расширение Date-DateTime-Date-Time DateTemant-Time на основе Kotlinx-dateTime
Открытые деньги-Расширения для поддержки MonetaryAmount из "javax.money:money-Api"
Звездный старт-старт-стартер для Spring Boot для использования в качестве ORM вместо Hibernate
<зависимости>
<Зависимость>
<groupid> org.jetbrains.exposed </GroupId>
<ArtifactId> открытый Core </artifactid>
<версия> 0,56,0 </версия>
</Зависимость>
<Зависимость>
<groupid> org.jetbrains.exposed </GroupId>
<ArtifactId> открытый-crypt </artifactid>
<версия> 0,56,0 </версия>
</Зависимость>
<Зависимость>
<groupid> org.jetbrains.exposed </GroupId>
<Artifactid> exposed-dao </artifactid>
<версия> 0,56,0 </версия>
</Зависимость>
<Зависимость>
<groupid> org.jetbrains.exposed </GroupId>
<Artifactid> insected-java-time </artifactid>
<версия> 0,56,0 </версия>
</Зависимость>
<Зависимость>
<groupid> org.jetbrains.exposed </GroupId>
<Artifactid> exposed-jdbc </artifactid>
<версия> 0,56,0 </версия>
</Зависимость>
<Зависимость>
<groupid> org.jetbrains.exposed </GroupId>
<Artifactid> exposed Jodatime </artifactid>
<версия> 0,56,0 </версия>
</Зависимость>
<Зависимость>
<groupid> org.jetbrains.exposed </GroupId>
<Artifactid> exposed-json </artifactid>
<версия> 0,56,0 </версия>
</Зависимость>
<Зависимость>
<groupid> org.jetbrains.exposed </GroupId>
<Artifactid> exposed-kotlin-datetime </artifactid>
<версия> 0,56,0 </версия>
</Зависимость>
<Зависимость>
<groupid> org.jetbrains.exposed </GroupId>
<Artifactid> обнаженные деньги </artifactid>
<версия> 0,56,0 </версия>
</Зависимость>
<Зависимость>
<groupid> org.jetbrains.exposed </GroupId>
<Artifactid> inse-spring-boot-starter </artifactid>
<версия> 0,56,0 </версия>
</Зависимость>
</зависимости> зависимости {
реализация 'org.jetbrains.exposed:exposed-core:0.56.0'Implementation' org.jetbrains.exposed:exposed-crypt:0.56.0'Implementation 'org.jetbrains.exposed:exposed-dao:0.56.0'-имплей 'org.jetbrains.exposed:exposed-jdbc:0.56.0'
Внедрение 'org.jetbrains.exposed:exposed-jodatime:0.56.0'// orimplementation' org.jetbrains.exposed:exposed-java-time:0.56.0'// orimpleantation 'org.jetbrains.exposed: kotlin- DateTime: 0,56,0 '
Реализация 'org.jetbrains.exposed:exposed-json:0.56.0'Implementation' org.jetbrains.exposed:exposed-деньги: 0.56.0'Implementation 'org.jetbrains.exposed:exposed-spring-boot-starter:0.56. 0 '} В build.gradle.kts :
Val ExposedVersion: String By Project
зависимости {
реализация ("org.jetbrains.exposed:
реализация ("org.jetbrains.exposed:
реализация ("org.jetbrains.exposed:
реализация ("org.jetbrains.exposed:
Реализация ("org.jetbrains.Exposed:exposed jodatime:DexposedVersion") // orimplementation ("org.jetbrains.exposed: exposed-java-time:Dexposedversion") // Оримплеменция ("org.jetbrains.exposed: Exposedversion -Kotlin-datetime: $ exposedversion ")
реализация ("org.jetbrains.exposed:
реализация ("org.jetbrains.exposed:
Реализация ("org.jetbrains.Exposed:Exposed-spring-boot-starter:, $esposedversion")
} и в gradle.properties
exposedVersion=0.56.0
Проверьте образцы для быстрого начала.
В настоящее время Exposed доступен для сборки Maven/Gradle . Проверьте Maven Central и читайте, что начинается получить представление о разоблачении.
Для получения дополнительной информации посетите ссылки ниже:
Документация с примерами и документами
Участвуя в выставке
Миграционный гид
Нарушение изменений и любые детали миграции
Слабый канал
Выпуск трекер
Обратите внимание, что мы уходим от проблем GitHub для сообщения о ошибках и функциях. Пожалуйста, войдите в систему любые новые запросы на YouTrack. Вы должны войти в систему для просмотра и журнала проблем, в противном случае вас встретят 404.
У вас есть вопросы? Не стесняйтесь запросить приглашение на Slack Kotlinlang и присоединиться к разговору о проекте на нашем канале #Exposed.
Мы активно приветствуем ваши запросы на притяжение. Тем не менее, привлечение вашей работы с существующей проблемой является предпочтительным.
Вилка репо и создайте свою филиал из Main.
Назовите свою ветвь, что является описательным для работы, которую вы выполняете. т.е. добавляет новое.
Если вы добавили код, который должен быть протестирован, добавьте тесты и убедитесь, что тестовый набор проходит.
Убедитесь, что вы обращаетесь к любым предупреждениям Lint.
Если вы сделаете существующий код лучше, пожалуйста, сообщите нам об этом в своем PR -описании.
См. Руководство по вкладу для более подробной информации.
Импорт org.jetbrains.exposed.sql.*import org.jetbrains.exposed.sql.sqlexpressionbuilder.likeimport org.jetbrains.exposed.sql.transactions. Идентификатор ", 10) al name: column <string> = varchar (" name ", length = 50) val CityId: Column <Int?> = (integer ("city_id") ссылки Cities.id) .nullable () переопределить val primarykey = primarykey (id, name = "pk_user_id") // Имя не необязательно здесь} Объектные города: таблица (таблица (таблица (таблица (таблица ) {val id: column <int> = integer ("id"). autoincrement () val name: column <string> = varchar ("name", 50) переопределить val PrimaryKey = PrimaryKey (id, name = "pk_cities_id")
} fun main () {database.connect ("jdbc: h2: mem: test", driver = "org.h2.driver", user = "root", password = "")
транзакция {
addlogger (stdoutqlogger) schemautils.create (города, пользователи) val saintpertersburgid = cities.insert {
это [имя] = "Санкт -Петербург"} Получить Cities.idval munichid = cities.insert {
это [name] = "munich"} get cities.idval pragueid = cities.insert {
it.update (name, stringliteral ("prague") .trim (). substring (1, 2))
} [Cities.id] val praguename = cities.selectall (). Где {cities.id eq pragueid} .single () [cities.name] println ("praguename = $ praguename") users.insert {
это [id] = "andrey" it [name] = "andrey" it [users.cityid] = saintpetersburgid
} Users.insert {
это [id] = "sergey" it [name] = "sergey" it [users.cityid] = munichid
} Users.insert {
это [id] = "eugene" it [name] = "eugene" it [users.cityid] = munichid
} Users.insert {
это [id] = "alex" it [name] = "alect" it [users.cityid] = null} users.insert {
It [id] = "smth" it [name] = "что -то" it [users.cityid] = null} users.update ({users.id eq "" alex "}) {
Это [name] = "alexey"} users.deletewhere {users.name like "%thing"} println ("All Cities:") для (City in Cities.selectall ()) {println ("$ {City Cities. id]}: $ {city [cities.name]} ")
} println ("Ручное соединение:")
(Пользователи Innerjoin Cities)
. Select (users.name, cities.name)
.где {
(Users.id.eq ("andrey") или users.name.eq ("sergey")) andusers.id.eq ("sergey") и users.cityid.eq (cities.id)
} .foreach {println ("$ {it [users.name]} живет в $ {it [cities.name]}")
} println ("Присоединяйтесь к иностранному ключу:")
(Пользователи Innerjoin Cities)
. Select (users.name, users.cityId, cities.name)
. где {cities.name.eq ("St. Petersburg") или users.cityid.isnull ()}
.foreach {if (it [users.cityid]! = null) {println ("$ {it [users.name]} живет в $ {it [cities.name]}")
} else {println ("$ {it [users.name]} нигде живет")
}
} println ("функции и группа по:")
((Пользователи городов Innerjoin)
. Select (cities.name, users.id.count ())
.Groupby (Cities.Name)
) .foreach {val cityname = it [cities.name] val usercount = it [users.id.count ()] if (usercount> 0) {println ("$ usercount user (ы) )
} else {println ("никто не живет в $ cityname")
}
} Schemautils.drop (пользователи, города)
}
}Сгенерированный SQL:
SQL: Создайте таблицу, если не существует городов (id int auto_increment, имя varchar (50) не nul
SQL: Создайте таблицу, если не существует, пользователи (ID varchar (10), имя VARCHAR (50) не null, city_id int null, ограничение PK_USER_ID Первичный ключ (ID), ограничение FK_USERS_CITY_ID__ID Foreign Key (CITY_ID) Ссылки Cities (id) При ограничении обновления)
SQL: вставьте в города (имя) значения ('Санкт -Петербург')
SQL: вставьте в города (имя) значения («Мюнхен»)
SQL: вставьте в города (имя) значения (substring (trim ('prague'), 1, 2)))
SQL: Select Cities.id, Cities.name из городов, где города.id = 3praguename = pr
SQL: вставьте в пользователи (идентификатор, имя, city_id) values ('andrey', andrey ', 1)
SQL: вставьте в пользователи (идентификатор, имя, city_id) values ('sergey', 'sergey', 2)
SQL: вставьте в пользователи (ID, имя, City_id) Values ('Eugene', 'Eugene', 2)
SQL: вставьте в пользователи (id, имя, city_id) values ('alex', 'alex', null)
SQL: вставьте в пользователи (идентификатор, имя, city_id) values ('smth', 'что -то', null)
SQL: Обновление пользователей Установите имя = 'Alexey', где users.id = 'alex'sql: удалить из пользователей, где пользователи.
SQL: Select Cities.id, Cities.name из городов1: Санкт -Петербург2: Munich3: PR
Ручное соединение:
SQL: выберите users.name, cities.name из пользователей Inner Inner Cities on Cities.id = users.city_id where ((users.id = 'andrey') или (users.name = 'sergey')) и (users.id. = 'sergey') и (users.city_id = cities.id)
Сергей живет в Мюнхджоине с иностранным ключом:
SQL: выберите users.name, users.city_id, cities.
Андрей живет в Санкт -Петербурге
Функции и группа по:
SQL: Select Cities.Name, count (users.id) из городов Inner Inner присоединяется к пользователям на Cities.id = users.city_id Group By Cities.name1 Пользователи (ы) Live (ы) в Сент -Петербург2 (ы) ) в Мюнхене
SQL: Drop Table, если существует пользователи
SQL: Drop Table, если существует города Импорт org.jetbrains.exposed.dao.*import org.jetbrains.exposed.dao.id.entityidimport org.jetbrains.exposed.dao.id.intidtableimport org.jetbrains.exposed.sql.*Импорт org.jetbrains.exposed.sql.sql. .transactions.transactionObject Пользователи: intidTable () {val name = varchar ("name", 50) .index () val city = ссылка ("город", города) val age = integer ("age")
} Города объекта: intidTable () {val name = varchar ("name", 50)
} Пользователь класса (ID: EntityId <int>): intentity (id) {companion object: intentityclass <user> (пользователи) var name от пользователей.
} class City (id: EntityId <int>): intentity (id) {Companion Object: intentityClass <Tys> (города) Имя VAR от пользователей Cities.Nameval от пользователей users.city.city.city.city.city.city.
} fun main () {database.connect ("jdbc: h2: mem: test", driver = "org.h2.driver", user = "root", password = "")
транзакция {
addlogger (stdoutsqllogger) schemautils.create (города, пользователи) val stpete = city.new {
name = "Санкт -Петербург"} val munich = city.new {
name = "munich"} user.new {
name = "a" city = stpete
возраст = 5} user.new {
name = "B" City = stpete
возраст = 27} user.new {
name = "c" City = Munich
AGE = 42} println ("Cities: $ {city.all (). CocipString {it.name}}") println ("Пользователи в $ {stpete.name}: $ {stpete.users.jointoString {it.name} } ") println (" Взрослые: $ {user.find {user.age больше {it.name}} ")
}
}Сгенерированный SQL:
SQL: Создайте таблицу, если не существует городов (ID int auto_increment Первичный ключ, имя varchar (50) не null)
SQL: Создайте таблицу, если не существует, пользователи (id int auto_increment Первичный ключ, имя varchar (50), а не null, city int int int, возраст int int nt nul ОГРАНИЧИВАТЬ)
SQL: Создание index users_name на пользователях (имя)
SQL: вставьте в города (имя) значения ('Санкт -Петербург')
SQL: вставьте в города (имя) значения («Мюнхен»)
SQL: Select Cities.id, Cities.Name из городов
Города: Санкт -Петербург, Мюнхен
SQL: вставьте в пользователи (имя, город, возраст) значения ('a', 1, 5)
SQL: вставьте в пользователи (имя, город, возраст) значения ('b', 1, 27)
SQL: вставьте в пользователи (имя, город, возраст) значения ('c', 2, 42)
SQL: Select users.id, users.name, users.city, users.age от пользователей, где пользователи.
SQL: Select users.id, users.name, users.city, users.age от пользователей, где users.age> = 18adults: b, cПожалуйста, смотрите Руководство по взносу, прежде чем внести свой вклад.
Внося вклад в проект «Развитый», вы соглашаетесь с тем, что ваши взносы будут лицензироваться по Apache License, версия 2.0.