Exposed Kotlin 的轻量级 ORM开源项目

我要开发同款
匿名用户2018年11月22日
123阅读
开发技术Kotlin
所属分类ORM/持久层框架、程序开发
授权协议Apache-2.0

作品详情

Exposed是Kotlin实现的轻量级ORM,也是JetBrains和Kotlin官方倾力推荐的ORM。

该ORM十分轻量级,只做了底层封装、Dao基础和Model基础,中上层的封装完全没有,可嵌入Spring。

目前支持的数据库方言:

PostgreSQL

MySQL

Oracle

SQLite

H2

SQLServer

推荐一个starter项目:Kotlin+Ktor+Exposed

示例代码

SQLDSL示例:

import org.jetbrains.exposed.sql.*import org.jetbrains.exposed.sql.transactions.transactionobject Users : Table() {    val id = varchar("id", 10).primaryKey() // Column<String>    val name = varchar("name", length = 50) // Column<String>    val cityId = (integer("city_id") references Cities.id).nullable() // Column<Int?>}object Cities : Table() {    val id = integer("id").autoIncrement().primaryKey() // Column<Int>    val name = varchar("name", 50) // Column<String>}fun main(args: Array<String>) {    Database.connect("jdbc:h2:mem:test", driver = "org.h2.Driver")    transaction {        SchemaUtils.create (Cities, Users)        val saintPetersburgId = Cities.insert {            it[name] = "St. Petersburg"        } get Cities.id        val munichId = Cities.insert {            it[name] = "Munich"        } get Cities.id        Cities.insert {            it[name] = "Prague"        }        Users.insert {            it[id] = "andrey"            it[name] = "Andrey"            it[cityId] = saintPetersburgId        }        Users.insert {            it[id] = "sergey"            it[name] = "Sergey"            it[cityId] = munichId        }        Users.insert {            it[id] = "eugene"            it[name] = "Eugene"            it[cityId] = munichId        }        Users.insert {            it[id] = "alex"            it[name] = "Alex"            it[cityId] = null        }        Users.insert {            it[id] = "smth"            it[name] = "Something"            it[cityId] = null        }        Users.update({Users.id eq "alex"}) {            it[name] = "Alexey"        }        Users.deleteWhere{Users.name like "%thing"}        println("All cities:")        for (city in Cities.selectAll()) {            println("${city[Cities.id]}: ${city[Cities.name]}")        }        println("Manual join:")        (Users innerJoin Cities).slice(Users.name, Cities.name).            select {(Users.id.eq("andrey") or Users.name.eq("Sergey")) and                    Users.id.eq("sergey") and Users.cityId.eq(Cities.id)}.forEach {            println("${it[Users.name]} lives in ${it[Cities.name]}")        }        println("Join with foreign key:")        (Users innerJoin Cities).slice(Users.name, Users.cityId, Cities.name).                select {Cities.name.eq("St. Petersburg") or Users.cityId.isNull()}.forEach {            if (it[Users.cityId] != null) {                println("${it[Users.name]} lives in ${it[Cities.name]}")            }            else {                println("${it[Users.name]} lives nowhere")            }        }        println("Functions and group by:")        ((Cities innerJoin Users).slice(Cities.name, Users.id.count()).selectAll().groupBy(Cities.name)).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("Nobody lives in $cityName")            }        }        SchemaUtils.drop (Users, Cities)    }}

Outputs:

    SQL: CREATE TABLE IF NOT EXISTS Cities (id INT AUTO_INCREMENT NOT NULL, name VARCHAR(50) NOT NULL, CONSTRAINT pk_Cities PRIMARY KEY (id))    SQL: CREATE TABLE IF NOT EXISTS Users (id VARCHAR(10) NOT NULL, name VARCHAR(50) NOT NULL, city_id INT NULL, CONSTRAINT pk_Users PRIMARY KEY (id))    SQL: ALTER TABLE Users ADD FOREIGN KEY (city_id) REFERENCES Cities(id)    SQL: INSERT INTO Cities (name) VALUES ('St. Petersburg')    SQL: INSERT INTO Cities (name) VALUES ('Munich')    SQL: INSERT INTO Cities (name) VALUES ('Prague')    SQL: INSERT INTO Users (id, name, city_id) VALUES ('andrey', 'Andrey', 1)    SQL: INSERT INTO Users (id, name, city_id) VALUES ('sergey', 'Sergey', 2)    SQL: INSERT INTO Users (id, name, city_id) VALUES ('eugene', 'Eugene', 2)    SQL: INSERT INTO Users (id, name, city_id) VALUES ('alex', 'Alex', NULL)    SQL: INSERT INTO Users (id, name, city_id) VALUES ('smth', 'Something', NULL)    SQL: UPDATE Users SET name='Alexey' WHERE Users.id = 'alex'    SQL: DELETE FROM Users WHERE Users.name LIKE '%thing'    All cities:    SQL: SELECT Cities.id, Cities.name FROM Cities    1: St. Petersburg    2: Munich    3: Prague    Manual join:    SQL: SELECT Users.name, Cities.name FROM Users INNER JOIN Cities ON Cities.id = Users.city_id WHERE ((Users.id = 'andrey') or (Users.name = 'Sergey')) and Users.id = 'sergey' and Users.city_id = Cities.id    Sergey lives in Munich    Join with foreign key:    SQL: SELECT Users.name, Users.city_id, Cities.name FROM Users INNER JOIN Cities ON Cities.id = Users.city_id WHERE (Cities.name = 'St. Petersburg') or (Users.city_id IS NULL)    Andrey lives in St. Petersburg    Functions and group by:    SQL: SELECT Cities.name, COUNT(Users.id) FROM Cities INNER JOIN Users ON Cities.id = Users.city_id GROUP BY Cities.name    1 user(s) live(s) in St. Petersburg    2 user(s) live(s) in Munich    SQL: DROP TABLE Users    SQL: DROP TABLE Cities
声明:本文仅代表作者观点,不代表本站立场。如果侵犯到您的合法权益,请联系我们删除侵权资源!如果遇到资源链接失效,请您通过评论或工单的方式通知管理员。未经允许,不得转载,本站所有资源文章禁止商业使用运营!
下载安装【程序员客栈】APP
实时对接需求、及时收发消息、丰富的开放项目需求、随时随地查看项目状态

评论