Exposed 正在参加 2020 年度 OSC 中国开源项目评选,请投票支持!
Exposed 在 2020 年度 OSC 中国开源项目评选 中已获得 {{ projectVoteCount }} 票,请投票支持!
投票让它出道
已投票
授权协议: 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
展开阅读全文

代码

的 Gitee 指数为
超过 的项目

Exposed 的相关资讯

还没有任何资讯

Exposed 的相关博客

Hacking Exposed 7.pdf 免费下载

下载地址: Hacking Exposed 7.pdf

Hacking Exposed 7.epub 免费下载

下载地址: Hacking Exposed 7.epub

Unregistering JMX-exposed beans on shutdown

在使用SpringBoot(版本为2.0.3.RELEASE)时,在通过Application类中的main()方法启动时,遇到以下报错信息: Unregistering ...

Unregistering JMX-exposed beans on shutdown解决方法:

Unregistering JMX-exposed beans on shutdown解决方法: 加入依赖如下: <dependency> <groupId>org.springframework.boot</...

Facebook user's phone numbers may be exposed online?

Data scraped from an exposed Facebook database containing user phone numbers and information that linked those phone ...

Spring Cloud异常系列-Unregistering JMX-exposed

异常一 Unregistering JMX-exposed beans on shutdown app_pod_id:gh-point-v021-fcgkd 服务在成功注册到服务注册中心Eureka后...

SpringBoot启动报错unregistering jmx-exposed beans on shutdown

错误信息: Eclipse新建SpringBoot项目后,直接启动失败,报错【unregistering jmx-exposed beans on shutdown】。 解决方案:...

Programming Interviews Exposed, 4th Edition 免积分下载

图书说明: Ace智能准备技术访谈 编程访谈Exposed是程序员理想的技术面试准备的首选。更新以反映不断变化的技术和趋势,这个新...

android 7.0拍照问题file:///storage/emulated/0/photo.jpeg exposed beyond app through ClipData.Item.getUri

Android7.0调用相机时出现新的错误: android.os.FileUriExposedException: file:///storage/emulated/0/photo.jpeg exposed ...

Kotlin的数据库DSL

Kotlin数据库操作的lib包

Exposed 的相关问答

还没有任何问答,马上提问

评论 (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就好了,我现在用的就是社区版
2018/12/25 09:59
回复
举报

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

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插件是什么,望指教
2018/12/25 09:43
回复
举报

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

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再说呗。
2018/12/24 18:05
回复
举报

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

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

引用来自“颜文”的评论

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

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

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

引用来自“颜文”的评论

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

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

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

引用来自“颜文”的评论

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

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

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

引用来自“颜文”的评论

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

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

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

引用来自“颜文”的评论

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

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

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

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

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

引用来自“颜文”的评论

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

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

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

引用来自“颜文”的评论

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

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

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

引用来自“颜文”的评论

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

引用来自“javadeveloper”的评论

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

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

spring5都支持kotlin了
嘘,人家是云程序员
2018/12/24 10:12
回复
举报

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

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

引用来自“颜文”的评论

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

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

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

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

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

引用来自“颜文”的评论

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

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

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

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

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

引用来自“颜文”的评论

我比较好奇的是,你们采用了什么框架或者架构,让你们开发速度提升过一个数量级了。
目前没看到什么框架能提升一个数量级,koltin 也不行。所以没看出有什么优势,需要用kotlin做后端。在不考虑正版的情况下,弊端倒是不少。所以不用了呗。另外,我比较好奇你的语文谁教的。
2018/12/21 21:12
回复
举报
更多评论
21 评论
48 收藏
分享
返回顶部
顶部