Exposed是Kotli实现的轻量级ORM,也是JetBrais和Kotli官方倾力推荐的ORM。
该ORM十分轻量级,只做了底层封装、Dao基础和Model基础,中上层的封装完全没有,可嵌入Sprig。
目前支持的数据库方言:
PostgreSQL
MySQL
Oracle
SQLite
H2
SQLServer
推荐一个starter项目:Kotli+Ktor+Exposed
示例代码
SQLDSL示例:
import org.jetbrais.exposed.sql.*import org.jetbrais.exposed.sql.trasactios.trasactioobject Users : Table() { val id = varchar("id", 10).primaryKey() // Colum<Strig> val ame = varchar("ame", legth = 50) // Colum<Strig> val cityId = (iteger("city_id") refereces Cities.id).ullable() // Colum<It?>}object Cities : Table() { val id = iteger("id").autoIcremet().primaryKey() // Colum<It> val ame = varchar("ame", 50) // Colum<Strig>}fu mai(args: Array<Strig>) { Database.coect("jdbc:h2:mem:test", driver = "org.h2.Driver") trasactio { SchemaUtils.create (Cities, Users) val saitPetersburgId = Cities.isert { it[ame] = "St. Petersburg" } get Cities.id val muichId = Cities.isert { it[ame] = "Muich" } get Cities.id Cities.isert { it[ame] = "Prague" } Users.isert { it[id] = "adrey" it[ame] = "Adrey" it[cityId] = saitPetersburgId } Users.isert { it[id] = "sergey" it[ame] = "Sergey" it[cityId] = muichId } Users.isert { it[id] = "eugee" it[ame] = "Eugee" it[cityId] = muichId } Users.isert { it[id] = "alex" it[ame] = "Alex" it[cityId] = ull } Users.isert { it[id] = "smth" it[ame] = "Somethig" it[cityId] = ull } Users.update({Users.id eq "alex"}) { it[ame] = "Alexey" } Users.deleteWhere{Users.ame like "%thig"} pritl("All cities:") for (city i Cities.selectAll()) { pritl("${city[Cities.id]}: ${city[Cities.ame]}") } pritl("Maual joi:") (Users ierJoi Cities).slice(Users.ame, Cities.ame). select {(Users.id.eq("adrey") or Users.ame.eq("Sergey")) ad Users.id.eq("sergey") ad Users.cityId.eq(Cities.id)}.forEach { pritl("${it[Users.ame]} lives i ${it[Cities.ame]}") } pritl("Joi with foreig key:") (Users ierJoi Cities).slice(Users.ame, Users.cityId, Cities.ame). select {Cities.ame.eq("St. Petersburg") or Users.cityId.isNull()}.forEach { if (it[Users.cityId] != ull) { pritl("${it[Users.ame]} lives i ${it[Cities.ame]}") } else { pritl("${it[Users.ame]} lives owhere") } } pritl("Fuctios ad group by:") ((Cities ierJoi Users).slice(Cities.ame, Users.id.cout()).selectAll().groupBy(Cities.ame)).forEach { val cityName = it[Cities.ame] val userCout = it[Users.id.cout()] if (userCout > 0) { pritl("$userCout user(s) live(s) i $cityName") } else { pritl("Nobody lives i $cityName") } } SchemaUtils.drop (Users, Cities) }}Outputs:
SQL: CREATE TABLE IF NOT EXISTS Cities (id INT AUTO_INCREMENT NOT NULL, ame VARCHAR(50) NOT NULL, CONSTRAINT pk_Cities PRIMARY KEY (id)) SQL: CREATE TABLE IF NOT EXISTS Users (id VARCHAR(10) NOT NULL, ame 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 (ame) VALUES ('St. Petersburg') SQL: INSERT INTO Cities (ame) VALUES ('Muich') SQL: INSERT INTO Cities (ame) VALUES ('Prague') SQL: INSERT INTO Users (id, ame, city_id) VALUES ('adrey', 'Adrey', 1) SQL: INSERT INTO Users (id, ame, city_id) VALUES ('sergey', 'Sergey', 2) SQL: INSERT INTO Users (id, ame, city_id) VALUES ('eugee', 'Eugee', 2) SQL: INSERT INTO Users (id, ame, city_id) VALUES ('alex', 'Alex', NULL) SQL: INSERT INTO Users (id, ame, city_id) VALUES ('smth', 'Somethig', NULL) SQL: UPDATE Users SET ame='Alexey' WHERE Users.id = 'alex' SQL: DELETE FROM Users WHERE Users.ame LIKE '%thig' All cities: SQL: SELECT Cities.id, Cities.ame FROM Cities 1: St. Petersburg 2: Muich 3: Prague Maual joi: SQL: SELECT Users.ame, Cities.ame FROM Users INNER JOIN Cities ON Cities.id = Users.city_id WHERE ((Users.id = 'adrey') or (Users.ame = 'Sergey')) ad Users.id = 'sergey' ad Users.city_id = Cities.id Sergey lives i Muich Joi with foreig key: SQL: SELECT Users.ame, Users.city_id, Cities.ame FROM Users INNER JOIN Cities ON Cities.id = Users.city_id WHERE (Cities.ame = 'St. Petersburg') or (Users.city_id IS NULL) Adrey lives i St. Petersburg Fuctios ad group by: SQL: SELECT Cities.ame, COUNT(Users.id) FROM Cities INNER JOIN Users ON Cities.id = Users.city_id GROUP BY Cities.ame 1 user(s) live(s) i St. Petersburg 2 user(s) live(s) i Muich SQL: DROP TABLE Users SQL: DROP TABLE Cities
评论