Kotlin 的轻量级 ORM Exposed

Apache-2.0
Kotlin 查看源码»
跨平台
2018-11-22
曾建凯

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

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

目前支持的数据库方言:

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

示例代码

SQL DSL 示例:

import org.jetbrains.exposed.sql.*
import org.jetbrains.exposed.sql.transactions.transaction

object 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
的码云指数为
超过 的项目
加载中

评论(21)

颜文
颜文

引用来自“德莫罗”的评论

kotlin 在android 玩吧。反正后端要用spring,社区版又不支持spring, 所以就不用kotlin了,没看见开发速度上个数量级。

引用来自“颜文”的评论

我比较好奇的是,你们采用了什么框架或者架构,让你们开发速度提升过一个数量级了。

引用来自“德莫罗”的评论

目前没看到什么框架能提升一个数量级,koltin 也不行。所以没看出有什么优势,需要用kotlin做后端。在不考虑正版的情况下,弊端倒是不少。所以不用了呗。另外,我比较好奇你的语文谁教的。

引用来自“颜文”的评论

既然你承认没有任何框架能提升一个数量级,那么你们是什么框架都没用?kotlin又不是收费软件,考虑什么正版?kotlin能提升开发效率,这就是优势啊,只是没有“提升一个数量级”,事实上我不认为有任何框架能“提升一个数量级”。你说的弊端是什么?学习成本吗?我比较好奇你的逻辑是谁教的。

引用来自“德莫罗”的评论

所以说我好奇你语文是谁教的,好好完整读一下上下文,提到了两个东西,后台开发需要对spring的智能支持,正版是指idea正版。出了idea,kotlin没有一个像样的其他ide。

引用来自“颜文”的评论

你所说的两个前提全错。第一,kotlin和spring完全兼容;第二,kotlin的支持当然不只idea。你是在云编程么?

引用来自“德莫罗”的评论

学到一件事情,沟通到位真的太不容易,我以为你知道我指的什么,结果回复的完全是两码事。再阐述一下,我一直在说的是针对ide本身对spring的支持,也就是说idea 的社区办,对spring是没有支持的(特指智能提示,配置提示,启动参数等功能),其他ide对kotlin的支持,你可以去试试。看看在实际工程化的项目中能不能用。

引用来自“颜文”的评论

idea的社区版有专门的spring插件,不比eclipse差。 eclipse的kotlin插件尝试了下,也还不错。 不要想当然,试试kotlin再说呗。

引用来自“德莫罗”的评论

试了,学过,读了kotlin in action,被 ide 逼得放弃了。eclipse 的也用了kotlin 插件,体验太差了。没idea正版的情况下,后端团队推不动。放弃了。另外,社区版的spring插件是什么,望指教
官方插件里面搜索spring就好了,我现在用的就是社区版
德莫罗
德莫罗

引用来自“德莫罗”的评论

kotlin 在android 玩吧。反正后端要用spring,社区版又不支持spring, 所以就不用kotlin了,没看见开发速度上个数量级。

引用来自“颜文”的评论

我比较好奇的是,你们采用了什么框架或者架构,让你们开发速度提升过一个数量级了。

引用来自“德莫罗”的评论

目前没看到什么框架能提升一个数量级,koltin 也不行。所以没看出有什么优势,需要用kotlin做后端。在不考虑正版的情况下,弊端倒是不少。所以不用了呗。另外,我比较好奇你的语文谁教的。

引用来自“颜文”的评论

既然你承认没有任何框架能提升一个数量级,那么你们是什么框架都没用?kotlin又不是收费软件,考虑什么正版?kotlin能提升开发效率,这就是优势啊,只是没有“提升一个数量级”,事实上我不认为有任何框架能“提升一个数量级”。你说的弊端是什么?学习成本吗?我比较好奇你的逻辑是谁教的。

引用来自“德莫罗”的评论

所以说我好奇你语文是谁教的,好好完整读一下上下文,提到了两个东西,后台开发需要对spring的智能支持,正版是指idea正版。出了idea,kotlin没有一个像样的其他ide。

引用来自“颜文”的评论

你所说的两个前提全错。第一,kotlin和spring完全兼容;第二,kotlin的支持当然不只idea。你是在云编程么?

