
Exposto é uma biblioteca SQL leve em cima de um driver JDBC para o idioma Kotlin. Exposed possui dois sabores de acesso ao banco de dados: TypeAfe SQL WAPPURT DSL e Lightweight Data Access Objects (DAO).
Com o exposto, você tem duas opções para acesso ao banco de dados: embrulhar DSL e um DAO leve. Nosso mascote oficial é o choco, o que é conhecido por sua excelente capacidade de imitação que permite que ele se misture perfeitamente a qualquer ambiente. Semelhante ao nosso mascote, exposto pode ser usado para imitar uma variedade de mecanismos de banco de dados, o que ajuda a criar aplicativos sem dependências em qualquer mecanismo de banco de dados específico e alternar entre eles com muito poucas ou nenhuma alteração.
H2 (versões 2.x; 1.x A versão é descontinuada e será removida em versões futuras)
(Além disso, PostgreSQL usando o driver PGJDBC-NG JDBC)
Os lançamentos de expostos estão disponíveis no repositório central do MAVEN. Você pode declarar este repositório em seu script de construção da seguinte forma:
Aviso: pode ser necessário definir seu alvo Kotlin JVM como 8 e, ao usar a primavera para 17, para que isso funcione corretamente:
Repositórios {// versões após 0,30.1 // versões antes de 0,30.1 não está disponível para NowMavencentral ()
}O repositório central do MAVEN é ativado por padrão para usuários do Maven.
Exposed consiste nos seguintes módulos:
Módulo de base exposto - que contém a API DSL junto com o mapeamento
Exposto-Crypt-fornece tipos adicionais de coluna para armazenar dados criptografados em db e codificar/decodificá-los no lado do cliente
API exposta -dao - dao
Expostos-Java-Time-Extensões de data-hora com base na API de tempo Java8
Exposto -JDBC - Implementação do nível de transporte com base na API Java JDBC
Exposto de Jodatime-Extensões de data-hora baseadas na biblioteca Jodatime
Expostos -Json - Extensões de tipo de dados JSON e JSONB
Exposto-Kotlin-DateTime-Extensões de data-hora baseadas em Kotlinx-DateTime
dinheiro exposto-extensões para apoiar o MonetaryAmount de "javax.money:money-api"
Starter exposto-spring-boot-um acionador de partida para utilizar a exposição como o ORM em vez de hibernar
<pendências>
<pendência>
<GrupidId> org.Jetbrains.exposed </frugiD>
<stifactId> exposto-core </stifactId>
<versão> 0.56.0 </versão>
</dependency>
<pendência>
<GrupidId> org.Jetbrains.exposed </frugiD>
<stifactId> exposto-crrypt </stifactId>
<versão> 0.56.0 </versão>
</dependency>
<pendência>
<GrupidId> org.Jetbrains.exposed </frugiD>
<TarfactId> exposto-dao </stifactId>
<versão> 0.56.0 </versão>
</dependency>
<pendência>
<GrupidId> org.Jetbrains.exposed </frugiD>
<TarfactId> exposto-Java-Time </stifactId>
<versão> 0.56.0 </versão>
</dependency>
<pendência>
<GrupidId> org.Jetbrains.exposed </frugiD>
<TarfactId> exposto-jdbc </sutifactId>
<versão> 0.56.0 </versão>
</dependency>
<pendência>
<GrupidId> org.Jetbrains.exposed </frugiD>
<TarfactId> exposto-Jodatime </sutifactId>
<versão> 0.56.0 </versão>
</dependency>
<pendência>
<GrupidId> org.Jetbrains.exposed </frugiD>
<stifactId> exposto-json </stifactId>
<versão> 0.56.0 </versão>
</dependency>
<pendência>
<GrupidId> org.Jetbrains.exposed </frugiD>
<TarifactId> exposto-kotlin-DateTime </stifactId>
<versão> 0.56.0 </versão>
</dependency>
<pendência>
<GrupidId> org.Jetbrains.exposed </frugiD>
<stifactId> dinheiro exposto </stifactId>
<versão> 0.56.0 </versão>
</dependency>
<pendência>
<GrupidId> org.Jetbrains.exposed </frugiD>
<TarifactId> Exposto-Spring-Boot-Starter </stifactId>
<versão> 0.56.0 </versão>
</dependency>
</dependências> dependências {
implementação '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'Mplementation 'Org.Jetbrains.Exposed:Exposed-jdbc:0.56.0'
implementação 'org.Jetbrains.exposed:Exposed-Jodatime:0.56.0'// orimplementation' org.jetbrains.exposed:exposed-java-the-the DateTime: 0,56,0 '
implementação 'org.Jetbrains.exposed:Exposed-json:0.56.0'implementation' org.jetbrains.exposed:exposed-money:0.56.0'implementation 'org.jetbrains.exposed:exposed-spring-boot-starter:0.56. 0 '} Em build.gradle.kts :
Val ExposedVersion: String by Project
dependências {
implementação ("org.Jetbrains.exposed:Exposed-core:$ExposedVersion")
implementação ("org.Jetbrains.exposed:Exposed-Crypt:$ExposedVersion")
implementação ("org.Jetbrains.exposed:Exposed-dao:$Exposedversion")
implementação ("org.jetbrains.exposed:exposed-jdbc:$exposedversion")
implementação ("org.jetbrains.exposed:exposed-jodatime:$exposedVersion") // orimplementation ("org.jetbrains.exposed:exposed-java-time:$exposedVersion") // orimplementation ("org.jetbrains.exposedversion -kotlin-DateTime: $ exposedVersion ")
implementação ("org.Jetbrains.exposed:Exposed-json:$ExposedVersion")
implementação ("org.Jetbrains.exposed:Exposed-Money:$Exposedversion")
implementação ("org.jetbrains.exposed: Exposed-spring-boot-starter:$ExposedVersion")
} e em gradle.properties
exposedVersion=0.56.0
Confira as amostras para um início rápido.
Atualmente, exposto está disponível para compilações Maven/Gradle . Verifique o MAVEN CENTRAL e a leitura, comece a obter uma visão sobre a configuração exposta.
Para mais informações, visite os links abaixo:
Documentação com exemplos e documentos
Contribuindo para expostos
Guia de migração
Quebrando mudanças e detalhes de migração
Canal frouxo
Rastreador de emissão
Observe que estamos nos afastando dos problemas do GitHub para relatar bugs e recursos. Por favor, registre quaisquer novas solicitações no YouTrack. Você deve estar conectado para visualizar e registrar problemas, caso contrário, será recebido com um 404.
Você tem perguntas? Sinta -se à vontade para solicitar um convite para a Slack Kotlinlang e participar da conversa do projeto em nosso canal #exposed.
Congratulamo -nos ativamente com seus pedidos de tração. No entanto, vincular seu trabalho a um problema existente é preferido.
Bick o repositório e crie seu ramo a partir de Main.
Nomeie seu ramo algo descritivo para o trabalho que você está fazendo. ou seja, acrescenta novidade.
Se você adicionou código que deve ser testado, adicione testes e verifique se o conjunto de testes passa.
Certifique -se de abordar todos os avisos de fiapos.
Se você melhorar o código existente, informe -nos em sua descrição de relações públicas.
Veja as diretrizes de contribuição para obter mais detalhes.
importar org.Jetbrains.exposed.sql. id ", 10) Val Nome: Coluna <String> = varchar (" nome ", comprimento = 50) val cityId: Column<Int?> = (integer("city_id") references Cities.id).nullable()override val primaryKey = PrimaryKey(id, name = "PK_User_ID") // name is optional here}object Cities : Table( ) {val id: coluna <int> = integer ("id"). AutoinCrement () val Nome: Column <tring> = varchar ("nome", 50) Substituir Val PrimaryKey = PrimaryKey (id, nome = "pk_cities_id")
} diversão main () {database.connect ("jdbc: h2: MEM: test", driver = "org.h2.driver", user = "root", senha = "")
transação {
addLogger (stdoutSqllogger) schemautils.create (cidades, usuários) val santpetersburgid = cities.insert {
[nome] = "São Petersburgo"} Get Cities.idval Munichid = Cities.insert {
[nome] = "Munique"} Get Cities.idval Pragaeid = Cities.insert {
It.Update (Nome, Stringliteral ("Praga") .Trim (). Substring (1, 2))
} [Cities.id] Val Praguename = Cities.Selectall (). Onde {Cities.id Eq Pragueid} .single () [cities.name] println ("Praguename = $ Praguename") Users.insert {
É [id] = "Andrey" it [nome] = "Andrey" it [users.cityId] = saintpetersburgid
} Users.insert {
[id] = "Sergey" it [nome] = "Sergey" it [users.cityid] = munichid
} Users.insert {
[id] = "eugene" it [nome] = "eugene" it [users.cityid] = munichid
} Users.insert {
it [id] = "Alex" it [nome] = "Alex" it [users.cityid] = null} users.insert {
it [id] = "smth" it [name] = "algo" it [users.cityid] = null} users.update ({users.id eq "Alex"}) {
it [name] = "Alexey"} users.deletewhere {users.name como "%coisa"} println ("Todas as cidades:") para (City in cities.Selecttall ()) {println ("$ {City [cidades. id]}: $ {city [cities.name]} ")
} println ("junção manual:")
(Usuários INnerjoin Cities)
.Select (Users.name, cities.name)
.onde {
(Users.id.eq ("Andrey") ou usuários.name.eq ("Sergey") AndUsers.id.eq ("Sergey") e Users.cityid.eq (cities.id)
} .ForEach {println ("$ {it [usuários.name]} vive em $ {it [cities.name]}")
} println ("Junte -se com a chave estrangeira:")
(Usuários INnerjoin Cities)
.Select (Users.Name, Users.CityId, Cities.Name)
. Onde {cities.name.eq ("St. Petersburg") ou Users.cityid.isnull ()}
.ForEach {if (it [users.cityid]! = null) {println ("$ {it [usuários.name]} vive em $ {it [cities.name]}")
} else {println ("$ {it [users.name]} vive nenhum lugar")
}
} println ("Funções e grupo por:")
((Cidades innerjoin Usuários)
.Select (Cities.Name, Users.id.Count ())
.groupby (cities.name)
) .Foreach {val CityName = [cities.name] valercount = [ususers.id.count ()] if (userCount> 0) {println ("$ userCount Usuário (s) ao vivo (s) em $ CityName" )
} else {println ("Ninguém mora em $ CityName")
}
} Schemautils.drop (usuários, cidades)
}
}SQL gerado:
SQL: Criar tabela se não existir cidades (id int auto_increntle, nome varchar (50) não nulo, restrição pk_cities_id chave primária (id))
SQL: Crie a tabela se não existe usuários (id varchar (10), nome varchar (50) não nulo, city_id int null, restrição pk_user_id chave primária (id), restrição fk_users_city_id__id Key estrangeiro (city_id) refere -se cidades (id) na exclusão de restrição restrita Na atualização restrita)
SQL: Inserir em cidades (nome) valores ('São Petersburgo')
SQL: Inserir em cidades (nome) valores ('Munique')
SQL: Inserir em cidades (nome) valores (substring (Trim ('Praga'), 1, 2))
Sql: selecione cidades.id, cidades.name de cidades onde cidades.id = 3praguename = pr
SQL: Inserir nos usuários (id, nome, city_id) valores ('Andrey', 'Andrey', 1)
SQL: Inserir em usuários (ID, nome, City_Id) valores ('Sergey', 'Sergey', 2)
SQL: Inserir nos usuários (ID, nome, City_Id) valores ('Eugene', 'Eugene', 2)
SQL: Inserir em usuários (id, nome, city_id) valores ('Alex', 'Alex', NULL)
SQL: Insira nos usuários (id, nome, city_id) valores ('smth', 'algo', nulo)
SQL: Usuários de atualização Defina o nome = 'Alexey' onde usuários.id = 'Alex'SQL: exclua dos usuários onde usuários.name como'%Thing 'todas as cidades:
SQL: Select Cities.id, Cities.Name das Cities1: St. Petersburg2: Munich3: PR
Junto manual:
SQL: selecione usuários.name, cities.name dos usuários Interior Junção cities on cities.id = users.city_id where ((users.id = 'Andrey') ou (usuários.name = 'Sergey')) e (usuários.id.id = 'Sergey') e (usuários.city_id = cities.id)
Sergey vive em Munichjoin com a Chave Estrangeira:
SQL: selecione usuários.name, users.city_id, cities.name dos usuários Interior Junção de cidades em cidades.id = usuários.city_id where (cities.name = 'St. Petersburg') ou (usuários.city_id é nulo)
Andrey mora em São Petersburgo
Funções e grupo por:
SQL: Selecione Cities.name, count (users.id) de cidades ingressos Juntir usuários em cidades.id = users.city_id grupo por cidades.name1 Usuário (s) Live (s) em St. Petersburg2 Usuário (s) ao vivo (s (s) ) em Munique
SQL: Tabela de soltar se existir usuários
SQL: Tabela de soltar se houver cidades importar org.jetbrains.exposed.dao.*importar org.jetbrains.exposed.dao.id.entityidimport org.jetbrains.exposed.dao.id.intidtableImport org.jetbrains.exposed.sql. .Transactions.TransactionObject Usuários: IntidTable () {Val Nome = Varchar ("Nome", 50) .Index () Val City = Referência ("Cidade", Cidades) Val Age = Inteiro ("Idade")
} Cidades do objeto: intidTable () {val name = varchar ("nome", 50)
} classe Usuário (ID: entityId <int>): Intentity (ID) {Companion Object: IntentityClass <suser> (Usuários) Var nome por usuários.namevar cidade por cidade referenceton users.cityvar idade by users.age
} classe City (ID: EntityId <int>): Intentity (ID) {Objeto Companion: IntentityClass <City> (cidades) VAR Nome By Cities.NameVal Usuários de Usuários de Usuários do Usuários.City.City.City
} diversão main () {database.connect ("jdbc: h2: MEM: test", driver = "org.h2.driver", user = "root", senha = "")
transação {
addLogger (stdoutSqlloGger) schemautils.create (cidades, usuários) val stpete = city.new {
Nome = "São Petersburgo"} Val Munich = City.New {
name = "Munique"} User.new {
Nome = "A" City = Stpete
idade = 5} user.new {
Nome = "B" City = Stpete
idade = 27} user.new {
Nome = "C" City = Munique
idade = 42} println ("cidades: $ {city.all (). JointString {it.name}}") println ("usuários em $ {stpete.name}: $ {stpete.users.jointostring {it.name} } ") println (" adultos: $ {user.find {users.age maioreq 18} .Jointostring {it.name}} ")
}
}SQL gerado:
SQL: Criar tabela se não existe cidades (id int auto_increntlement chave primária, nome Varchar (50) não nulo)
SQL: Crie a tabela se não existe usuários (ID int Auto_Increment Primária Chave, Nome Varchar (50) NÃO NULL, CITY NO NULL, AGE NÃO NULL, RESTIR FK_USERS_CITY__ID CHAVE ESTRAGENS (Cidade) Referências Cidades (ID) Sobre Excluir Restringir na Atualização RESTRINGIR)
SQL: Crie Index Users_name nos usuários (nome)
SQL: Inserir em cidades (nome) valores ('São Petersburgo')
SQL: Inserir em cidades (nome) valores ('Munique')
SQL: selecione cidades.id, cidades.name das cidades
Cidades: São Petersburgo, Munique
SQL: Inserir nos usuários (nome, cidade, idade) valores ('a', 1, 5)
SQL: Inserir nos usuários (nome, cidade, idade) valores ('b', 1, 27)
SQL: Inserir em usuários (nome, cidade, idade) valores ('c', 2, 42)
SQL: selecione usuários.id, usuários.name, users.city, usuários.age dos usuários onde usuários.city = 1Users em St. Petersburg: a, b, b
SQL: selecione usuários.id, usuários.name, users.city, usuários.age dos usuários onde usuários.age> = 18Adults: b, c, c,Consulte o guia de contribuição antes de contribuir.
Ao contribuir para o projeto exposto, você concorda que suas contribuições serão licenciadas sob licença Apache, versão 2.0.