Exposed ORM框架介绍

Exposed ORM框架介绍

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。

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)
    }

第三步:创建数据表对应的Object类

在Exposed中以继承Table的Object类对应数据库的一个列表

object Messages: Table() {
    val id = integer("id").autoIncrement().primaryKey()
    val name = varchar("name", 100)
}

第四步:使用DSL方法进行crud

  1. 定义插入方法
// 插入数据
    fun insertMessage() {
            // Insert new message
            Messages.insert {
                it[name] = "Hello Kotlin Developers!"
            }
	}
  1. 定义查询方法
//查询数据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

  1. 方法执行
    所有的数据库操作都需要在transaction块中进行
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语句。
在这里插入图片描述

参考

  • https://androidexample365.com/exposed-spring-integration-and-code-generator-for-dsl-interface/
  • https://github.com/JetBrains/Exposed/issues/24

你可能感兴趣的:(kotlin)