引用来自“德莫罗”的评论

学到一件事情,沟通到位真的太不容易,我以为你知道我指的什么,结果回复的完全是两码事。再阐述一下,我一直在说的是针对ide本身对spring的支持,也就是说idea 的社区办,对spring是没有支持的(特指智能提示,配置提示,启动参数等功能),其他ide对kotlin的支持,你可以去试试。看看在实际工程化的项目中能不能用。

引用来自“颜文”的评论

idea的社区版有专门的spring插件,不比eclipse差。 eclipse的kotlin插件尝试了下,也还不错。 不要想当然,试试kotlin再说呗。
试了,学过,读了kotlin in action,被 ide 逼得放弃了。eclipse 的也用了kotlin 插件,体验太差了。没idea正版的情况下,后端团队推不动。放弃了。另外,社区版的spring插件是什么,望指教
颜文
颜文

引用来自“德莫罗”的评论

kotlin 在android 玩吧。反正后端要用spring,社区版又不支持spring, 所以就不用kotlin了,没看见开发速度上个数量级。

引用来自“颜文”的评论

我比较好奇的是,你们采用了什么框架或者架构,让你们开发速度提升过一个数量级了。

引用来自“德莫罗”的评论

目前没看到什么框架能提升一个数量级,koltin 也不行。所以没看出有什么优势,需要用kotlin做后端。在不考虑正版的情况下,弊端倒是不少。所以不用了呗。另外,我比较好奇你的语文谁教的。

引用来自“颜文”的评论

既然你承认没有任何框架能提升一个数量级,那么你们是什么框架都没用?kotlin又不是收费软件,考虑什么正版?kotlin能提升开发效率,这就是优势啊,只是没有“提升一个数量级”,事实上我不认为有任何框架能“提升一个数量级”。你说的弊端是什么?学习成本吗?我比较好奇你的逻辑是谁教的。

引用来自“德莫罗”的评论

所以说我好奇你语文是谁教的,好好完整读一下上下文,提到了两个东西,后台开发需要对spring的智能支持,正版是指idea正版。出了idea,kotlin没有一个像样的其他ide。

引用来自“颜文”的评论

你所说的两个前提全错。第一,kotlin和spring完全兼容;第二,kotlin的支持当然不只idea。你是在云编程么?

引用来自“德莫罗”的评论

学到一件事情,沟通到位真的太不容易,我以为你知道我指的什么,结果回复的完全是两码事。再阐述一下,我一直在说的是针对ide本身对spring的支持,也就是说idea 的社区办,对spring是没有支持的(特指智能提示,配置提示,启动参数等功能),其他ide对kotlin的支持,你可以去试试。看看在实际工程化的项目中能不能用。
idea的社区版有专门的spring插件,不比eclipse差。 eclipse的kotlin插件尝试了下,也还不错。 不要想当然,试试kotlin再说呗。
德莫罗
德莫罗

引用来自“德莫罗”的评论

kotlin 在android 玩吧。反正后端要用spring,社区版又不支持spring, 所以就不用kotlin了,没看见开发速度上个数量级。

引用来自“颜文”的评论

我比较好奇的是,你们采用了什么框架或者架构,让你们开发速度提升过一个数量级了。

引用来自“德莫罗”的评论

目前没看到什么框架能提升一个数量级,koltin 也不行。所以没看出有什么优势,需要用kotlin做后端。在不考虑正版的情况下,弊端倒是不少。所以不用了呗。另外,我比较好奇你的语文谁教的。

引用来自“颜文”的评论

既然你承认没有任何框架能提升一个数量级,那么你们是什么框架都没用?kotlin又不是收费软件,考虑什么正版?kotlin能提升开发效率,这就是优势啊,只是没有“提升一个数量级”,事实上我不认为有任何框架能“提升一个数量级”。你说的弊端是什么?学习成本吗?我比较好奇你的逻辑是谁教的。

引用来自“德莫罗”的评论

所以说我好奇你语文是谁教的,好好完整读一下上下文,提到了两个东西,后台开发需要对spring的智能支持,正版是指idea正版。出了idea,kotlin没有一个像样的其他ide。

