Ktorm 扩展化组件库(ktorm-extend)0.0.2(原ktorm-for-solon-plugin)发布

仓库地址:

github

gitee

背景

日后 ktorm-extend 将以插件的形式在ktorm的基础上进行简单的扩展

Ktorm是Kotlin的原生ORM框架,目前最新版本为3.6.0,本扩展插件在Ktorm的基础上进行简单扩展,添加了对Solon框架的事务支持,同时支持了Ktorm的分页查询函数和对Ktorm的事务函数做了简单的函数封装。

其实主要是我自己在开发过程中想要封装一些常用的函数,所以就写了这个扩展插件。

1.Solon事务支持

Solon是一个Java "生态型"应用开发框架。从零开始构建,有自主的标准规范与开放生态。目前已经通过了开放原子基金会的认证,成为了开放原子基金会的孵化项目。 作者 noear(西东)是一位多产型开源作者。

Ktorm本身支持Spring的事务托管,但是缺乏对于第三方的具有本身事务管理体系的框架的支持,所以本扩展插件添加了Solon框架的事务支持。由于Ktorm本身提供了事务扩展的可能性,所以理论上可以参考Spring的事务委托方式实现对于所有"生态型"框架的原生支持。 本扩展仿照Spring的事务方式,添加了Solon框架的事务支持。

使用以下函数可以实现Solon的事务委托。

kotlin 复制代码
Database.connectWithSolonSupport(dataSource)

启用Solon委托之后,就只能使用@Tran注解来使用事务了,并且该函数仅支持Solon 2.7.4+的版本。

2.7.4以下的版本请使用Ktorm默认的连接创建方式,如果想要使用注解是事务管理,可以使用@SolonTransaction来实现, 该注解是通过Solon的AOP特性来实现的,具体请参考 KtormInterceptor.kt

具体实现请参考如 SolonTransactionManager.kt

2.事务封装函数

kotlin 复制代码
fun <R> transaction(
    database: Database,
    transactionType: Int = DEFAULT,
    isolation: TransactionIsolation? = null,
    func: (Database) -> R
): R {
    contract {
        callsInPlace(func, InvocationKind.EXACTLY_ONCE)
    }
    return when (transactionType) {
        NEW -> nextTransactionManager(database.transactionManager, isolation) {
            func(database)
        }

        DEFAULT -> currentTransactionManager(database, isolation, func)
        else -> throw UnsupportedOperationException("The current transaction creation type is not supported")
    }

}

通过传递Database和事务类型transactionType以及事务隔离级别来实现的,默认情况下会使用当前的事务,如果事务类型声明为NEW,则会创建一个新的事务来执行。

kotlin 复制代码
 fun insert() {
    transaction(database) {
        val department = Department {
            this.departmentNumber = "1"
            this.name = "开发部"
            this.parentId = 0
        }
        database.departments.add(department)
    }
}

注意:DataBase参数是必须传递的,因为封装的底层仍然是通过Ktorm的事务函数来实现的,仅仅是做了上层封装,所以需要传递一个DataBase对象。 请参考KtranFunction.kt

封装的事务函数和@SolonTransaction的底层实现是想通的。

3.Ktorm的扩展操作函数

  • 数据存在判断函数
kotlin 复制代码
    //存在判断
    fun <E : Any, T : BaseTable<E>> EntitySequence<E, T>.exist(
        predicate: (T) -> ColumnDeclaring<Boolean>
    ): Boolean {
        return this.filter(predicate).isNotEmpty()
    }
    //不存在判断
    fun <E : Any, T : BaseTable<E>> EntitySequence<E, T>.noExist(
      predicate: (T) -> ColumnDeclaring<Boolean>
    ): Boolean {
      return this.filter(predicate).isEmpty()
    }
  • 分页查询函数
kotlin 复制代码
   /**
     *  EntitySequence的分页查询,最终返回仍然是一个EntitySequence
     *
     */

    fun <E : Any, T : BaseTable<E>> EntitySequence<E, T>.page(page: Int, pageSiz: Int): EntitySequence<E, T> {
        return this.withExpression(expression.copy(limit = pageSiz, offset = page * pageSiz))
    }

    /**
     *  EntitySequence的分页查询,最终返回仍然是一个EntitySequence
     *  此函数传入的[page]会直接进行减一操作
     *
     */
    fun <E : Any, T : BaseTable<E>> EntitySequence<E, T>.page0(page: Int, pageSiz: Int): EntitySequence<E, T> {
        return this.withExpression(expression.copy(limit = pageSiz, offset = (page - 1) * pageSiz))
    }


    /**
     * 返回Query的分页,返回Query
     */

     fun Query.page(page: Int, pageSiz: Long): Query {
        return this.limit((pageSiz * page).toInt(), pageSiz.toInt())
    }

    /**
     * 返回Query的分页,返回Query
     * 此函数传入的[page]会直接进行减一操作
     */
    fun Query.page0(page: Int, pageSiz: Long): Query {
        return this.limit((pageSiz * page - 1).toInt(), pageSiz.toInt())
    }
相关推荐
极客先躯35 分钟前
高级java每日一道面试题-2024年10月3日-分布式篇-分布式系统中的容错策略都有哪些?
java·分布式·版本控制·共识算法·超时重试·心跳检测·容错策略
夜月行者1 小时前
如何使用ssm实现基于SSM的宠物服务平台的设计与实现+vue
java·后端·ssm
程序猿小D1 小时前
第二百六十七节 JPA教程 - JPA查询AND条件示例
java·开发语言·前端·数据库·windows·python·jpa
潘多编程1 小时前
Java中的状态机实现:使用Spring State Machine管理复杂状态流转
java·开发语言·spring
_阿伟_2 小时前
SpringMVC
java·spring
代码在改了2 小时前
springboot厨房达人美食分享平台(源码+文档+调试+答疑)
java·spring boot
猿java2 小时前
使用 Kafka面临的挑战
java·后端·kafka
wclass-zhengge2 小时前
数据结构篇(绪论)
java·数据结构·算法
何事驚慌2 小时前
2024/10/5 数据结构打卡
java·数据结构·算法
结衣结衣.2 小时前
C++ 类和对象的初步介绍
java·开发语言·数据结构·c++·笔记·学习·算法