
Exposed adalah perpustakaan SQL ringan di atas driver JDBC untuk bahasa Kotlin. Exposed memiliki dua rasa akses database: DSL pembungkus SQL TypeSafe dan Objek Akses Data Ringan (DAO).
Dengan terbuka, Anda memiliki dua opsi untuk akses basis data: membungkus DSL dan DAO yang ringan. Maskot resmi kami adalah Cumi-cumi, yang terkenal dengan kemampuan mimikrinya yang luar biasa yang memungkinkannya untuk berbaur dengan mulus ke lingkungan apa pun. Mirip dengan maskot kami, terpapar dapat digunakan untuk meniru berbagai mesin basis data, yang membantu Anda membangun aplikasi tanpa dependensi pada mesin database tertentu dan beralih di antara mereka dengan sangat sedikit atau tanpa perubahan.
H2 (versi 2.x; 1.x versi sudah usang dan akan dihapus dalam rilis mendatang)
(Juga, PostgreSQL menggunakan driver JDBC PGJDBC-NG)
Rilis yang terpapar tersedia di repositori pusat Maven. Anda dapat mendeklarasikan repositori ini dalam skrip build Anda sebagai berikut:
Peringatan: Anda mungkin perlu mengatur target Kotlin JVM Anda menjadi 8, dan saat menggunakan pegas ke 17, agar ini berfungsi dengan baik:
Repositori {// Versi Setelah 0,30.1 // Versi sebelum 0.30.1 tidak tersedia untuk NowMavencentral ()
}Repositori Maven Central diaktifkan secara default untuk pengguna Maven.
Exposed terdiri dari modul berikut:
Modul Basis -inti -Core, yang berisi DSL API bersama dengan pemetaan
Crypt yang terbuka-Menyediakan jenis kolom tambahan untuk menyimpan data terenkripsi dalam DB dan mengkode/mendekodenya di sisi klien
Exposed -Dao - DAO API
Exposed-Java-Time-Perpanjangan Waktu Tanggal Berdasarkan Java8 Time API
Exposed -JDBC - Implementasi Level Transportasi Berdasarkan Java JDBC API
Exposed-Jodatime-Perpanjangan Waktu Tanggal Berdasarkan Perpustakaan Jodatime
Ekspose -json - ekstensi tipe data JSON dan JSONB
Ekspos-Kotlin-Datetime-Perpanjangan Tanggal-Waktu Berdasarkan Kotlinx-Datetime
Uang Uang-Ekstensi untuk Mendukung MonetaryAmount dari "Javax.Money:money-API"
STARTER BOOT-BOOT-SPRING-A Starter for Spring Boot untuk memanfaatkan Exposed sebagai ORM alih-alih Hibernate
<Ketergantungan>
<mendeken>
<groupId> org.jetbrains.Eksposed </groupid>
<Artifactid> Ekspos-core </arttifactid>
<Version> 0.56.0 </version>
</dependency>
<mendeken>
<groupId> org.jetbrains.Eksposed </groupid>
<Artifactid> Terkena-Crypt </artifactid>
<Version> 0.56.0 </version>
</dependency>
<mendeken>
<groupId> org.jetbrains.Eksposed </groupid>
<Artifactid> terpapar-dao </arttifactid>
<Version> 0.56.0 </version>
</dependency>
<mendeken>
<groupId> org.jetbrains.Eksposed </groupid>
<Artifactid> Exposed-java-time </t Artifactid>
<Version> 0.56.0 </version>
</dependency>
<mendeken>
<groupId> org.jetbrains.Eksposed </groupid>
<Artifactid> terpapar-jdbc </stifactid>
<Version> 0.56.0 </version>
</dependency>
<mendeken>
<groupId> org.jetbrains.Eksposed </groupid>
<ArTifactid> terpapar-jodatime </arttifactid>
<Version> 0.56.0 </version>
</dependency>
<mendeken>
<groupId> org.jetbrains.Eksposed </groupid>
<Artifactid> terpapar-json </arttifactid>
<Version> 0.56.0 </version>
</dependency>
<mendeken>
<groupId> org.jetbrains.Eksposed </groupid>
<Artifactid> terpapar-Kotlin-Datetime </RiTifactid>
<Version> 0.56.0 </version>
</dependency>
<mendeken>
<groupId> org.jetbrains.Eksposed </groupid>
<Artifactid> Uang-Mata </artifactid>
<Version> 0.56.0 </version>
</dependency>
<mendeken>
<groupId> org.jetbrains.Eksposed </groupid>
<ArTifactid> terpapar-boot-starter </stifactid>
<Version> 0.56.0 </version>
</dependency>
</dependensi> dependensi {
Implementasi 'org.jetbrains.Exposed:Exposed-core:0.56.0'Implement' org.jetBrains.Exposed:Exposed-crypt:0.56.0'Implementation 'org.jetbrains.exposed:Exposed-dao:0.56.0'Implemation 'org.jetbrains.Exposed:Exposed-jdbc:0.56.0'
Implementasi 'org.jetbrains.Exposed:Exposed-jodatime:0.56.0'// orimplementation' org.jetbrains.exposed:Exposed-java-time:0.56.0'// orimplementasi 'org.jetbrains.Exposed: exposed-kot-kot- Datetime: 0.56.0 '
Implementasi 'org.jetBrains.Exposed:Exposed-json:0.56.0'Implementation' org.jetbrains.Exposed: Exposed-money:0.56.0'Implementation 'org.jetbrains.exposed: exposed-pring-boot-starter:0.56. 0 '} Di build.gradle.kts :
Val ExposedVersion: String menurut proyek
dependensi {
Implementasi ("org.jetbrains.Exposed: Exposed-core:$ exposedVersion")
Implementasi ("org.jetbrains.Exposed: Exposed-crypt :$ exposedVersion")
Implementasi ("org.jetbrains.Exposed: Exposed-Dao:$ exposedVersion")
Implementasi ("org.jetbrains.Exposed:Exposed-jdbc:$exposedVersion")
Implementasi ("org.jetbrains.Exposed:Exposed-jodatime:$ exposedVersion") // orimplementation ("org.jetbrains.Exposed:Exposed-java-time: exposedversion") // ormplementation ("org.jetbrains.exposed:exposed:exposed -kotlin-Datetime: $ ExposedVersion ")
Implementasi ("org.jetbrains.Exposed: Exposed-json :$ exposedVersion")
Implementasi ("org.jetbrains.Exposed: Exposed-money:$ exposedVersion")
Implementasi ("org.jetbrains.Exposed: Exposed-Spring-Boot-Starter :$ exposedVersion")
} dan di gradle.properties
exposedVersion=0.56.0
Lihat sampel untuk awal yang cepat.
Saat ini, Exposed tersedia untuk Maven/Gradle Builds . Periksa Maven Central dan baca mulai mendapatkan wawasan tentang pengaturan yang terbuka.
Untuk informasi lebih lanjut, kunjungi tautan di bawah ini:
Dokumentasi dengan contoh dan dokumen
Berkontribusi pada yang terpapar
Panduan Migrasi
Melanggar perubahan dan detail migrasi apa pun
Saluran slack
Pelacak masalah
Harap dicatat bahwa kami menjauh dari masalah GitHub untuk melaporkan bug dan fitur. Harap logam permintaan baru di YouTrack. Anda harus masuk untuk melihat dan mencatat masalah, jika tidak, Anda akan bertemu dengan 404.
Apakah Anda punya pertanyaan? Jangan ragu untuk meminta undangan untuk Kotlinlang Slack dan bergabung dengan percakapan proyek di saluran #Exposed kami.
Kami secara aktif menyambut permintaan tarikan Anda. Namun, menghubungkan pekerjaan Anda ke masalah yang ada lebih disukai.
Garakan repo dan buat cabang Anda dari Main.
Sebutkan cabang Anda sesuatu yang deskriptif untuk pekerjaan yang Anda lakukan. yaitu menambahkan hal baru.
Jika Anda telah menambahkan kode yang harus diuji, tambahkan tes dan pastikan test suite lulus.
Pastikan Anda membahas peringatan serat apa pun.
Jika Anda membuat kode yang ada lebih baik, beri tahu kami dalam deskripsi PR Anda.
Lihat Pedoman Kontribusi untuk detail lebih lanjut.
Impor org.jetBrains.Exposed.sql.*Impor org.jetBrains.Exposed.sql.sqlexpressionBuilder., Likeimport org.jetBrains.Exposed.sql.transactions.transactionObject pengguna: Tabel () {val id: kolom <string> = varchar (" ID ", 10) Nama Val: Kolom <String> = varchar (" Name ", Length = 50) Val CityID: COLMOL <int?> = (integer ("city_id") Referensi Cities.id) .nullable () override val primaryKey = primaryKey (id, name = "pk_user_id") // Nama opsional di sini} Kota objek: tabel (tabel ( ) {val id: kolom <ItT> = integer ("id"). AutoINCREMENT () Nama Val: Kolom <String> = varchar ("Name", 50) Override Val PrimaryKey = PrimaryKey (id, name = "pk_cities_id")
} fun main () {database.connect ("jdbc: h2: mem: test", driver = "org.h2.driver", user = "root", password = "")
transaksi {
addlogger (stdoutsqllogger) schemautils.create (kota, pengguna) Val Saintpetersburgid = City.insert {
IT [name] = "St. Petersburg"} Dapatkan kota.idval munichid = Cities.insert {
itu [name] = "munich"} get cities.idval pragueid = cities.insert {
it.update (name, stringliteral ("prague") .trim (). substring (1, 2))
} [Cities.id] val praguename = cities.selectall (). Where {cities.id eq pragueid} .single () [Cities.name] println ("praguename = $ praguename") pengguna.
itu [id] = "andrey" itu [name] = "andrey" it [users.cityid] = Saintpetersburgid
} Users.insert {
itu [id] = "Sergey" it [name] = "Sergey" it [users.cityid] = munichid
} Users.insert {
itu [id] = "eugene" itu [name] = "eugene" it [users.cityid] = munichid
} Users.insert {
IT [id] = "Alex" it [name] = "Alex" it [Users.cityId] = null} Users.insert {
itu [id] = "smth" it [name] = "sesuatu" itu [users.cityid] = null} user.update ({{users.id eq "Alex"}) {
itu [name] = "Alexey"} Users.deletewhere {Users.name Like "%thing"} println ("All Cities:") untuk (City in Cities.selectall ()) {println ("$ {City [kota. id]}: $ {City [Cities.Name]} ")
} println ("Manual gabungan:")
(Pengguna Kota Innefoin)
.select (users.name, Cities.name)
.Di mana {
(Users.id.eq ("Andrey") atau Users.name.eq ("Sergey")) andUsers.id.eq ("Sergey") dan Users.cityid.eq (City.id)
} .foreach {println ("$ {it [Users.name]} tinggal di $ {it [cities.name]}")
} println ("Bergabunglah dengan kunci asing:")
(Pengguna Kota Innefoin)
.select (users.name, users.cityid, cities.name)
.where {cities.name.eq ("ST. Petersburg") atau user.cityid.isnull ()}
.foreach {if (it [Users.cityId]! = null) {println ("$ {it [Users.name]} tinggal di $ {it [cities.name]}")
} else {println ("$ {it [Users.name]} Lives Nowhere")
}
} println ("Fungsi dan grup dengan:")
((Pengguna Kota Innefoin)
.select (Cities.name, users.id.count ())
.groupby (Cities.Name)
) .foreach {val cityname = it [City.Name] val usercount = it [users.id.count ()] if (usercount> 0) {println ("$ usercount pengguna langsung di $ cityname" )
} else {println ("Nobody Lives in $ CityName")
}
} Schemautils.drop (pengguna, kota)
}
}SQL yang dihasilkan:
SQL: Buat tabel jika tidak ada kota (id int auto_increment, nama varchar (50) bukan nol, kendala pk_cities_id kunci utama (id))
SQL: Buat tabel jika tidak ada pengguna (id varchar (10), nama varchar (50) bukan null, city_id int null, kendala pk_user_id kunci primer (id), kendala fk_users_city_id__id kunci asing (city_id) referensi kota (id) pada helete batasi Pada pembaruan pembaruan)
SQL: Sisipkan ke Kota (Nama) Nilai ('St. Petersburg')
SQL: Sisipkan ke Kota (Nama) Nilai ('Munich')
SQL: Sisipkan ke Nilai Kota (Nama) (Substring (trim ('Prague'), 1, 2))
SQL: SELECT CITY.ID, CITIES.NAME DARI KOTA DI MANA KOTS.ID = 3PRAGUENAME = PR
SQL: Sisipkan ke Pengguna (ID, Nama, City_ID) Value ('Andrey', 'Andrey', 1)
SQL: Sisipkan ke Pengguna (ID, NAME, CITY_ID) Values ('Sergey', 'Sergey', 2)
SQL: Sisipkan ke Nilai Pengguna (ID, Nama, City_ID) ('Eugene', 'Eugene', 2)
SQL: Sisipkan ke Pengguna (ID, Nama, City_ID) Value ('Alex', 'Alex', Null)
SQL: Sisipkan ke Pengguna (ID, NAME, CITY_ID) Value ('smth', 'Something', null)
SQL: UPDATE Pengguna Set Nama = 'Alexey' Where Users.id = 'Alex'Sql: Hapus dari pengguna di mana pengguna.name seperti'%hal 'semua kota:
SQL: Pilih kota.id, kota.name dari kota1: St. Petersburg2: Munich3: PR
Manual Bergabung:
SQL: Pilih Users.Name, Cities.Name dari Pengguna Dalam Gabung Kota di Cities.id = Users.city_id Where ((Users.id = 'Andrey') atau (Users.name = 'Sergey') dan (Users.id = 'Sergey') dan (Users.city_id = City.id)
Sergey tinggal di munichjoin dengan kunci asing:
SQL: Pilih Users.Name, Users.city_id, Cities.name dari pengguna bagian dalam bergabung dengan kota di kota.id = user.city_id di mana (cities.name = 'St. Petersburg') atau (Users.city_id adalah nol)
Andrey tinggal di St. Petersburg
Fungsi dan grup dengan:
SQL: SELECT CITY.NAME, COUNT (USERS.ID) dari City Inner bergabung dengan pengguna di kota.id = Users.city_id grup oleh City.name1 USER (s) Live (s) di St. Petersburg2 USER (s) Live (s) ) di Munich
SQL: Table drop If Exists
SQL: Jatuhkan tabel jika ada kota Impor org.jetbrains.exposed.dao.*Impor org.jetbrains.exposed.dao.id.entityidimport org.jetbrains.exposed.dao.id.intidtableImport org.jetbrains.exposed.sql.*Impor org.jetbrains.exposed .transactions.transactionObject pengguna: Intidtable () {val name = varchar ("name", 50) .index () val city = referensi ("kota", kota) val use = integer ("usia")
} Object Cities: IntidTable () {val name = varchar ("name", 50)
} class user (id: entityid <int>): intentity (id) {companion objek: intentityclass <usser> (pengguna) nama var oleh users.namevar city oleh city referencedon user.cityvar usia oleh users.age
} class city (id: entityid <int>): intentity (id) {companion objek: intentityclass <ity> (kota) nama var by cities.nameval pengguna oleh pengguna rujukan pengguna.city
} fun main () {database.connect ("jdbc: h2: mem: test", driver = "org.h2.driver", user = "root", password = "")
transaksi {
addlogger (stdoutsqllogger) schemautils.create (kota, pengguna) val stpete = city.new {
name = "St. Petersburg"} val munich = City.new {
name = "munich"} user.new {
name = "a" city = stpete
usia = 5} user.new {
name = "b" city = stpete
usia = 27} user.new {
name = "c" city = munich
usia = 42} println ("kota: $ {city.all (). jointoString {it.name}}") println ("pengguna di $ {stpete.name}: $ {stpete.users.jointostring {it.name} } ") println (" dewasa: $ {user.find {user.age greatereq 18} .jointostring {it.name}} ")
}
}SQL yang dihasilkan:
SQL: Buat tabel jika tidak ada kota (id int auto_increment kunci primer, nama varchar (50) bukan nol)
SQL: Buat tabel jika tidak ada pengguna (ID int auto_increment kunci utama, nama varchar (50) bukan nol, kota int not null, usia int not null, kendala fk_users_city__id kunci asing (kota) referensi kota (id) pada dihapus pada pembaruan pada pembaruan MEMBATASI)
SQL: Buat index users_name di pengguna (nama)
SQL: Sisipkan ke Kota (Nama) Nilai ('St. Petersburg')
SQL: Sisipkan ke Kota (Nama) Nilai ('Munich')
SQL: Pilih kota.id, kota.name dari kota
Kota: St. Petersburg, Munich
SQL: Sisipkan ke Pengguna (Nama, Kota, Usia) Nilai ('A', 1, 5)
SQL: Sisipkan ke Pengguna (Nama, Kota, Usia) Nilai ('B', 1, 27)
SQL: Sisipkan ke Pengguna (Nama, Kota, Usia) Nilai ('C', 2, 42)
SQL: SELECT USERS.ID, USERS.NAME, USERS.CITY, USERS.AGE DARI PENGGUNA WHERE USERS.CITY = 1 PENUAN DI St. Petersburg: A, B
SQL: SELECT USERS.ID, USERS.NAME, USERS.CITY, USERS.AGE DARI PENGGUNA WHERE USERS.AGE> = 18Adults: B, CSilakan lihat panduan kontribusi sebelum berkontribusi.
Dengan berkontribusi pada proyek yang diekspos, Anda setuju bahwa kontribusi Anda akan dilisensikan di bawah Lisensi Apache, versi 2.0.