列类型参考

使用 KColumnType

KColumnType 是 @ColumnType 接收的枚举。把它标注在 KPojo 属性上,可以指定表操作在当前数据库方言下渲染的 DDL 类型。

import com.kotlinorm.annotations.ColumnType
import com.kotlinorm.annotations.Table
import com.kotlinorm.enums.KColumnType
import com.kotlinorm.interfaces.KPojo

@Table("tb_column_type_catalog")
data class ColumnTypeCatalog(
    @ColumnType(KColumnType.VARCHAR, length = 64)
    var code: String? = null,
) : KPojo

val code = ColumnTypeCatalog().__columns.single { it.name == "code" }

结果:

字段元数据值
code.typeKColumnType.VARCHAR
code.length64
code.scale0

文本和 UUID 类型

字符串类 KColumnType 可用于短文本、长文本和 UUID 值。

import com.kotlinorm.annotations.ColumnType
import com.kotlinorm.annotations.Table
import com.kotlinorm.enums.KColumnType
import com.kotlinorm.interfaces.KPojo

@Table("tb_text_type")
data class TextType(
    @ColumnType(KColumnType.VARCHAR, length = 64)
    var code: String? = null,

    @ColumnType(KColumnType.TEXT)
    var description: String? = null,

    @ColumnType(KColumnType.UUID)
    var externalId: String? = null,
) : KPojo

DDL 类型片段:

方言codedescriptionexternalId
MySQLVARCHAR(64)TEXTCHAR(36)
PostgreSQLVARCHAR(64)TEXTUUID
SQLiteTEXTTEXTTEXT
H2VARCHAR(64)CLOBUUID
SQLServerVARCHAR(64)TEXTCHAR(36)
OracleVARCHAR2(64)CLOBCHAR(36)
DM8VARCHAR2(64)CLOBCHAR(36)

数值类型

数值类 KColumnType 可用于布尔值、整数和精确小数。

import com.kotlinorm.annotations.ColumnType
import com.kotlinorm.annotations.Table
import com.kotlinorm.enums.KColumnType
import com.kotlinorm.interfaces.KPojo
import java.math.BigDecimal

@Table("tb_numeric_type")
data class NumericType(
    @ColumnType(KColumnType.BIT)
    var active: Boolean? = null,

    @ColumnType(KColumnType.BIGINT)
    var visits: Long? = null,

    @ColumnType(KColumnType.DECIMAL, length = 12, scale = 4)
    var balance: BigDecimal? = null,
) : KPojo

DDL 类型片段:

方言activevisitsbalance
MySQLTINYINT(1)BIGINT(20)DECIMAL(12,4)
PostgreSQLBOOLEANBIGINTDECIMAL(12,4)
SQLiteINTEGERINTEGERNUMERIC
H2BOOLEANBIGINTNUMERIC(12,4)
SQLServerBITBIGINTDECIMAL(12,4)
OracleNUMBER(1)NUMBER(19)NUMBER(12,4)
DM8NUMBER(1)NUMBER(19)NUMBER(12,4)

日期和时间类型

时间类 KColumnType 可用于日期、时间、日期时间和时间戳列。方言支持小秒精度时,scale 会参与渲染。

import com.kotlinorm.annotations.ColumnType
import com.kotlinorm.annotations.Table
import com.kotlinorm.enums.KColumnType
import com.kotlinorm.interfaces.KPojo
import java.sql.Timestamp
import java.time.LocalDate
import java.time.LocalDateTime
import java.time.LocalTime

@Table("tb_temporal_type")
data class TemporalType(
    @ColumnType(KColumnType.DATE)
    var eventDate: LocalDate? = null,

    @ColumnType(KColumnType.TIME)
    var eventTime: LocalTime? = null,

    @ColumnType(KColumnType.DATETIME)
    var createdAt: LocalDateTime? = null,

    @ColumnType(KColumnType.TIMESTAMP, scale = 4)
    var touchedAt: Timestamp? = null,
) : KPojo

DDL 类型片段:

方言eventDateeventTimecreatedAttouchedAt
MySQLDATETIMEDATETIMETIMESTAMP
PostgreSQLDATETIME(0)TIMESTAMP(0)TIMESTAMP(4)
SQLiteTEXTTEXTTEXTTEXT
H2DATETIMETIMESTAMPTIMESTAMP(4)
SQLServerDATETIMEDATETIMETIMESTAMP
OracleDATETIMESTAMP(0)TIMESTAMP(6)TIMESTAMP(4)
DM8DATETIMESTAMP(0)TIMESTAMP(6)TIMESTAMP(4)

