Exposed Kotlin 的轻量级 ORM

开源网站开源项目 24-04-08 12:05:58

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

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

目前支持的数据库方言:

PostgreSQL

MySQL

Oracle

SQLite

H2

SQL Server

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

示例代码

SQL DSL 示例:

importorg.jetbrains.exposed.sql.*importorg.jetbrains.exposed.sql.transactions.transactionobjectUsers:Table(){valid=varchar("id",10).primaryKey()//Column<String>valname=varchar("name",length=50)//Column<String>valcityId=(integer("city_id")referencesCities.id).nullable()//Column<Int?>}objectCities:Table(){valid=integer("id").autoIncrement().primaryKey()//Column<Int>valname=varchar("name",50)//Column<String>}funmain(args:Array<String>){Database.connect("jdbc:h2:mem:test",driver="org.h2.Driver")transaction{SchemaUtils.create(Cities,Users)valsaintPetersburgId=Cities.insert{it[name]="St.Petersburg"}getCities.idvalmunichId=Cities.insert{it[name]="Munich"}getCities.idCities.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.ideq"alex"}){it[name]="Alexey"}Users.deleteWhere{Users.namelike"%thing"}println("Allcities:")for(cityinCities.selectAll()){println("${city[Cities.id]}:${city[Cities.name]}")}println("Manualjoin:")(UsersinnerJoinCities).slice(Users.name,Cities.name).select{(Users.id.eq("andrey")orUsers.name.eq("Sergey"))andUsers.id.eq("sergey")andUsers.cityId.eq(Cities.id)}.forEach{println("${it[Users.name]}livesin${it[Cities.name]}")}println("Joinwithforeignkey:")(UsersinnerJoinCities).slice(Users.name,Users.cityId,Cities.name).select{Cities.name.eq("St.Petersburg")orUsers.cityId.isNull()}.forEach{if(it[Users.cityId]!=null){println("${it[Users.name]}livesin${it[Cities.name]}")}else{println("${it[Users.name]}livesnowhere")}}println("Functionsandgroupby:")((CitiesinnerJoinUsers).slice(Cities.name,Users.id.count()).selectAll().groupBy(Cities.name)).forEach{valcityName=it[Cities.name]valuserCount=it[Users.id.count()]if(userCount>0){println("$userCountuser(s)live(s)in$cityName")}else{println("Nobodylivesin$cityName")}}SchemaUtils.drop(Users,Cities)}}

Outputs:

SQL:CREATETABLEIFNOTEXISTSCities(idINTAUTO_INCREMENTNOTNULL,nameVARCHAR(50)NOTNULL,CONSTRAINTpk_CitiesPRIMARYKEY(id))SQL:CREATETABLEIFNOTEXISTSUsers(idVARCHAR(10)NOTNULL,nameVARCHAR(50)NOTNULL,city_idINTNULL,CONSTRAINTpk_UsersPRIMARYKEY(id))SQL:ALTERTABLEUsersADDFOREIGNKEY(city_id)REFERENCESCities(id)SQL:INSERTINTOCities(name)VALUES('St.Petersburg')SQL:INSERTINTOCities(name)VALUES('Munich')SQL:INSERTINTOCities(name)VALUES('Prague')SQL:INSERTINTOUsers(id,name,city_id)VALUES('andrey','Andrey',1)SQL:INSERTINTOUsers(id,name,city_id)VALUES('sergey','Sergey',2)SQL:INSERTINTOUsers(id,name,city_id)VALUES('eugene','Eugene',2)SQL:INSERTINTOUsers(id,name,city_id)VALUES('alex','Alex',NULL)SQL:INSERTINTOUsers(id,name,city_id)VALUES('smth','Something',NULL)SQL:UPDATEUsersSETname='Alexey'WHEREUsers.id='alex'SQL:DELETEFROMUsersWHEREUsers.nameLIKE'%thing'Allcities:SQL:SELECTCities.id,Cities.nameFROMCities1:St.Petersburg2:Munich3:PragueManualjoin:SQL:SELECTUsers.name,Cities.nameFROMUsersINNERJOINCitiesONCities.id=Users.city_idWHERE((Users.id='andrey')or(Users.name='Sergey'))andUsers.id='sergey'andUsers.city_id=Cities.idSergeylivesinMunichJoinwithforeignkey:SQL:SELECTUsers.name,Users.city_id,Cities.nameFROMUsersINNERJOINCitiesONCities.id=Users.city_idWHERE(Cities.name='St.Petersburg')or(Users.city_idISNULL)AndreylivesinSt.PetersburgFunctionsandgroupby:SQL:SELECTCities.name,COUNT(Users.id)FROMCitiesINNERJOINUsersONCities.id=Users.city_idGROUPBYCities.name1user(s)live(s)inSt.Petersburg2user(s)live(s)inMunichSQL:DROPTABLEUsersSQL:DROPTABLECities
[Exposed Kotlin 的轻量级 ORM]相关推荐
Sentinel 高可用流量管理框架

Sentinel 高可用流量管理框架

Sentinel 是面向分布式服务架构的高可用流量防护组件,主要以流量为切入点,从限流、流量整形、熔断降级……...

Sonar 代码质量管理平台

Sonar 代码质量管理平台

Sonar(SonarQube)是一个开源平台,用于管理源代码的质量。Sonar 不只是一个质量数据报告工具,更是代码……...

Tocc 基于标签的文件管理系统

Tocc 基于标签的文件管理系统

Tocc 是一个基于标签的文件管理系统,同时包含一个基于标签的文件系统 —— Toccfs。Tocc 项目的目的是提供……...

今日开源
  1. Webots 开源机器人模拟器

    Webots 开源机器人模拟器

    Webots 是用于模拟机器人的开放源代码和多平台桌面应用程序。它提供了一个完整的开发环境来对机器人进行建模,编程和仿真。 它被设计用于专业用途,并且广泛用于工业,教育和研究。自1998年以来,Cyber​​botics Lt……

    开源软件 2024-05-03

  2. par markdown 转换 html 工具

    par 是一个基于 pyPEG 写的转換 markdown 为 html 的工具,它是用 python 语言开发的。 除了支持标准的 markdown语法,还支持一些扩展语法,如 github 的 markdown 扩展及自定义的扩展,可以生成 boostrap 或 sema……

    开源软件 2024-05-03

  3. OSSEC 入侵检测程序

    OSSEC 入侵检测程序

    OSSEC是一款开源的入侵检测系统,包括了日志分析,全面检测,rook-kit检测。作为一款HIDS,OSSEC应该被安装在一台实施监控的 系统中。另外有时候不需要安装完全版本得OSSEC,如果有多台电脑都安装了OSSEC,那么就……

    开源软件 2024-05-03

返回顶部小火箭