노출 된 Kotlin 언어의 JDBC 드라이버 위에 가벼운 SQL 라이브러리가 노출됩니다. 노출 된 데이터베이스 액세스의 두 가지 맛이 있습니다 : Typeafe SQL 포장 DSL 및 경량 데이터 액세스 개체 (DAO).
노출 된 경우 데이터베이스 액세스를위한 두 가지 옵션이 있습니다 : 래핑 DSL과 가벼운 DAO. 우리의 공식 마스코트는 오징어입니다. 마스코트와 마찬가지로 노출 된 다양한 데이터베이스 엔진을 모방하는 데 노출 될 수 있으며, 이는 특정 데이터베이스 엔진에 종속성없이 응용 프로그램을 구축하고 변경 사항이 거의 없거나 전환되지 않도록 전환하는 데 도움이됩니다.
H2 (버전 2.x; 1.x 버전은 더 이상 사용되지 않으며 향후 릴리스에서 제거됩니다)
(또한 PGJDBC-NG JDBC 드라이버를 사용한 PostgreSQL)
노출 된 릴리스는 Maven Central 저장소에서 제공됩니다. 다음과 같이 빌드 스크립트 에서이 저장소를 선언 할 수 있습니다.
경고 : Kotlin JVM 대상을 8로 설정하고 스프링을 17로 사용할 때 제대로 작동하려면 다음과 같습니다.
리포지토리 {// 0.30.1 // 0.30.1의 버전이 0.30.1 이후 버전을 사용할 수 없습니다. }
Maven Central 저장소는 Maven 사용자를 위해 기본적으로 활성화됩니다.
Exposed
모듈은 다음 모듈로 구성됩니다.
노출 코어 - 매핑과 함께 DSL API를 모두 포함하는 기본 모듈
노출 -Crrypt- 암호화 된 데이터를 DB에 저장하고 클라이언트 측에서 인코딩/디코딩하는 추가 열 유형을 제공합니다.
노출 -Dao -Dao API
Java8 Time API를 기반으로 한 노출-자바 시간-날짜 시간 확장
노출 -JDBC- Java JDBC API를 기반으로 한 전송 수준 구현
노출 조디 타임-조디타임 라이브러리를 기반으로 한 날짜 시간 연장
노출 -JSON -JSON 및 JSONB 데이터 유형 확장
노출 -Kotlin-DateTime- Kotlinx-DateTime을 기반으로 한 날짜 시간 확장
노출-돈-"javax.money:money-api"의 화폐를 지원하기위한 확장
노출 스프링 부트 스타터-최대 절전 모드 대신 ORM으로 노출 된 스프링 부트의 스타터
<의존성> <의존성> <groupid> org.jetbrains.Expartion </groupid> <artifactid> 노출 코어 </artifactid> <버전> 0.56.0 </버전> </의존성> <의존성> <groupid> org.jetbrains.Expartion </groupid> <artifactid> 노출 -Crypt </artifactid> <버전> 0.56.0 </버전> </의존성> <의존성> <groupid> org.jetbrains.Expartion </groupid> <artifactid> 노출 된 Dao </artifactid> <버전> 0.56.0 </버전> </의존성> <의존성> <groupid> org.jetbrains.Expartion </groupid> <artifactid> 노출-자바-타임 </artifactid> <버전> 0.56.0 </버전> </의존성> <의존성> <groupid> org.jetbrains.Expartion </groupid> <artifactid> 노출 -jdbc </artifactid> <버전> 0.56.0 </버전> </의존성> <의존성> <groupid> org.jetbrains.Expartion </groupid> <artifactid> 노출-조디 타임 </artifactid> <버전> 0.56.0 </버전> </의존성> <의존성> <groupid> org.jetbrains.Expartion </groupid> <artifactid> 노출 -json </artifactid> <버전> 0.56.0 </버전> </의존성> <의존성> <groupid> org.jetbrains.Expartion </groupid> <artifactid> 노출 -Kotlin-datetime </artifactid> <버전> 0.56.0 </버전> </의존성> <의존성> <groupid> org.jetbrains.Expartion </groupid> <artifactid> 노출-돈 </artifactid> <버전> 0.56.0 </버전> </의존성> <의존성> <groupid> org.jetbrains.Expartion </groupid> <artifactid> 노출-스프링-부트 스타터 </artifactid> <버전> 0.56.0 </버전> </의존성> </의존성>
종속성 { 구현 'org.jetbrains.expared:Expation-core:0.56.0.56.0'implementation'org.jetbrains.expared:Expession-crypt:0.56.0'implementation 'org.jetbrains.expared:Exceation-dao:0.56.0'impletation' org.jetbrains.expared:exression-jdbc:0.56.0 ' 구현 'org.jetbrains.expared:Explate-jodatime:0.56.0'// orimplementation'org.jetbrains.expared : exception-java time:0.56.0'// orimplementation 'org.jetbrains.exprate:exprate-kotlin- DateTime : 0.56.0 ' 구현 'org.jetbrains.expared:expartion-json:0.56.56.0'implementation'org.jetbrains.expared:expared-money:0.56.0'implementation 'org.jetbrains.expared:Exposed-Spring-boot-starter:0.56. 0 '}
build.gradle.kts
:
Val ExposedVersion : 프로젝트 별 문자열 종속성 { 구현 ( "org.jetbrains.expared:Exposed-core:$ Excateversion") 구현 ( "org.jetbrains.expared:Exposess-Crypt:$ ExcreationVersion") 구현 ( "org.jetbrains.expared:exprate-dao:$ExceationVersion") 구현 ( "org.jetbrains.exparte:Exceation-jdbc:$ ExcateverSion")) 구현 ( "org.jetbrains.expation:Explation-jodatime:$ expanderSion") // orimplementation ( "org.jetbrains.expared:exposed-java-time:$ explession") // orimplementation ( "org.jetbrains.expresed:exposed : excreation -Kotlin-DateTime : $ ExposedVersion ") 구현 ( "org.jetbrains.exparte:Exception-json:$Exceptversion") 구현 ( "org.jetbrains.expared:Expation-money:$ ExcreationVersion") 구현 ( "org.jetbrains.expared:expression-boot-starter:$ Exceptionsion")) }
그리고 gradle.properties
에서
exposedVersion=0.56.0
빠른 시작은 샘플을 확인하십시오.
현재 Maven/Gradle 빌드 에는 노출이 있습니다. Maven Central을 확인하고 Exposed에 대한 통찰력을 얻으려면 시작하기 시작했습니다.
자세한 내용은 아래 링크를 방문하십시오.
예제 및 문서가있는 문서
노출에 기여합니다
마이그레이션 가이드
변경 및 마이그레이션 세부 사항을 깨뜨립니다
슬랙 채널
문제 추적기
버그 및 기능을보고하기 위해 Github 문제에서 멀어지고 있습니다. YouTrack에 새 요청을 기록하십시오. 문제를보고 로그인하려면 로그인해야합니다. 그렇지 않으면 404로 충족됩니다.
질문이 있습니까? Kotlinlang Slack에 대한 초대장을 자유롭게 요청하고 #Exposed 채널에서 프로젝트 대화에 참여하십시오.
우리는 당신의 풀 요청을 적극적으로 환영합니다. 그러나 작업을 기존 문제에 연결하는 것이 선호됩니다.
레포를 포크하고 메인에서 지점을 만듭니다.
당신의 지점의 이름을 당신이하고있는 일에 묘사하는 것을 지정하십시오. 즉, 새로운 것을 추가합니다.
테스트 해야하는 코드를 추가 한 경우 테스트를 추가하고 테스트 스위트가 통과해야합니다.
보풀 경고를 해결하십시오.
기존 코드를 더 좋게 만들면 PR 설명에서 알려주십시오.
자세한 내용은 기여 가이드 라인을 참조하십시오.
import org.jetbrains.exprate.sql.*import org.jetbrains.expared.sql.sqlexpressionbuilder.likeimport org.jetbrains.exprate.sql.transactions.transaction user users : table () {val id : column <string> = varchar ( " id ", 10) val 이름 : column <string> = varchar ("이름 ", 길이 = 50) val cityid : 열 <int?> = (정수 ( "city_id") 참조 cities.id) .nullable () val primarykey = primarykey = primarykey (id, name = "pk_user_id") // 이름은 옵션입니다} 개체 도시 : table () { 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 (stdoutsqllogger) schomautils.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 } [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 } user.insert { it [id] = "sergy"it [name] = "sergey"it [users.cityid] = munichid } user.insert { It [id] = "eugene"it [name] = "eugene"it [users.cityid] = munichid } user.insert { it [id] = "alex [name] ="alex "it [users.cityid] = null} users.insert { it [id] = "sm [sm [name] ="something "it [users.cityid] = null} users.update ({users.id eq"alex "}) { It [name] = "Alexey"} users.deleteWhere {user.name like "%thing"} println ( "All Cities :") (Cities in Cities.Selectall ()) {println ( "$ {City [Cities. id]} : $ {city [cities.name]} ") } println ( "매뉴얼 조인 :") (사용자는 도시 내부 도시) .select (user.name, cities.name) .어디 { (user.id.eq ( "andrey") 또는 users.name.eq ( "sergey")) andusers.id.eq ( "sergey") 및 users.cityid.eq (cities.id) } .foreach {println ( "$ {it [user.name]}는 $ {it [cities.name]}에 살고 있습니다. } println ( "외국 키로 가입 :") (사용자는 도시 내부 도시) .select (users.name, user.cityid, cities.name) .where {cities.name.eq ( "st. Petersburg") 또는 users.cityId.isnull ()} .foreach {if (it [user.cityid]! = null) {println ( "$ {it [user.name]}는 $ {it [cities.name]}"에 살고 있습니다. } else {println ( "$ {it [user.name]} 살아남는 사람") } } println ( "기능 및 그룹에 의해 :") ((도시 내부에 연결 사용자) .select (cities.name, users.id.count ()) .groupby (도시. 이름) ) .foreach {val cityName = it [cities.name] val usercount = it [users.id.count ()] if (usercount> 0) {println ( "$ usercount user (s) live (s) in $ cityName" )) } else {println ( "아무도 CityName에 사는 사람은 없음") } } schomautils.drop (사용자, 도시) } }
생성 된 SQL :
SQL : 도시가 없으면 테이블 생성 도시 (ID int auto_increment, name varchar (50) null, 제약 pk_cities_id 기본 키 (ID)) SQL : 사용자 (ID Varchar (10), Name Varchar (50)가 NULL, City_ID NULL, 제한제 PK_USER_ID 기본 키 (ID), 제약 조건 FK_USERS_CITY_ID_ID 외래 키 (City_ID) 참조 도시 (ID) 삭제 제한에서 도시 (ID)를 작성하십시오. 업데이트 제한) SQL : 도시에 삽입 (이름) 값 ( 'St. Petersburg') SQL : 도시에 삽입 (이름) 값 ( '뮌헨') SQL : 도시에 삽입 (이름) 값 (서브 스트링 (Trim ( 'Prague'), 1, 2)) SQL : Cities.id, Cities.name Cities.id = 3praguename = pr. SQL : 사용자에 삽입 (id, name, city_id) 값 ( 'Andrey', 'Andrey', 1) SQL : 사용자에 삽입 (id, name, city_id) 값 ( 'Sergey', 'Sergey', 2) SQL : 사용자에 삽입 (id, name, city_id) 값 ( 'eugene', 'eugene', 2) SQL : 사용자에 삽입 (id, name, city_id) 값 ( 'Alex', 'Alex', Null) SQL : 사용자에 삽입 (id, name, city_id) 값 ( 'smth', 'something', null) SQL : USDERS SET NAME = 'ALEXEY'WHER USERS.ID = 'ALEX'SQL : 사용자가 사용자에게 삭제하여'%thing '도시 : SQL : Cities.Id, Cities.Name From Cities 1 : St. Petersburg2 : Munich3 : PR 수동 조인 : SQL : 사용자를 선택하십시오. = 'Sergey') 및 (user.city_id = cities.id) Sergey는 Munichjoin에서 외국 열쇠와 함께 살고 있습니다. SQL : select usels.name, user.city_id, cities.name inner cities.id = user.city_id where (cities.name = 'St. Petersburg') 또는 (users.city_id is null) Andrey는 상트 페테르부르크에 살고 있습니다 기능 및 그룹에 의해 : SQL : 도시에서 Cities.Name, Count (user.id)를 선택하여 Cities.id = user.city_id Group.name1 user (s) St. ) 뮌헨에서 SQL : 사용자가 존재하는 경우 드롭 테이블 SQL : 도시가 존재하는 경우 드롭 테이블
import org.jetbrains.exprate.dao.*import org.jetbrains.exprese.dao.id.entityIdimport org.jetbrains.expartion.dao.id.intidtableimport org.jetbrains.exporte.sql.*import org.jetbrains.exprate.sql .TrAnsactions.TransactionObject 사용자 : intidtable () {val name = varchar ( "name", 50) .index () val city = 참조 ( "도시", 도시) val age = integer ( "Age") } 개체 도시 : intidtable () {val name = varchar ( "name", 50) } class user (id : entityId <int>) : 의도 (ID) {companion object : intentityclass <user> (사용자) var name by users.namevar city by city reference users.cityvar age.age. } Class City (ID : EntityId <int>) : 의도 (ID) {Companion Object : IntentityClass <City> (도시) Cities의 Var Name.NameVal 사용자의 사용자 추천 사용자 .city } fun main () {database.connect ( "jdbc : h2 : mem : test", driver = "org.h2.driver", user = "root", password = "") 거래 { AddLogger (stdoutsqllogger) schomautils.create (도시, 사용자) val stpete = city.new { 이름 = "St. Petersburg"} Val Munich = City.new { 이름 = "뮌헨"} user.new { 이름 = "A"City = stpete age = 5} user.new { 이름 = "b"City = stpete age = 27} user.new { 이름 = "C"City = 뮌헨 age = 42} println ( "도시 : $ {city.all (). JointOstring {it.name}}") println ( "$ {stpete.name}의 사용자 : $ {stpete.users.jointostring {it.name} } ") println ("성인 : $ {user.find {user.age Greatereq 18} .jointoString {it.name}} ") } }
생성 된 SQL :
SQL : 존재하지 않으면 테이블 생성 도시 (ID int auto_increment 기본 키, 이름 varchar (50) not null) SQL: CREATE TABLE IF NOT EXISTS Users (id INT AUTO_INCREMENT PRIMARY KEY, name VARCHAR(50) NOT NULL, city INT NOT NULL, age INT NOT NULL, CONSTRAINT FK_Users_city__ID FOREIGN KEY (city) REFERENCES Cities(id) ON DELETE RESTRICT ON UPDATE 얽매다) SQL : 사용자에서 index users_name 만들기 (이름) SQL : 도시에 삽입 (이름) 값 ( 'St. Petersburg') SQL : 도시에 삽입 (이름) 값 ( '뮌헨') SQL : Cities.Id, Cities.Name의 이름을 선택하십시오 도시 : 상트 페테르부르크, 뮌헨 SQL : 사용자에 삽입 (이름, 도시, 연령) 값 ( 'A', 1, 5) SQL : 사용자에 삽입 (이름, 도시, 연령) 값 ( 'B', 1, 27) SQL : 사용자에 삽입 (이름, 도시, 연령) 값 ( 'C', 2, 42) SQL : select user.id, user.name, user.city, users.age user user usings.city = 1users에서 St. Petersburg : A, B SQL : select user.id, user.name, user.city, users.age user user using.age> = 18aDults : b, c
기부하기 전에 기여 가이드를 참조하십시오.
노출 된 프로젝트에 기여함으로써 귀하는 귀하의 기부금이 Apache 라이센스, 버전 2.0에 따라 라이센스가 부여된다는 데 동의합니다.