JSON、二进制、空间和 XML 类型

@Serialize 会把对象编码为 JSON 文本。数据库列需要 JSON 类型时,可以额外使用 @ColumnType(KColumnType.JSON) 生成对应 DDL。二进制、空间和 XML 值也使用同样的 @ColumnType 写法。

import com.kotlinorm.annotations.ColumnType
import com.kotlinorm.annotations.Serialize
import com.kotlinorm.annotations.Table
import com.kotlinorm.enums.KColumnType
import com.kotlinorm.interfaces.KPojo

data class AuditPayload(val ip: String, val tags: List<String>)

@Table("tb_document_type")
data class DocumentType(
    @ColumnType(KColumnType.JSON)
    @Serialize
    var payload: AuditPayload? = null,

    @ColumnType(KColumnType.BLOB)
    var attachment: ByteArray? = null,

    @ColumnType(KColumnType.POINT)
    var position: String? = null,

    @ColumnType(KColumnType.XML)
    var document: String? = null,
) : KPojo

DDL 类型片段:

方言payloadattachmentpositiondocument
MySQLJSONBLOBPOINTTEXT
PostgreSQLJSONBBYTEAPOINTXML
SQLiteTEXTBLOBTEXTTEXT
H2JSONBLOBPOINTXML
SQLServerJSONVARBINARY(MAX)GEOMETRYXML
OracleJSONBLOBSDO_GEOMETRYXMLType
DM8JSONBLOBSDO_GEOMETRYXMLType

紧凑参考表

下表展示表结构 DDL 对常见 KColumnType 的类型字符串。单元格中的 n、p、s 来自 @ColumnType 的 length 和 scale;decimal/numeric 只设置 length 时会渲染为 p,0。

