Java 领域有很多ORM框架,其中Mybatis、Hibernate等 框架都属于老式ORM框架,也可以在kotlin项目中集成使用,而kotlin界也有比较方便好用ORM框架:Exposed、ktorm,本文主要介绍Exposed ORM框架。Exposed是一个针对kotlin的轻量级 SQL开源库,其位于用于 Kotlin 语言的 JDBC 驱动程序之上。有两种类型的数据库访问: 类型安全的 SQL 包装 DSL 和轻量级数据访问对象(DAO)。使用Exposed进行ORM开发可以使得开发者不用书写sql语句,通过书写声明式的kotlin代码即可完成CRUD操作,详细可参考Exposed。
对于较新版本的大于等于0.17.7以后的Exposed版本,只需要引入一个module依赖即可
dependencies {
implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk8:$kotlin_version"
implementation 'org.jetbrains.exposed:exposed:0.17.7'// exposed 依赖
runtimeOnly 'mysql:mysql-connector-java:8.0.19' //数据库的驱动依赖
}
Exposed连接数据库很方便,假设本地已经安装MySQL数据库,且已经建好Myshop仓库。
//连接数据库
fun connectDataBase() {
// Connect to the database
val dataBaseUrl = "jdbc:mysql://127.0.0.1:3306/MyShop"
val dataBaseDriver = "com.mysql.cj.jdbc.Driver"
val userName = "账号"
val password = "密码"
Database.connect(dataBaseUrl, driver = dataBaseDriver, user = userName, password = password)
}
在Exposed中以继承Table的Object类对应数据库的一个列表
object Messages: Table() {
val id = integer("id").autoIncrement().primaryKey()
val name = varchar("name", 100)
}
// 插入数据
fun insertMessage() {
// Insert new message
Messages.insert {
it[name] = "Hello Kotlin Developers!"
}
}
//查询数据id对应的name
fun selectMessage(messageId: Int): Query {
return Messages
.select { Messages.id eq messageId }
}
select查询出来的数据记录都是一个Query对象,如何将其转化为一个data class类呢?
data class Message (
val id: Int,
val name: String
)
//查询数据id对应的Message
fun selectMessage(messageId: Int): Message? {
return Messages
.select { Messages.id eq messageId }
.mapNotNull {
Message(id = it[Messages.id], name = it[Messages.name])
}
.singleOrNull()
}
经过如上的转化操作,发现DSL方式的查询似乎无法自动完成对象关系映射,还是需要开发者自己将查询得到Query对象进行转化为ResultRow然后再进一步转化为Pojo对象,当项目复杂时,由此也会产生很多模板代码,为此可以考虑使用插件:Infra-ORM
transaction {
SchemaUtils.create(Messages) // 创建表
DatabaseHelper.insertMessage() // 像表中插入数据
val message = DatabaseHelper.selectMessage(1)
println(message?.name)
}
最终的测试方法代码如下:
fun main(args: Array<String>) {
DatabaseHelper.connectDataBase()
transaction {
SchemaUtils.create(Messages)
DatabaseHelper.insertMessage()
val message = DatabaseHelper.selectMessage(1)
println(message?.name)
}
}
执行的结果如下:执行日志会返回对应的数据库操作所生成的sql语句。