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
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Kotlin提供了多个ORM框架其中两个比较常用的是Room和Exposed。 1. Room是Google官方推出的数据库ORM框架,它将关系型数据库映射为面向对象的语言。使用Room,我们可以使用面向对象的思想操作关系型数据库,而无需编写SQL语句[^1]。以下是使用Room的示例代码: ```kotlin // 定义实体类 @Entity data class User( @PrimaryKey val id: Int, val name: String, val age: Int ) // 定义数据库访问对象(DAO) @Dao interface UserDao { @Query("SELECT * FROM user") fun getAllUsers(): List<User> @Insert fun insertUser(user: User) @Update fun updateUser(user: User) @Delete fun deleteUser(user: User) } // 创建数据库 @Database(entities = [User::class], version = 1) abstract class AppDatabase : RoomDatabase() { abstract fun userDao(): UserDao } // 在应用中使用数据库 val db = Room.databaseBuilder( applicationContext, AppDatabase::class.java, "database-name" ).build() val userDao = db.userDao() val users = userDao.getAllUsers() ``` 2. ExposedKotlin的另一个ORM框架,它提供了类型安全的SQL和轻量级数据访问对象。Exposed的特点是简单易用,且具有良好的类型安全性[^2]。以下是使用Exposed的示例代码: ```kotlin // 定义实体类 object Users : Table() { val id = integer("id").autoIncrement().primaryKey() val name = varchar("name", length = 50) val age = integer("age") } // 创建数据库连接 Database.connect("jdbc:h2:mem:test;DB_CLOSE_DELAY=-1;", driver = "org.h2.Driver") // 定义数据库表 transaction { SchemaUtils.create(Users) } // 插入数据 transaction { Users.insert { it[name] = "John" it[age] = 25 } } // 查询数据 transaction { val users = Users.selectAll().map { User(it[Users.id], it[Users.name], it[Users.age]) } } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值