KColumnTypeMySQLPostgreSQLSQLiteH2SQLServerOracleDM8
BITTINYINT(1)BOOLEANINTEGERBOOLEANBITNUMBER(1)NUMBER(1)
TINYINTTINYINT(4)SMALLINTINTEGERTINYINTTINYINTNUMBER(3)NUMBER(3)
SMALLINTSMALLINT(6)SMALLINTINTEGERSMALLINTSMALLINTNUMBER(5)NUMBER(5)
MEDIUMINTMEDIUMINT(9)INTEGERINTEGERINTEGERINTNUMBER(7)NUMBER(7)
INTINT(11)INTEGERINTEGERINTEGERINTNUMBER(10)NUMBER(10)
BIGINTBIGINT(20)BIGINTINTEGERBIGINTBIGINTNUMBER(19)NUMBER(19)
SERIALINT(11)SERIALINTEGERINTEGERINTNUMBERNUMBER
YEARYEARINTEGERINTEGERINTEGERINTNUMBER(4)NUMBER(4)
REALREALREALREALREALREALBINARY_FLOATBINARY_FLOAT
FLOATFLOAT 或 FLOAT(p,s)DOUBLE PRECISION 或 FLOAT(p)REALDOUBLE PRECISIONFLOAT 或 FLOAT(p)BINARY_DOUBLE 或 FLOAT(p)BINARY_DOUBLE 或 FLOAT(p)
DOUBLEDOUBLE 或 DOUBLE(p,s)DOUBLE PRECISIONREALDOUBLE PRECISIONFLOAT(53)BINARY_DOUBLEBINARY_DOUBLE
DECIMALDECIMAL(10,0) 或 DECIMAL(p,s)DECIMAL 或 DECIMAL(p,s)NUMERICNUMERIC、NUMERIC(p,0) 或 NUMERIC(p,s)DECIMAL(18,0) 或 DECIMAL(p,s)NUMBER(10,0) 或 NUMBER(p,s)NUMBER(10,0) 或 NUMBER(p,s)
NUMERICNUMERIC(10,0) 或 NUMERIC(p,s)NUMERIC 或 NUMERIC(p,s)NUMERICNUMERIC、NUMERIC(p,0) 或 NUMERIC(p,s)NUMERIC(18,0) 或 NUMERIC(p,s)NUMERIC(10,0) 或 NUMERIC(p,s)NUMERIC(10,0) 或 NUMERIC(p,s)
CHARCHAR(255) 或 CHAR(n)CHAR(255) 或 CHAR(n)TEXTCHAR(255) 或 CHAR(n)CHAR(255) 或 CHAR(n)CHAR(255) 或 CHAR(n)CHAR(255) 或 CHAR(n)
VARCHARVARCHAR(255) 或 VARCHAR(n)TEXT 或 VARCHAR(n)TEXTVARCHAR(255) 或 VARCHAR(n)VARCHAR(255) 或 VARCHAR(n/MAX)VARCHAR2(255) 或 VARCHAR2(n)VARCHAR2(255) 或 VARCHAR2(n)
NCHARCHAR(255) 或 CHAR(n)CHAR(255) 或 CHAR(n)TEXTCHAR(255) 或 CHAR(n)NVARCHAR(255) 或 NVARCHAR(n)NCHAR(255) 或 NCHAR(n)NCHAR(255) 或 NCHAR(n)
NVARCHARVARCHAR(255) 或 VARCHAR(n)TEXT 或 VARCHAR(n)TEXTVARCHAR(255) 或 VARCHAR(n)NVARCHAR(255) 或 NVARCHAR(n/MAX)NVARCHAR2(255) 或 NVARCHAR2(n)NVARCHAR2(255) 或 NVARCHAR2(n)
TEXTTEXTTEXTTEXTCLOBTEXTCLOBCLOB
MEDIUMTEXTMEDIUMTEXTTEXTTEXTCLOBTEXTCLOBCLOB
LONGTEXTLONGTEXTTEXTTEXTCLOBTEXTCLOBCLOB
CLOBCLOBTEXTTEXTCLOBTEXTCLOBCLOB
NCLOBNCLOBTEXTTEXTCLOBNTEXTNCLOBNCLOB
DATEDATEDATETEXTDATEDATEDATEDATE
TIMETIMETIME(0-6)TEXTTIME 或 TIME(s)TIME 或 TIME(s)TIMESTAMP(0)TIMESTAMP(0)
DATETIMEDATETIMETIMESTAMP(0-6)TEXTTIMESTAMP 或 TIMESTAMP(s)DATETIME 或 DATETIME2(s)TIMESTAMP(6)TIMESTAMP(6)
TIMESTAMPTIMESTAMPTIMESTAMP(0-6)TEXTTIMESTAMP 或 TIMESTAMP(s)TIMESTAMPTIMESTAMP(0-9)TIMESTAMP(0-9)
BINARYBINARY(255) 或 BINARY(n)BYTEABLOBBINARY(255) 或 BINARY(n)BINARY(255) 或 BINARY(n)RAW(2000) 或 RAW(n)RAW(2000) 或 RAW(n)
VARBINARYVARBINARY(255) 或 VARBINARY(n)BYTEABLOBVARBINARY(255) 或 VARBINARY(n)VARBINARY(255) 或 VARBINARY(n)RAW(2000) 或 RAW(n)RAW(2000) 或 RAW(n)
LONGVARBINARYLONGBLOBBYTEABLOBBLOBVARBINARY(MAX)BLOBBLOB
BLOBBLOBBYTEABLOBBLOBVARBINARY(MAX)BLOBBLOB
MEDIUMBLOBMEDIUMBLOBBYTEABLOBBLOBVARBINARY(MAX)BLOBBLOB
LONGBLOBLONGBLOBBYTEABLOBBLOBVARBINARY(MAX)BLOBBLOB
JSONJSONJSONBTEXTJSONJSONJSONJSON
ENUMENUMVARCHAR(255) 或 VARCHAR(n)TEXTVARCHAR(255) 或 VARCHAR(n)NVARCHAR(255)VARCHAR2(255)VARCHAR2(255)
SETSETTEXTINTEGERVARCHAR(255) 或 VARCHAR(n)NVARCHAR(255)VARCHAR2(1000)VARCHAR2(1000)
UUIDCHAR(36)UUIDTEXTUUIDCHAR(36)CHAR(36)CHAR(36)
GEOMETRYGEOMETRYGEOMETRYTEXTGEOMETRYGEOMETRYSDO_GEOMETRYSDO_GEOMETRY
POINTPOINTPOINTTEXTPOINTGEOMETRYSDO_GEOMETRYSDO_GEOMETRY
LINESTRINGLINESTRINGLINESTRINGTEXTLINESTRINGGEOMETRYSDO_GEOMETRYSDO_GEOMETRY
XMLTEXTXMLTEXTXMLXMLXMLTypeXMLType

Kotlin 类型自动推断见📚Kotlin Type 到 KColumnType。@ColumnType 是用户主动选择其他枚举值的入口。