引用来自“颜文”的评论

你所说的两个前提全错。第一,kotlin和spring完全兼容;第二,kotlin的支持当然不只idea。你是在云编程么?
学到一件事情,沟通到位真的太不容易,我以为你知道我指的什么,结果回复的完全是两码事。再阐述一下,我一直在说的是针对ide本身对spring的支持,也就是说idea 的社区办,对spring是没有支持的(特指智能提示,配置提示,启动参数等功能),其他ide对kotlin的支持,你可以去试试。看看在实际工程化的项目中能不能用。
颜文
颜文

引用来自“德莫罗”的评论

kotlin 在android 玩吧。反正后端要用spring,社区版又不支持spring, 所以就不用kotlin了,没看见开发速度上个数量级。

引用来自“颜文”的评论

我比较好奇的是,你们采用了什么框架或者架构,让你们开发速度提升过一个数量级了。

引用来自“德莫罗”的评论

目前没看到什么框架能提升一个数量级,koltin 也不行。所以没看出有什么优势,需要用kotlin做后端。在不考虑正版的情况下,弊端倒是不少。所以不用了呗。另外,我比较好奇你的语文谁教的。

引用来自“颜文”的评论

既然你承认没有任何框架能提升一个数量级,那么你们是什么框架都没用?kotlin又不是收费软件,考虑什么正版?kotlin能提升开发效率,这就是优势啊,只是没有“提升一个数量级”,事实上我不认为有任何框架能“提升一个数量级”。你说的弊端是什么?学习成本吗?我比较好奇你的逻辑是谁教的。

引用来自“德莫罗”的评论

所以说我好奇你语文是谁教的,好好完整读一下上下文,提到了两个东西,后台开发需要对spring的智能支持,正版是指idea正版。出了idea,kotlin没有一个像样的其他ide。
你所说的两个前提全错。第一,kotlin和spring完全兼容;第二,kotlin的支持当然不只idea。你是在云编程么?
德莫罗
德莫罗

引用来自“德莫罗”的评论

kotlin 在android 玩吧。反正后端要用spring,社区版又不支持spring, 所以就不用kotlin了,没看见开发速度上个数量级。

引用来自“颜文”的评论

我比较好奇的是,你们采用了什么框架或者架构,让你们开发速度提升过一个数量级了。

引用来自“德莫罗”的评论

目前没看到什么框架能提升一个数量级,koltin 也不行。所以没看出有什么优势,需要用kotlin做后端。在不考虑正版的情况下,弊端倒是不少。所以不用了呗。另外,我比较好奇你的语文谁教的。

引用来自“颜文”的评论

既然你承认没有任何框架能提升一个数量级,那么你们是什么框架都没用?kotlin又不是收费软件,考虑什么正版?kotlin能提升开发效率,这就是优势啊,只是没有“提升一个数量级”,事实上我不认为有任何框架能“提升一个数量级”。你说的弊端是什么?学习成本吗?我比较好奇你的逻辑是谁教的。
所以说我好奇你语文是谁教的,好好完整读一下上下文,提到了两个东西,后台开发需要对spring的智能支持,正版是指idea正版。出了idea,kotlin没有一个像样的其他ide。
颜文
颜文

引用来自“德莫罗”的评论

kotlin 在android 玩吧。反正后端要用spring,社区版又不支持spring, 所以就不用kotlin了,没看见开发速度上个数量级。

引用来自“颜文”的评论

我比较好奇的是,你们采用了什么框架或者架构,让你们开发速度提升过一个数量级了。

引用来自“javadeveloper”的评论

可以请@德莫罗介绍一下他们的环境,大家可以取取经。

引用来自“私奔去月球”的评论

spring5都支持kotlin了
嘘,人家是云程序员
颜文
颜文

引用来自“德莫罗”的评论

kotlin 在android 玩吧。反正后端要用spring,社区版又不支持spring, 所以就不用kotlin了,没看见开发速度上个数量级。

引用来自“颜文”的评论

我比较好奇的是,你们采用了什么框架或者架构,让你们开发速度提升过一个数量级了。

引用来自“德莫罗”的评论

