JetBrains Exposed框架中的DAO CRUD操作详解

JetBrains Exposed框架中的DAO CRUD操作详解

Exposed Kotlin SQL Framework Exposed 项目地址: https://gitcode.com/gh_mirrors/ex/Exposed

前言

JetBrains Exposed是一个轻量级的Kotlin SQL框架,提供了两种API风格:类型安全的DSL和轻量级的DAO(数据访问对象)。本文将重点介绍如何使用Exposed的DAO API进行基本的CRUD(创建、读取、更新、删除)操作。

什么是DAO模式

DAO(Data Access Object)是一种设计模式,它将底层数据访问操作与业务逻辑分离。在Exposed中,DAO通过实体类(Entity Class)来表示数据库表,每个实体实例对应表中的一行记录。

准备工作

在开始CRUD操作前,我们需要定义实体类和对应的表结构。假设我们有一个电影数据库,包含StarWarsFilmEntity实体和对应的StarWarsFilmsTable表。

创建操作(Create)

基本创建

使用.new()函数创建新记录:

val movie = StarWarsFilmEntity.new {
    name = "The Last Jedi"
    sequelId = MOVIE_SEQUEL_ID
    director = "Rian Johnson"
}

指定ID创建

如果需要手动指定ID值:

val movie2 = StarWarsFilmEntity.new(id = 2) {
    name = "The Rise of Skywalker"
    sequelId = MOVIE2_SEQUEL_ID
    director = "J.J. Abrams"
}

复合ID创建

对于复合主键的表,使用CompositeID

val directorId = CompositeID {
    it[DirectorsTable.name] = "J.J. Abrams"
    it[DirectorsTable.guildId] = UUID.randomUUID()
}

val director = DirectorEntity.new(directorId) {
    genre = Genre.SCI_FI
}

读取操作(Read)

基本属性访问

读取属性就像访问普通Kotlin类属性:

val movieName = movie.name

注意:实体ID是EntityID类型,获取实际值需要使用.value

val movieId: Int = movie.id.value

查询方法

  1. 获取所有记录
val allMovies = StarWarsFilmEntity.all()
  1. 条件查询
val specificMovie = StarWarsFilmEntity.find { 
    StarWarsFilmsTable.sequelId eq MOVIE_SEQUELID 
}
  1. 按ID查询
val movie = StarWarsFilmEntity.findById(2)

复合ID查询

val directorId = CompositeID {
    it[DirectorsTable.name] = "J.J. Abrams"
    it[DirectorsTable.guildId] = UUID.randomUUID()
}

val director = DirectorEntity.findById(directorId)

连接查询

查找给第二部星球大战电影评分超过5的用户:

val query = UsersTable.innerJoin(UserRatingsTable)
    .innerJoin(StarWarsFilmsTable)
    .select(UsersTable.columns)
    .where {
        StarWarsFilmsTable.sequelId eq MOVIE_SEQUELID and 
        (UserRatingsTable.value greater MIN_MOVIE_RATING)
    }.withDistinct()

val users = UserEntity.wrapRows(query).toList()

结果排序

  1. 升序排序
val moviesByAscOrder = StarWarsFilmEntity.all().sortedBy { it.sequelId }
  1. 降序排序
val moviesByDescOrder = StarWarsFilmEntity.all().sortedByDescending { it.sequelId }

更新操作(Update)

基本更新

直接修改属性值:

movie.name = "Episode VIII – The Last Jedi"

注意:Exposed不会立即更新数据库,而是在事务结束时或下次查询前执行更新。

按ID更新

val updatedMovie = StarWarsFilmEntity.findByIdAndUpdate(2) {
    it.name = "Episode VIII – The Last Jedi"
}

按条件更新

val updatedMovie2 = StarWarsFilmEntity.findSingleByAndUpdate(
    StarWarsFilmsTable.name eq "The Last Jedi"
) {
    it.name = "Episode VIII – The Last Jedi"
}

删除操作(Delete)

删除记录非常简单:

movie.delete()

高级技巧

查询作为表达式

例如,按城市用户数排序城市:

val citiesSortedByUserCount = CityEntity.all()
    .sortedByDescending { city ->
        UserEntity.find { UsersTable.cityId eq city.id }.count()
    }

自动填充字段

可以在实体类中添加计算字段或自动填充字段,这些字段不会持久化到数据库,但可以在业务逻辑中使用。

总结

Exposed的DAO API提供了一种面向对象的方式来操作数据库,使得Kotlin开发者可以用熟悉的语法进行数据库操作。通过本文介绍的各种CRUD操作,你应该能够处理大多数数据库交互场景。记住,所有数据库操作都应该在事务中执行,这是Exposed的基本要求。

对于更复杂的查询,可以结合使用DSL API和DAO API,发挥Exposed的最大威力。

Exposed Kotlin SQL Framework Exposed 项目地址: https://gitcode.com/gh_mirrors/ex/Exposed

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

沈菱嫱Marie

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值