原生 SQL

Kronos提供了一个基础的SQL构建器,它允许您使用命名参数来构建SQL操作,本章将介绍如何使用该构建器执行SQL查询等操作。

原生 SQL 方法是 SqlExecutor 提供的扩展函数。按需导入对应方法,例如:

kotlin

import com.kotlinorm.database.SqlExecutor.query
import com.kotlinorm.database.SqlExecutor.queryList
import com.kotlinorm.database.SqlExecutor.queryMap
import com.kotlinorm.database.SqlExecutor.queryOne
import com.kotlinorm.database.SqlExecutor.queryOneOrNull
import com.kotlinorm.database.SqlExecutor.toList
import com.kotlinorm.database.SqlExecutor.first
import com.kotlinorm.database.SqlExecutor.firstOrNull

1. query 查询Map列表

执行SQL语句,查询多行记录


2. queryList 查询指定类型列表


执行SQL语句,查询多行记录并返回指定类型列表

查询单列时,可以直接将泛型参数设置为列的类型,例如:queryList<Int>()

查询多列时,可以将泛型参数设置为KPojo的子类,例如:queryList<User>()

Kronos 会在运行时识别 T : KPojo,普通调用不需要手动传 wrapper 映射标记。

kotlin

data class UserRow(
    val id: Int?,
    val displayName: String?
)

val result: List<UserRow> = wrapper.toList(
    "SELECT id, name AS display_name FROM user WHERE age >= :age",
    mapOf("age" to 18)
) { row ->
    UserRow(
        id = row.get<Int?>(1),
        displayName = row.get<String?>("display_name")
    )
}

row.get<T>("label") 按 JDBC 列名或 alias 读取,row.get<T>(field) 使用 Field 的投影输出名,名称为空时回退到数据库列名,row.get<T>(position) 按 JDBC 列位置读取,位置从 1 开始。值按目标 KType 经过当前结果映射和 ValueCodec 转换,rowNumber 从 0 开始。row 在映射回调执行期间有效;回调结束后使用已构造的结果对象。KronosJdbcWrapper 支持该行映射能力。


3. queryMap 查询单行记录Map

执行SQL语句,查询单行记录


4. queryOne 查询指定类型单行记录


执行SQL语句,查询单行记录返回指定类型,当查询结果为空时,抛出异常。

查询单列时,可以直接将泛型参数设置为列的类型,例如:queryOne<Int>()

查询多列时,可以将泛型参数设置为KPojo的子类,例如:queryOne<User>()

Kronos 会在运行时识别 T : KPojo,普通调用不需要手动传 wrapper 映射标记。

kotlin

val result: UserRow = wrapper.first(
    "SELECT id, name AS display_name FROM user WHERE id = :id",
    mapOf("id" to 1)
) { row ->
    UserRow(row.get<Int?>("id"), row.get<String?>("display_name"))
}

5. queryOneOrNull 查询指定类型单行记录(可空)


执行SQL语句,查询单行记录返回指定类型。

查询单列时,可以直接将泛型参数设置为列的类型,例如:queryOneOrNull<Int>()

查询多列时,可以将泛型参数设置为KPojo的子类,例如:queryOneOrNull<User>()

kotlin

val result: UserRow? = wrapper.firstOrNull(
    "SELECT id, name AS display_name FROM user WHERE id = :id",
    mapOf("id" to 404)
) { row ->
    UserRow(row.get<Int?>("id"), row.get<String?>("display_name"))
}

6. execute 执行SQL

用于执行SQL语句,返回受影响的行数。


7. batchExecute 批量执行SQL

批量执行SQL语句,返回受影响的行数。

批量任务形态、命名参数解析和 insert/update 示例见 📚批量操作。