目前没看到什么框架能提升一个数量级,koltin 也不行。所以没看出有什么优势,需要用kotlin做后端。在不考虑正版的情况下,弊端倒是不少。所以不用了呗。另外,我比较好奇你的语文谁教的。
既然你承认没有任何框架能提升一个数量级,那么你们是什么框架都没用?kotlin又不是收费软件,考虑什么正版?kotlin能提升开发效率,这就是优势啊,只是没有“提升一个数量级”,事实上我不认为有任何框架能“提升一个数量级”。你说的弊端是什么?学习成本吗?我比较好奇你的逻辑是谁教的。
orpherus
orpherus

引用来自“德莫罗”的评论

kotlin 在android 玩吧。反正后端要用spring,社区版又不支持spring, 所以就不用kotlin了,没看见开发速度上个数量级。

引用来自“颜文”的评论

我比较好奇的是,你们采用了什么框架或者架构,让你们开发速度提升过一个数量级了。

引用来自“德莫罗”的评论

目前没看到什么框架能提升一个数量级,koltin 也不行。所以没看出有什么优势,需要用kotlin做后端。在不考虑正版的情况下,弊端倒是不少。所以不用了呗。另外,我比较好奇你的语文谁教的。
coroutine是个很大的优势,rxjava或者future写起来远不如coroutine简单。
德莫罗
德莫罗

引用来自“德莫罗”的评论

kotlin 在android 玩吧。反正后端要用spring,社区版又不支持spring, 所以就不用kotlin了,没看见开发速度上个数量级。

引用来自“颜文”的评论

我比较好奇的是,你们采用了什么框架或者架构,让你们开发速度提升过一个数量级了。
目前没看到什么框架能提升一个数量级,koltin 也不行。所以没看出有什么优势,需要用kotlin做后端。在不考虑正版的情况下,弊端倒是不少。所以不用了呗。另外,我比较好奇你的语文谁教的。

暂无资讯

暂无问答

Kotlin的数据库DSL

Kotlin数据库操作的lib包

2016/02/03 09:52
128
1
Spring Cloud异常系列-Unregistering JMX-exposed

异常一 Unregistering JMX-exposed beans on shutdown app_pod_id:gh-point-v021-fcgkd 服务在成功注册到服务注册中心Eureka后,会报这个错误。网上查了很多,也尝试了很多,然后突然就好了。...

2018/06/29 18:30
24
0
nexus配置

nexus配置

2016/07/27 10:43
34
0
彻底弃用PHP转入Kotlin阵营

痛定思痛,决定彻底弃用PHP,转入Kotlin,采用Ktor方案。Kotlin从去年年底到现在,我都一直保持关注,这一年下来,从1.0升级到1.3,增加了很多特性和支持。其实,只要是JetBrains扶持着的,想...

2018/11/21 21:55
101
0
【4】Linking Containers Together

//网络端口映射 //-P随机映射到主机的49153~49155端口 $ docker run -d -P training/webapp python app.py //将镜像的5000端口映射到主机的5000端口 $ docker run -d -p 5000:5000 t...

2016/02/23 19:29
12
1
java面向对象须知的一些基本概念

Real-world objects contain state and behavior. A software object's state is stored in fields. A software object's behavior is exposed through methods. Hiding internal data from ...

2013/03/27 15:01
13
0
wpf - utilities to get the default Control temp...

it is a common scenario when you sometime want to change the default template for a built-in controls, for example, when you are styling a built-in control or when you are exten...

2013/05/14 11:55
38
0
Programming Interviews Exposed, 4th Edition 免积分下载

图书说明: Ace智能准备技术访谈 编程访谈Exposed是程序员理想的技术面试准备的首选。更新以反映不断变化的技术和趋势,这个新的第四版提供了关于当今程序员面临的独特面试过程的内部指导。在...

01/06 11:59
5
0
Hacking Exposed 7.epub 免费下载

下载地址: Hacking Exposed 7.epub

2018/10/12 10:48
0
0
Hacking Exposed 7.pdf 免费下载

下载地址: Hacking Exposed 7.pdf

2018/10/12 10:48
0
0

没有更多内容

加载失败,请刷新页面

返回顶部
顶部