المكشفات هي مكتبة SQL خفيفة الوزن أعلى سائق JDBC للغة Kotlin. يحتوي المكشف على نكهات من الوصول إلى قاعدة البيانات: Typesafe SQL Wrapping DSL وكائنات الوصول إلى البيانات الخفيفة الوزن (DAO).
مع المكشوف ، لديك خياران للوصول إلى قاعدة البيانات: لف DSL و DAO خفيف الوزن. التميمة الرسمية لدينا هي الحبار ، الذي يشتهر بقدرته المحاكاة المتميزة التي تمكنها من المزج بسلاسة في أي بيئة. على غرار التميمة الخاصة بنا ، يمكن استخدام المكشوفة لتقليد مجموعة متنوعة من محركات قاعدة البيانات ، مما يساعدك على بناء التطبيقات دون تبعيات على أي محرك قاعدة بيانات محددة والتبديل بينها مع تغيير ضئيل أو بدون تغييرات.
H2 (الإصدارات 2.x ؛ إصدار 1.x تم إهماله وسيتم إزالته في الإصدارات المستقبلية)
(أيضًا ، PostgreSQL باستخدام برنامج تشغيل PGJDBC-NG JDBC)
تتوفر إصدارات المكشوفة في مستودع Maven المركزي. يمكنك إعلان هذا المستودع في البرنامج النصي للبناء على النحو التالي:
تحذير: قد تحتاج إلى تعيين هدف Kotlin JVM الخاص بك إلى 8 ، وعند استخدام الربيع إلى 17 ، حتى يعمل هذا بشكل صحيح:
لم يتم توفير الإصدارات {// // إصدارات 0.30.1 // قبل 0.30.1 لـ Nowmavencentral () }
يتم تمكين مستودع Maven المركزي افتراضيًا لمستخدمي Maven.
Exposed
يتكون من الوحدات التالية:
الوحدة النمطية الأساسية - التي تحتوي على كلا API DSL جنبا إلى جنب مع رسم الخرائط
المكشوف-يوفر أنواع أعمدة إضافية لتخزين البيانات المشفرة في ديسيبل وترميزها/فك تشفيرها على جانب العميل
مكشوف DAO - DAO API
مكشوفة-جافا-امتدادات تاريخ الوقت بناءً على Java8 API
تعرض - JDBC - تطبيق مستوى النقل على أساس Java JDBC API
مكشوفة-jodatime-امتدادات تاريخ التاريخ على أساس مكتبة jodatime
مكشوف - JSON - امتدادات نوع بيانات JSON و JSONB
مكشوف-Kotlin-dateTime-امتدادات تاريخ التاريخ بناءً على kotlinx-dateTime
أموال مكشوفة-امتدادات لدعم MonetaryAmount من "Javax.Money: Money-Api"
مكشوف الربيع-ستارتر-بداية لشراء سبري
<تبعيات> <premency> <roupl> org.jetbrains.exposed </groupId> <StifactId> المكشوفة-النواة </artifactid> <splect> 0.56.0 </version> </التبعية> <premency> <roupl> org.jetbrains.exposed </groupId> <StifactId> مكشوفة crypt </suntifactid> <splect> 0.56.0 </version> </التبعية> <premency> <roupl> org.jetbrains.exposed </groupId> <StifactId> المكشوفة dao </artifactid> <splect> 0.56.0 </version> </التبعية> <premency> <roupl> org.jetbrains.exposed </groupId> <StifactId> المكشوفة-جافا الوقت </artifactid> <splect> 0.56.0 </version> </التبعية> <premency> <roupl> org.jetbrains.exposed </groupId> <StifactId> مكشوفة-JDBC </artifactid> <splect> 0.56.0 </version> </التبعية> <premency> <roupl> org.jetbrains.exposed </groupId> <Stifactid> المكشوفة-jodatime </artifactid> <splect> 0.56.0 </version> </التبعية> <premency> <roupl> org.jetbrains.exposed </groupId> <StifactId> مكشوف-Json </artifactid> <splect> 0.56.0 </version> </التبعية> <premency> <roupl> org.jetbrains.exposed </groupId> <StifactId> المكشوفة-Kotlin-dateTime </artifactid> <splect> 0.56.0 </version> </التبعية> <premency> <roupl> org.jetbrains.exposed </groupId> <StifactId> المكشوف من المال </artifactid> <splect> 0.56.0 </version> </التبعية> <premency> <roupl> org.jetbrains.exposed </groupId> <StifactId> المكشوفة-SPRING-BOOT-Starter </artifactid> <splect> 0.56.0 </version> </التبعية> </التبعيات>
التبعيات { التنفيذ 'org.jetbrains.exposed:exposed-core:0.56.0'Mplementation' org.jetbrains.exposed:exposed-crypt:0.56.0'mplementation 'org.jetbrains.exposed:exposed-dao:0.56.0'implementation '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'// orimplement 'org.jetbrains.exped:exposed-kotlin- DateTime: 0.56.0 ' التنفيذ 'org.jetbrains.exposed:Exposed-json:0.56.0'Implementation' org.jetbrains.exposed:exposed-money:0.56.0'mplementation 'org.jetbrains. 0 '}
في build.gradle.kts
:
Val Opvosedversion: String by Project التبعيات { التنفيذ ("org.jetbrains.exposed:Exposed-core: $ Exposed") التنفيذ ("org.jetbrains.exposed:Exposed-crypt: التنفيذ ("org.jetbrains.exposed:Exposed-dao:dexposedversion") التنفيذ ("org.jetbrains.exposed:Exposed-JDBC: التنفيذ ("org.jetbrains.exposed:Exposed-jodatime: $exposedversion") // orimplementation ("org.jetbrains.exposed:Exposed-java-time:dexposed") -كوتلين-ديتريت: $ apposedversion ") التنفيذ ("org.jetbrains.exposed:Exposed-json: Monexposedversion") التنفيذ ("org.jetbrains.exposed:Exposed-money:dexposedversion") التنفيذ ("org.jetbrains.exposed:Exposed-spring-boot-starter: }
وفي gradle.properties
exposedVersion=0.56.0
تحقق من العينات لبداية سريعة.
حاليا ، مكشوفة متاحة لبناء Maven/Gradle . تحقق من Maven Central وقراءة بدأت في الحصول على نظرة ثاقبة على إعداد مكشوفة.
لمزيد من المعلومات ، يرجى زيارة الروابط أدناه:
الوثائق مع الأمثلة والمستندات
المساهمة في الكشف
دليل الهجرة
كسر التغييرات وأي تفاصيل الترحيل
قناة الركود
مشكلة تعقب
يرجى ملاحظة أننا ننتقل بعيدًا عن مشكلات GitHub للإبلاغ عن الأخطاء والميزات. يرجى تسجيل أي طلبات جديدة على YouTrack. يجب تسجيل الدخول لعرض مشكلات وتسجيلها ، وإلا فإنك ستقابل 404.
هل لديك أسئلة؟ لا تتردد في طلب دعوة لـ Kotlinlang Slack والانضمام إلى محادثة المشروع في قناة #Exposed الخاصة بنا.
نرحب بنشاط بطلبات السحب الخاصة بك. ومع ذلك ، يفضل ربط عملك بمشكلة حالية.
شوكة الريبو وإنشاء فرعك من الرئيسي.
قم بتسمية فرعك شيئًا وصفيًا للعمل الذي تقوم به. أي يضيف شيء جديد.
إذا قمت بإضافة رمز يجب اختباره ، فأضف الاختبارات وتأكد من تمريرات مجموعة الاختبار.
تأكد من معالجة أي تحذيرات الوبر.
إذا جعلت الكود الموجود أفضل ، فيرجى إخبارنا في وصف العلاقات العامة الخاصة بك.
راجع إرشادات المساهمة لمزيد من التفاصيل.
استيراد org.jetbrains.exposed.sql. ID "، 10) Val Name: Column <Tring> = varchar (" name "، length = 50) val CityId: العمود <int؟> = (integer ("city_id") المراجع مدن. ) {val id: column <int> = integer ("id"). Autoincrement () val name: Column <String> = varchar ( PrimaryKey = PrimaryKey (id ، name = "pk_cities_id") } المرح الرئيسي () {database.connect ("jdbc: H2: mem: test" ، driver = "org.h2.driver" ، user = "root" ، password = "") عملية { addlogger (stdoutsqllogger) schemautils.create (المدن ، المستخدمون) Val Saintpetersburgid = cities.insert { It [name] = "St. Petersburg"} Get Cities.Idval Munichid = cities.insert { IT [name] = "Munich"} Get Cities.Idval pragueid = cities.insert { it.update (الاسم ، stringliteral ("prague") .trim (). substring (1 ، 2)) ) IT [id] = "Andrey" It [name] = "Andrey" } user.insert { it [id] = "sergey" it [name] = "sergey" it [user.cityId] = munichid } user.insert { it [id] = "eugene" it [name] = "eugene" } user.insert { it [id] = "Alex" it [name] = "Alex" it [user.cityId] = null} user.insert { it [id] = "smth" it [name] = "some" it [user.cityId] = null} user.update ({user.id eq "alex"}) { it [name] = "Alexey"} user.deletewhere {user.name مثل "٪ thing"} println ("All Cities:") for (City in Cities.Selectall ()) {println ("$ {City [Cities. معرف]}: $ {city [cities.name]} ") } println ("JUNUAL JOIN:") (المستخدمين في المدن innerjoin) .select (user.name ، cities.name) .أين { (user.id.eq ("Andrey") أو user.name.eq ("sergey") Andusers.id.eq ("sergey") و user.cityid.eq (cities.id) }. foreach {println ("$ {it [user.name]} يعيش في $ {it [cities.name]}") } println ("انضم إلى المفتاح الخارجي:") (المستخدمين في المدن innerjoin) .select (user.name ، user.cityid ، cities.name) . where {cities.name.eq ("st. petersburg") أو user.cityid.isnull ()} . foreach {if (it [user.cityId]! = null) {println ("$ {it [user.name]} يعيش في $ {it [cities.name]}") } آخر {println ("$ {it [user.name]} لا يعيش في أي مكان") } } println ("وظائف ومجموعة بواسطة:") ((مستخدمي المدن innerjoin) .select (cities.name ، user.id.count ()) .groupby (cities.name) ). foreach {val cityName = it [cities.name] val userCount = it [user.id.count ()] if (userCount> 0) {println ("$ usercount user (s) live (s) in $ cityName" ) } آخر {println ("لا أحد يعيش في $ CityName") } } schemautils.drop (المستخدمون والمدن) } }
تم إنشاؤه SQL:
SQL: إنشاء جدول إذا لم يكن موجودًا (معرف int auto_increment ، اسم varchar (50) ليس فارغًا ، القيد pk_cities_id المفتاح الأساسي (المعرف)) SQL: إنشاء جدول إذا لم يكن موجودًا للمستخدمين (معرف varchar (10) ، اسم varchar (50) غير فارغ ، city_id int null ، القيد pk_user_id المفتاح الأساسي (معرف) ، القيد FK_USERS_CITY_ID__ID المفتاح الأجنبي (CITY_ID) CITIES (ID) على الحد من الحذف عند تقييد التحديث) SQL: أدخل قيم المدن (الاسم) ("سانت بطرسبرغ") SQL: أدخل قيم المدن (الاسم) ("ميونيخ") SQL: أدخل قيم المدن (الاسم) (SUNDRING (TRIM ('Prague') ، 1 ، 2)) SQL: حدد المدن. SQL: insert في قيم المستخدمين (المعرف ، الاسم ، City_ID) ('Andrey' ، 'Andrey' ، 1) SQL: إدراج في المستخدمين (المعرف ، الاسم ، City_ID) ("سيرجي" ، "سيرجي" ، 2) SQL: أدخل في المستخدمين (المعرف ، الاسم ، City_ID) ("يوجين" ، "يوجين" ، 2) SQL: insert في قيم المستخدمين (المعرف ، الاسم ، City_ID) ('Alex' ، 'Alex' ، Null) SQL: insert في قيم المستخدمين (المعرف ، الاسم ، City_ID) ('SMTH' ، 'شيء' ، لاغية) SQL: تحديث المستخدمين تعيين name = 'Alexey' where user.id = 'Alex'sql: redlete من المستخدمين حيث user.name مثل "٪ thing' cities: SQL: حدد المدن. انضم يدوي: SQL: حدد المستخدمين = 'Sergey') و (user.city_id = cities.id) يعيش سيرجي في ميونيخوين مع المفتاح الأجنبي: SQL: حدد user.name ، المستخدمون يعيش أندريه في سانت بطرسبرغ وظائف ومجموعة من قبل: SQL: حدد cities.name ، count (user.id) من المدن الداخلية الانضمام إلى المستخدمين على cities.id = user.city_id group by cities.name1 user (s) live (s) ) في ميونيخ SQL: جدول إسقاط إذا كان مستخدمًا SQL: طاولة إسقاط إذا كانت مدن
استيراد org.jetbrains.exposed.dao. . {val name = varchar ("name" ، 50) .index () Val City = Reference ("City" ، Cities) Val Age = Integer ("Age") } مدن الكائن: intidtable () {val name = varchar ("name" ، 50) } مستخدم الفئة (معرف: entityId <int>): intentity (id) {companion object: intentityClass <Sether> (المستخدمين) اسم var من قبل المستخدمين. } Class City (ID: entityId <int>): intentity (id) {companion object: intentityclass <City> (Cities) var by cities.nameval user by userrerson aspers.city } المرح الرئيسي () {database.connect ("jdbc: H2: mem: test" ، driver = "org.h2.driver" ، user = "root" ، password = "") عملية { AddLogger (stdoutsqllogger) schemautils.create (المدن ، المستخدمون) Val stpete = city.new { name = "St. Petersburg"} 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 العمر = 42} println ("المدن: $ {city.all (). cointoString {it.name}}") println ("المستخدمين في $ {stpete.name}: $ {stpete.users.jointostring {it.name} } ") println (" البالغين: $ {user.find {user.age Greatereq 18} {it.name}} ") } }
تم إنشاؤه SQL:
SQL: إنشاء جدول إذا لم يكن موجودًا في المدن (ID int auto_increment المفتاح الأساسي ، اسم varchar (50) غير فارغ) SQL: إنشاء جدول إذا لم يكن موجودًا للمستخدمين (ID int auto_increment المفتاح الأساسي ، الاسم Varchar (50) غير فارغ ، المدينة غير فارغة ، عصر لا ، يقيد) SQL: إنشاء index users_name على المستخدمين (الاسم) SQL: أدخل قيم المدن (الاسم) ("سانت بطرسبرغ") SQL: أدخل قيم المدن (الاسم) ("ميونيخ") SQL: حدد المدن. المدن: سانت بطرسبرغ ، ميونيخ SQL: إدراج في المستخدمين (الاسم ، المدينة ، العمر) قيم ('A' ، 1 ، 5) SQL: إدراج في المستخدمين (الاسم ، المدينة ، العمر) ('B' ، 1 ، 27) SQL: إدراج في المستخدمين (الاسم ، المدينة ، العمر) ('c' ، 2 ، 42) SQL: SELECT user.id ، user.name ، user.city ، user.age من المستخدمين حيث user.city = 1Users في St. Petersburg: A ، B SQL: SELECT ORPERS.ID ، user.name ، user.city ، user.age من المستخدمين حيث user.age> = 18Adults: B ، C.
يرجى الاطلاع على دليل المساهمة قبل المساهمة.
من خلال المساهمة في المشروع المكشوف ، فإنك توافق على أن مساهماتك سيتم ترخيصها بموجب ترخيص Apache ، الإصدار 2.0.