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.