diff --git a/build.gradle.kts b/build.gradle.kts
index 06b3bb4..b49c786 100644
--- a/build.gradle.kts
+++ b/build.gradle.kts
@@ -17,7 +17,7 @@ ext["excludeTest"] = { project: Project, tasks: TaskContainer ->
 
 
 plugins {
-    kotlin("jvm") version "1.4.31"
+    kotlin("jvm") version "1.4.32"
     `maven-publish`
 }
 
diff --git a/settings.gradle.kts b/settings.gradle.kts
index 3cca404..fc338bc 100644
--- a/settings.gradle.kts
+++ b/settings.gradle.kts
@@ -18,6 +18,7 @@ include("ts-socket")
 include("ts-web")
 include("ts-web:ts-web-netty")
 include("ts-web:ts-web-coroutine")
+include("ts-database")
 //include("web", "aop", "database", "utils", "utils:xml", "utils:async-http", "web:netty-web")
 //include("socket", "socket:socket-async")
 //include("AsyncSocket")
diff --git a/ts-core/build.gradle.kts b/ts-core/build.gradle.kts
index 53a3b36..4a36a85 100644
--- a/ts-core/build.gradle.kts
+++ b/ts-core/build.gradle.kts
@@ -4,7 +4,7 @@ plugins {
 }
 
 dependencies {
-  implementation(project(":"))
+  api(project(":"))
   compileOnly(group = "com.google.code.gson", name = "gson", version = "2.8.6")
   compileOnly(group = "io.netty", name = "netty-all", version = "4.1.43.Final")
 }
diff --git a/ts-core/ts-coroutine/ts-coroutine-lock/build.gradle.kts b/ts-core/ts-coroutine/ts-coroutine-lock/build.gradle.kts
index 4602613..1b0fb84 100644
--- a/ts-core/ts-coroutine/ts-coroutine-lock/build.gradle.kts
+++ b/ts-core/ts-coroutine/ts-coroutine-lock/build.gradle.kts
@@ -5,6 +5,7 @@ plugins {
 
 dependencies {
   implementation(project(":ts-core"))
+  api("org.jetbrains.kotlinx:kotlinx-coroutines-core:1.4.2")
 }
 
 @kotlin.Suppress("UNCHECKED_CAST")
diff --git a/ts-core/ts-delegation/src/main/kotlin/cn/tursom/delegation/DecoratorDelegateProvider.kt b/ts-core/ts-delegation/src/main/kotlin/cn/tursom/core/delegation/DecoratorDelegateProvider.kt
similarity index 89%
rename from ts-core/ts-delegation/src/main/kotlin/cn/tursom/delegation/DecoratorDelegateProvider.kt
rename to ts-core/ts-delegation/src/main/kotlin/cn/tursom/core/delegation/DecoratorDelegateProvider.kt
index aebbc6c..9e8db36 100644
--- a/ts-core/ts-delegation/src/main/kotlin/cn/tursom/delegation/DecoratorDelegateProvider.kt
+++ b/ts-core/ts-delegation/src/main/kotlin/cn/tursom/core/delegation/DecoratorDelegateProvider.kt
@@ -1,4 +1,4 @@
-package cn.tursom.delegation
+package cn.tursom.core.delegation
 
 import kotlin.reflect.KProperty
 
diff --git a/ts-core/ts-delegation/src/main/kotlin/cn/tursom/delegation/DecoratorDelegatedField.kt b/ts-core/ts-delegation/src/main/kotlin/cn/tursom/core/delegation/DecoratorDelegatedField.kt
similarity index 73%
rename from ts-core/ts-delegation/src/main/kotlin/cn/tursom/delegation/DecoratorDelegatedField.kt
rename to ts-core/ts-delegation/src/main/kotlin/cn/tursom/core/delegation/DecoratorDelegatedField.kt
index e007cae..94167d9 100644
--- a/ts-core/ts-delegation/src/main/kotlin/cn/tursom/delegation/DecoratorDelegatedField.kt
+++ b/ts-core/ts-delegation/src/main/kotlin/cn/tursom/core/delegation/DecoratorDelegatedField.kt
@@ -1,4 +1,4 @@
-package cn.tursom.delegation
+package cn.tursom.core.delegation
 
 interface DecoratorDelegatedField<in T, out V> {
   val delegatedField: DelegatedField<T, V>
diff --git a/ts-core/ts-delegation/src/main/kotlin/cn/tursom/delegation/DecoratorMutableDelegateProvider.kt b/ts-core/ts-delegation/src/main/kotlin/cn/tursom/core/delegation/DecoratorMutableDelegateProvider.kt
similarity index 91%
rename from ts-core/ts-delegation/src/main/kotlin/cn/tursom/delegation/DecoratorMutableDelegateProvider.kt
rename to ts-core/ts-delegation/src/main/kotlin/cn/tursom/core/delegation/DecoratorMutableDelegateProvider.kt
index d0c44ea..2c6011d 100644
--- a/ts-core/ts-delegation/src/main/kotlin/cn/tursom/delegation/DecoratorMutableDelegateProvider.kt
+++ b/ts-core/ts-delegation/src/main/kotlin/cn/tursom/core/delegation/DecoratorMutableDelegateProvider.kt
@@ -1,4 +1,4 @@
-package cn.tursom.delegation
+package cn.tursom.core.delegation
 
 import kotlin.reflect.KProperty
 
diff --git a/ts-core/ts-delegation/src/main/kotlin/cn/tursom/delegation/DecoratorMutableDelegatedField.kt b/ts-core/ts-delegation/src/main/kotlin/cn/tursom/core/delegation/DecoratorMutableDelegatedField.kt
similarity index 86%
rename from ts-core/ts-delegation/src/main/kotlin/cn/tursom/delegation/DecoratorMutableDelegatedField.kt
rename to ts-core/ts-delegation/src/main/kotlin/cn/tursom/core/delegation/DecoratorMutableDelegatedField.kt
index 0bb2f9f..3b5ca37 100644
--- a/ts-core/ts-delegation/src/main/kotlin/cn/tursom/delegation/DecoratorMutableDelegatedField.kt
+++ b/ts-core/ts-delegation/src/main/kotlin/cn/tursom/core/delegation/DecoratorMutableDelegatedField.kt
@@ -1,4 +1,4 @@
-package cn.tursom.delegation
+package cn.tursom.core.delegation
 
 interface DecoratorMutableDelegatedField<in T, V> : DecoratorDelegatedField<T, V> {
   val mutableDelegatedField: MutableDelegatedField<T, V>
diff --git a/ts-core/ts-delegation/src/main/kotlin/cn/tursom/delegation/DelegateProvider.kt b/ts-core/ts-delegation/src/main/kotlin/cn/tursom/core/delegation/DelegateProvider.kt
similarity index 80%
rename from ts-core/ts-delegation/src/main/kotlin/cn/tursom/delegation/DelegateProvider.kt
rename to ts-core/ts-delegation/src/main/kotlin/cn/tursom/core/delegation/DelegateProvider.kt
index d737a49..945e0db 100644
--- a/ts-core/ts-delegation/src/main/kotlin/cn/tursom/delegation/DelegateProvider.kt
+++ b/ts-core/ts-delegation/src/main/kotlin/cn/tursom/core/delegation/DelegateProvider.kt
@@ -1,4 +1,4 @@
-package cn.tursom.delegation
+package cn.tursom.core.delegation
 
 import kotlin.reflect.KProperty
 
diff --git a/ts-core/ts-delegation/src/main/kotlin/cn/tursom/delegation/DelegatedField.kt b/ts-core/ts-delegation/src/main/kotlin/cn/tursom/core/delegation/DelegatedField.kt
similarity index 97%
rename from ts-core/ts-delegation/src/main/kotlin/cn/tursom/delegation/DelegatedField.kt
rename to ts-core/ts-delegation/src/main/kotlin/cn/tursom/core/delegation/DelegatedField.kt
index c59cf69..b736d6e 100644
--- a/ts-core/ts-delegation/src/main/kotlin/cn/tursom/delegation/DelegatedField.kt
+++ b/ts-core/ts-delegation/src/main/kotlin/cn/tursom/core/delegation/DelegatedField.kt
@@ -1,4 +1,4 @@
-package cn.tursom.delegation
+package cn.tursom.core.delegation
 
 import kotlin.reflect.KProperty
 
diff --git a/ts-core/ts-delegation/src/main/kotlin/cn/tursom/delegation/DelegatedFieldAttachmentKey.kt b/ts-core/ts-delegation/src/main/kotlin/cn/tursom/core/delegation/DelegatedFieldAttachmentKey.kt
similarity index 54%
rename from ts-core/ts-delegation/src/main/kotlin/cn/tursom/delegation/DelegatedFieldAttachmentKey.kt
rename to ts-core/ts-delegation/src/main/kotlin/cn/tursom/core/delegation/DelegatedFieldAttachmentKey.kt
index 1f26256..f843077 100644
--- a/ts-core/ts-delegation/src/main/kotlin/cn/tursom/delegation/DelegatedFieldAttachmentKey.kt
+++ b/ts-core/ts-delegation/src/main/kotlin/cn/tursom/core/delegation/DelegatedFieldAttachmentKey.kt
@@ -1,3 +1,3 @@
-package cn.tursom.delegation
+package cn.tursom.core.delegation
 
 interface DelegatedFieldAttachmentKey<V>
\ No newline at end of file
diff --git a/ts-core/ts-delegation/src/main/kotlin/cn/tursom/delegation/ExecutorMutableDelegatedField.kt b/ts-core/ts-delegation/src/main/kotlin/cn/tursom/core/delegation/ExecutorMutableDelegatedField.kt
similarity index 95%
rename from ts-core/ts-delegation/src/main/kotlin/cn/tursom/delegation/ExecutorMutableDelegatedField.kt
rename to ts-core/ts-delegation/src/main/kotlin/cn/tursom/core/delegation/ExecutorMutableDelegatedField.kt
index d1f2366..d16d16c 100644
--- a/ts-core/ts-delegation/src/main/kotlin/cn/tursom/delegation/ExecutorMutableDelegatedField.kt
+++ b/ts-core/ts-delegation/src/main/kotlin/cn/tursom/core/delegation/ExecutorMutableDelegatedField.kt
@@ -1,4 +1,4 @@
-package cn.tursom.delegation
+package cn.tursom.core.delegation
 
 import java.util.concurrent.Executor
 import kotlin.reflect.KProperty
diff --git a/ts-core/ts-delegation/src/main/kotlin/cn/tursom/delegation/FilterDelegatedField.kt b/ts-core/ts-delegation/src/main/kotlin/cn/tursom/core/delegation/FilterDelegatedField.kt
similarity index 96%
rename from ts-core/ts-delegation/src/main/kotlin/cn/tursom/delegation/FilterDelegatedField.kt
rename to ts-core/ts-delegation/src/main/kotlin/cn/tursom/core/delegation/FilterDelegatedField.kt
index 4a82cc6..a6899b0 100644
--- a/ts-core/ts-delegation/src/main/kotlin/cn/tursom/delegation/FilterDelegatedField.kt
+++ b/ts-core/ts-delegation/src/main/kotlin/cn/tursom/core/delegation/FilterDelegatedField.kt
@@ -1,4 +1,4 @@
-package cn.tursom.delegation
+package cn.tursom.core.delegation
 
 import cn.tursom.core.cast
 import kotlin.reflect.KProperty
diff --git a/ts-core/ts-delegation/src/main/kotlin/cn/tursom/delegation/GetterDelegatedField.kt b/ts-core/ts-delegation/src/main/kotlin/cn/tursom/core/delegation/GetterDelegatedField.kt
similarity index 92%
rename from ts-core/ts-delegation/src/main/kotlin/cn/tursom/delegation/GetterDelegatedField.kt
rename to ts-core/ts-delegation/src/main/kotlin/cn/tursom/core/delegation/GetterDelegatedField.kt
index 86b205d..5d94c33 100644
--- a/ts-core/ts-delegation/src/main/kotlin/cn/tursom/delegation/GetterDelegatedField.kt
+++ b/ts-core/ts-delegation/src/main/kotlin/cn/tursom/core/delegation/GetterDelegatedField.kt
@@ -1,4 +1,4 @@
-package cn.tursom.delegation
+package cn.tursom.core.delegation
 
 import kotlin.reflect.KProperty
 
diff --git a/ts-core/ts-delegation/src/main/kotlin/cn/tursom/delegation/GetterMutableDelegatedField.kt b/ts-core/ts-delegation/src/main/kotlin/cn/tursom/core/delegation/GetterMutableDelegatedField.kt
similarity index 92%
rename from ts-core/ts-delegation/src/main/kotlin/cn/tursom/delegation/GetterMutableDelegatedField.kt
rename to ts-core/ts-delegation/src/main/kotlin/cn/tursom/core/delegation/GetterMutableDelegatedField.kt
index b8a9f0a..b0a4809 100644
--- a/ts-core/ts-delegation/src/main/kotlin/cn/tursom/delegation/GetterMutableDelegatedField.kt
+++ b/ts-core/ts-delegation/src/main/kotlin/cn/tursom/core/delegation/GetterMutableDelegatedField.kt
@@ -1,4 +1,4 @@
-package cn.tursom.delegation
+package cn.tursom.core.delegation
 
 import kotlin.reflect.KProperty
 
diff --git a/ts-core/ts-delegation/src/main/kotlin/cn/tursom/delegation/KPropertyDelegatedField.kt b/ts-core/ts-delegation/src/main/kotlin/cn/tursom/core/delegation/KPropertyDelegatedField.kt
similarity index 84%
rename from ts-core/ts-delegation/src/main/kotlin/cn/tursom/delegation/KPropertyDelegatedField.kt
rename to ts-core/ts-delegation/src/main/kotlin/cn/tursom/core/delegation/KPropertyDelegatedField.kt
index 2ab2d7b..1960a89 100644
--- a/ts-core/ts-delegation/src/main/kotlin/cn/tursom/delegation/KPropertyDelegatedField.kt
+++ b/ts-core/ts-delegation/src/main/kotlin/cn/tursom/core/delegation/KPropertyDelegatedField.kt
@@ -1,4 +1,4 @@
-package cn.tursom.delegation
+package cn.tursom.core.delegation
 
 import kotlin.reflect.KProperty0
 
diff --git a/ts-core/ts-delegation/src/main/kotlin/cn/tursom/delegation/KPropertyMutableDelegatedField.kt b/ts-core/ts-delegation/src/main/kotlin/cn/tursom/core/delegation/KPropertyMutableDelegatedField.kt
similarity index 88%
rename from ts-core/ts-delegation/src/main/kotlin/cn/tursom/delegation/KPropertyMutableDelegatedField.kt
rename to ts-core/ts-delegation/src/main/kotlin/cn/tursom/core/delegation/KPropertyMutableDelegatedField.kt
index 168d5ca..0c364cd 100644
--- a/ts-core/ts-delegation/src/main/kotlin/cn/tursom/delegation/KPropertyMutableDelegatedField.kt
+++ b/ts-core/ts-delegation/src/main/kotlin/cn/tursom/core/delegation/KPropertyMutableDelegatedField.kt
@@ -1,4 +1,4 @@
-package cn.tursom.delegation
+package cn.tursom.core.delegation
 
 import kotlin.reflect.KMutableProperty0
 
diff --git a/ts-core/ts-delegation/src/main/kotlin/cn/tursom/delegation/LockMutableDelegatedField.kt b/ts-core/ts-delegation/src/main/kotlin/cn/tursom/core/delegation/LockMutableDelegatedField.kt
similarity index 96%
rename from ts-core/ts-delegation/src/main/kotlin/cn/tursom/delegation/LockMutableDelegatedField.kt
rename to ts-core/ts-delegation/src/main/kotlin/cn/tursom/core/delegation/LockMutableDelegatedField.kt
index 76c2924..a1a20f0 100644
--- a/ts-core/ts-delegation/src/main/kotlin/cn/tursom/delegation/LockMutableDelegatedField.kt
+++ b/ts-core/ts-delegation/src/main/kotlin/cn/tursom/core/delegation/LockMutableDelegatedField.kt
@@ -1,4 +1,4 @@
-package cn.tursom.delegation
+package cn.tursom.core.delegation
 
 import java.util.concurrent.locks.Lock
 import java.util.concurrent.locks.ReentrantLock
diff --git a/ts-core/ts-delegation/src/main/kotlin/cn/tursom/delegation/MutableDelegatedField.kt b/ts-core/ts-delegation/src/main/kotlin/cn/tursom/core/delegation/MutableDelegatedField.kt
similarity index 94%
rename from ts-core/ts-delegation/src/main/kotlin/cn/tursom/delegation/MutableDelegatedField.kt
rename to ts-core/ts-delegation/src/main/kotlin/cn/tursom/core/delegation/MutableDelegatedField.kt
index fd4f19e..d998c9a 100644
--- a/ts-core/ts-delegation/src/main/kotlin/cn/tursom/delegation/MutableDelegatedField.kt
+++ b/ts-core/ts-delegation/src/main/kotlin/cn/tursom/core/delegation/MutableDelegatedField.kt
@@ -1,4 +1,4 @@
-package cn.tursom.delegation
+package cn.tursom.core.delegation
 
 import kotlin.reflect.KProperty
 
diff --git a/ts-core/ts-delegation/src/main/kotlin/cn/tursom/delegation/MutableDelegatedFieldValue.kt b/ts-core/ts-delegation/src/main/kotlin/cn/tursom/core/delegation/MutableDelegatedFieldValue.kt
similarity index 92%
rename from ts-core/ts-delegation/src/main/kotlin/cn/tursom/delegation/MutableDelegatedFieldValue.kt
rename to ts-core/ts-delegation/src/main/kotlin/cn/tursom/core/delegation/MutableDelegatedFieldValue.kt
index c2aca26..2af9a52 100644
--- a/ts-core/ts-delegation/src/main/kotlin/cn/tursom/delegation/MutableDelegatedFieldValue.kt
+++ b/ts-core/ts-delegation/src/main/kotlin/cn/tursom/core/delegation/MutableDelegatedFieldValue.kt
@@ -1,4 +1,4 @@
-package cn.tursom.delegation
+package cn.tursom.core.delegation
 
 import kotlin.reflect.KProperty
 
diff --git a/ts-core/ts-delegation/src/main/kotlin/cn/tursom/delegation/NotNullDelegatedField.kt b/ts-core/ts-delegation/src/main/kotlin/cn/tursom/core/delegation/NotNullDelegatedField.kt
similarity index 86%
rename from ts-core/ts-delegation/src/main/kotlin/cn/tursom/delegation/NotNullDelegatedField.kt
rename to ts-core/ts-delegation/src/main/kotlin/cn/tursom/core/delegation/NotNullDelegatedField.kt
index 7e82e96..f04f04f 100644
--- a/ts-core/ts-delegation/src/main/kotlin/cn/tursom/delegation/NotNullDelegatedField.kt
+++ b/ts-core/ts-delegation/src/main/kotlin/cn/tursom/core/delegation/NotNullDelegatedField.kt
@@ -1,4 +1,4 @@
-package cn.tursom.delegation
+package cn.tursom.core.delegation
 
 import cn.tursom.core.cast
 
diff --git a/ts-core/ts-delegation/src/main/kotlin/cn/tursom/delegation/NotNullMutableDelegatedField.kt b/ts-core/ts-delegation/src/main/kotlin/cn/tursom/core/delegation/NotNullMutableDelegatedField.kt
similarity index 88%
rename from ts-core/ts-delegation/src/main/kotlin/cn/tursom/delegation/NotNullMutableDelegatedField.kt
rename to ts-core/ts-delegation/src/main/kotlin/cn/tursom/core/delegation/NotNullMutableDelegatedField.kt
index 9e2b9ad..446a773 100644
--- a/ts-core/ts-delegation/src/main/kotlin/cn/tursom/delegation/NotNullMutableDelegatedField.kt
+++ b/ts-core/ts-delegation/src/main/kotlin/cn/tursom/core/delegation/NotNullMutableDelegatedField.kt
@@ -1,4 +1,4 @@
-package cn.tursom.delegation
+package cn.tursom.core.delegation
 
 import cn.tursom.core.cast
 
diff --git a/ts-core/ts-delegation/src/main/kotlin/cn/tursom/delegation/ReadWriteLockMutableDelegatedField.kt b/ts-core/ts-delegation/src/main/kotlin/cn/tursom/core/delegation/ReadWriteLockMutableDelegatedField.kt
similarity index 97%
rename from ts-core/ts-delegation/src/main/kotlin/cn/tursom/delegation/ReadWriteLockMutableDelegatedField.kt
rename to ts-core/ts-delegation/src/main/kotlin/cn/tursom/core/delegation/ReadWriteLockMutableDelegatedField.kt
index 4f2d2ee..028f4d5 100644
--- a/ts-core/ts-delegation/src/main/kotlin/cn/tursom/delegation/ReadWriteLockMutableDelegatedField.kt
+++ b/ts-core/ts-delegation/src/main/kotlin/cn/tursom/core/delegation/ReadWriteLockMutableDelegatedField.kt
@@ -1,4 +1,4 @@
-package cn.tursom.delegation
+package cn.tursom.core.delegation
 
 import java.util.concurrent.locks.ReadWriteLock
 import java.util.concurrent.locks.ReentrantReadWriteLock
diff --git a/ts-core/ts-delegation/src/main/kotlin/cn/tursom/delegation/SetterDelegatedField.kt b/ts-core/ts-delegation/src/main/kotlin/cn/tursom/core/delegation/SetterDelegatedField.kt
similarity index 90%
rename from ts-core/ts-delegation/src/main/kotlin/cn/tursom/delegation/SetterDelegatedField.kt
rename to ts-core/ts-delegation/src/main/kotlin/cn/tursom/core/delegation/SetterDelegatedField.kt
index 140654c..3d977d3 100644
--- a/ts-core/ts-delegation/src/main/kotlin/cn/tursom/delegation/SetterDelegatedField.kt
+++ b/ts-core/ts-delegation/src/main/kotlin/cn/tursom/core/delegation/SetterDelegatedField.kt
@@ -1,4 +1,4 @@
-package cn.tursom.delegation
+package cn.tursom.core.delegation
 
 class SetterDelegatedField<T, V>(
   override val delegatedField: DelegatedField<T, V>,
diff --git a/ts-core/ts-delegation/src/main/kotlin/cn/tursom/delegation/SetterMutableDelegatedField.kt b/ts-core/ts-delegation/src/main/kotlin/cn/tursom/core/delegation/SetterMutableDelegatedField.kt
similarity index 93%
rename from ts-core/ts-delegation/src/main/kotlin/cn/tursom/delegation/SetterMutableDelegatedField.kt
rename to ts-core/ts-delegation/src/main/kotlin/cn/tursom/core/delegation/SetterMutableDelegatedField.kt
index 5bfb42b..d80bbab 100644
--- a/ts-core/ts-delegation/src/main/kotlin/cn/tursom/delegation/SetterMutableDelegatedField.kt
+++ b/ts-core/ts-delegation/src/main/kotlin/cn/tursom/core/delegation/SetterMutableDelegatedField.kt
@@ -1,4 +1,4 @@
-package cn.tursom.delegation
+package cn.tursom.core.delegation
 
 import kotlin.reflect.KProperty
 
diff --git a/ts-core/ts-delegation/src/main/kotlin/cn/tursom/delegation/SimpThreadLocalMutableDelegatedField.kt b/ts-core/ts-delegation/src/main/kotlin/cn/tursom/core/delegation/SimpThreadLocalMutableDelegatedField.kt
similarity index 91%
rename from ts-core/ts-delegation/src/main/kotlin/cn/tursom/delegation/SimpThreadLocalMutableDelegatedField.kt
rename to ts-core/ts-delegation/src/main/kotlin/cn/tursom/core/delegation/SimpThreadLocalMutableDelegatedField.kt
index 0aadf5d..5dfdeae 100644
--- a/ts-core/ts-delegation/src/main/kotlin/cn/tursom/delegation/SimpThreadLocalMutableDelegatedField.kt
+++ b/ts-core/ts-delegation/src/main/kotlin/cn/tursom/core/delegation/SimpThreadLocalMutableDelegatedField.kt
@@ -1,4 +1,4 @@
-package cn.tursom.delegation
+package cn.tursom.core.delegation
 
 import cn.tursom.core.SimpThreadLocal
 
diff --git a/ts-core/ts-delegation/src/main/kotlin/cn/tursom/delegation/ThreadLocalMutableDelegatedField.kt b/ts-core/ts-delegation/src/main/kotlin/cn/tursom/core/delegation/ThreadLocalMutableDelegatedField.kt
similarity index 88%
rename from ts-core/ts-delegation/src/main/kotlin/cn/tursom/delegation/ThreadLocalMutableDelegatedField.kt
rename to ts-core/ts-delegation/src/main/kotlin/cn/tursom/core/delegation/ThreadLocalMutableDelegatedField.kt
index ba5ee3f..8284aba 100644
--- a/ts-core/ts-delegation/src/main/kotlin/cn/tursom/delegation/ThreadLocalMutableDelegatedField.kt
+++ b/ts-core/ts-delegation/src/main/kotlin/cn/tursom/core/delegation/ThreadLocalMutableDelegatedField.kt
@@ -1,4 +1,4 @@
-package cn.tursom.delegation
+package cn.tursom.core.delegation
 
 class ThreadLocalMutableDelegatedField<in T, V>(
   private val threadLocal: ThreadLocal<V?> = ThreadLocal()
diff --git a/ts-core/ts-delegation/src/main/kotlin/cn/tursom/delegation/delegations.kt b/ts-core/ts-delegation/src/main/kotlin/cn/tursom/core/delegation/delegations.kt
similarity index 99%
rename from ts-core/ts-delegation/src/main/kotlin/cn/tursom/delegation/delegations.kt
rename to ts-core/ts-delegation/src/main/kotlin/cn/tursom/core/delegation/delegations.kt
index f0e5428..c0099e7 100644
--- a/ts-core/ts-delegation/src/main/kotlin/cn/tursom/delegation/delegations.kt
+++ b/ts-core/ts-delegation/src/main/kotlin/cn/tursom/core/delegation/delegations.kt
@@ -1,6 +1,6 @@
 @file:Suppress("unused")
 
-package cn.tursom.delegation
+package cn.tursom.core.delegation
 
 import cn.tursom.core.SimpThreadLocal
 import cn.tursom.core.cast
diff --git a/ts-core/ts-encrypt/src/main/kotlin/cn/tursom/core/encrypt/ECC.kt b/ts-core/ts-encrypt/src/main/kotlin/cn/tursom/core/encrypt/ECC.kt
index f881ddf..891f257 100644
--- a/ts-core/ts-encrypt/src/main/kotlin/cn/tursom/core/encrypt/ECC.kt
+++ b/ts-core/ts-encrypt/src/main/kotlin/cn/tursom/core/encrypt/ECC.kt
@@ -2,7 +2,6 @@ package cn.tursom.core.encrypt
 
 import cn.tursom.core.Unsafe
 import cn.tursom.core.cast
-import sun.security.ec.CurveDB
 import java.security.KeyFactory
 import java.security.KeyPair
 import java.security.KeyPairGenerator
@@ -17,7 +16,7 @@ import java.security.spec.X509EncodedKeySpec
 @Suppress("unused", "MemberVisibilityCanBePrivate")
 class ECC(
   publicKey: ECPublicKey,
-  privateKey: ECPrivateKey? = null
+  privateKey: ECPrivateKey? = null,
 ) : AbstractPublicKeyEncrypt("EC", publicKey, privateKey) {
 
   override val decryptMaxLen = Int.MAX_VALUE
@@ -41,7 +40,7 @@ class ECC(
 
   constructor(
     keySize: Int = 256,
-    standardCurveLine: String = StandardCurveLine.secp256k1.name.replace('_', ' ')
+    standardCurveLine: String = StandardCurveLine.secp256k1.name.replace('_', ' '),
   ) : this(
     keySize,
     ECGenParameterSpec(standardCurveLine)
@@ -71,8 +70,12 @@ class ECC(
 
   companion object {
     val standardCurveLineSet by lazy {
-      Unsafe {
-        CurveDB::class.java["nameMap"].cast<Map<String, Any>>().keys
+      try {
+        Unsafe {
+          Class.forName("sun.security.ec.CurveDB")["nameMap"].cast<Map<String, Any>>().keys
+        }
+      } catch (e: Exception) {
+        emptySet()
       }
     }
   }
diff --git a/ts-database/build.gradle.kts b/ts-database/build.gradle.kts
new file mode 100644
index 0000000..401523a
--- /dev/null
+++ b/ts-database/build.gradle.kts
@@ -0,0 +1,34 @@
+plugins {
+  kotlin("jvm")
+  `maven-publish`
+}
+
+dependencies {
+  api(project(":"))
+  api(group = "me.liuwj.ktorm", name = "ktorm-core", version = "3.1.0")
+  compileOnly(group = "com.baomidou", name = "mybatis-plus", version = "3.4.2")
+  compileOnly(group = "com.google.code.gson", name = "gson", version = "2.8.6")
+}
+
+@kotlin.Suppress("UNCHECKED_CAST")
+(rootProject.ext["excludeTest"] as (Project, TaskContainer) -> Unit)(project, tasks)
+
+tasks.register("install") {
+  finalizedBy(tasks["publishToMavenLocal"])
+}
+
+publishing {
+  publications {
+    create<MavenPublication>("maven") {
+      groupId = project.group.toString()
+      artifactId = project.name
+      version = project.version.toString()
+
+      from(components["java"])
+      try {
+        artifact(tasks["sourcesJar"])
+      } catch (e: Exception) {
+      }
+    }
+  }
+}
diff --git a/ts-database/src/main/kotlin/cn/tursom/database/AutoTable.kt b/ts-database/src/main/kotlin/cn/tursom/database/AutoTable.kt
new file mode 100644
index 0000000..b9e615d
--- /dev/null
+++ b/ts-database/src/main/kotlin/cn/tursom/database/AutoTable.kt
@@ -0,0 +1,84 @@
+package cn.tursom.database
+
+import com.baomidou.mybatisplus.annotation.TableField
+import com.ddbes.kotlin.clone.Property
+import com.ddbes.kotlin.clone.inject
+import com.ddbes.kotlin.clone.instance
+import com.ddbes.kotlin.jdbc.simpTableField
+import com.ddbes.kotlin.jdbc.tableName
+import com.ddbes.kotlin.uncheckedCast
+import me.liuwj.ktorm.dsl.QueryRowSet
+import me.liuwj.ktorm.schema.BaseTable
+import me.liuwj.ktorm.schema.Column
+import java.util.concurrent.ConcurrentHashMap
+import kotlin.reflect.KClass
+import kotlin.reflect.KProperty
+import kotlin.reflect.KProperty0
+import kotlin.reflect.KProperty1
+import kotlin.reflect.full.memberProperties
+import kotlin.reflect.jvm.javaField
+
+open class AutoTable<T : Any>(
+  entityClass: KClass<T>,
+  tableName: String = entityClass.tableName,
+  alias: String? = null,
+  catalog: String? = null,
+  schema: String? = null,
+  val unsafe: Boolean = true,
+) : BaseTable<T>(tableName, alias, catalog, schema, entityClass) {
+  private val fieldMap: Map<String, KProperty<*>>
+  private val fieldColumns: MutableMap<KProperty<*>, Column<*>> = HashMap()
+  private val fieldNameColumnMap: MutableMap<String, Column<*>> = HashMap()
+
+  init {
+    fieldMap = entityClass.memberProperties.associateBy { it.simpTableField }
+    entityClass.memberProperties.forEach {
+      val field = it.javaField ?: return@forEach
+      val tableField: TableField? = field.getAnnotation(TableField::class.java)
+      if (tableField?.exist == false) return@forEach
+      //TypeAdapterFactory.register(this, it)
+      val column = TypeAdapterFactory.register(this, it) ?: return@forEach
+      fieldColumns[it] = column
+      fieldNameColumnMap[it.name] = column
+    }
+  }
+
+  override fun doCreateEntity(row: QueryRowSet, withReferences: Boolean): T {
+    val instance = instance(unsafe, entityClass!!.java)
+    columns.forEach {
+      val field = fieldMap[it.name] ?: return@forEach
+      row[it]?.inject(instance, field.uncheckedCast<Property<Any>>())
+    }
+    return instance
+  }
+
+  operator fun <R : Any> get(property: KProperty1<T, R?>): Column<R> = fieldColumns[property].uncheckedCast()
+  //operator fun <R : Any> get(property: KProperty1<T, R?>): Column<R> = this[property.simpTableField].cast()
+
+  fun <V : Any> field(): FieldProxy<T, V> = fieldProxyInstance.uncheckedCast()
+  fun <V : Any> field(property: KProperty0<*>): Column<V> = fieldNameColumnMap[property.name].uncheckedCast()
+
+  companion object {
+    private val fieldProxyInstance = FieldProxy<Any, Any>()
+    private val autoTableMap = ConcurrentHashMap<Class<*>, AutoTable<*>>()
+    operator fun <T : Any> get(clazz: KClass<T>): AutoTable<T> = get(clazz.java)
+
+    operator fun <T : Any> get(clazz: Class<T>): AutoTable<T> {
+      var autoTable = autoTableMap[clazz]
+      if (autoTable == null) {
+        synchronized(autoTableMap) {
+          autoTable = AutoTable(clazz.kotlin)
+          autoTableMap[clazz] = autoTable.uncheckedCast()
+        }
+      }
+      return autoTable.uncheckedCast()
+    }
+
+    class FieldProxy<T : Any, V : Any> {
+      operator fun getValue(
+        autoTable: AutoTable<T>,
+        property: KProperty<*>,
+      ): Column<V> = autoTable.fieldNameColumnMap[property.name].uncheckedCast()
+    }
+  }
+}
diff --git a/ts-database/src/main/kotlin/cn/tursom/database/JsonType.kt b/ts-database/src/main/kotlin/cn/tursom/database/JsonType.kt
new file mode 100644
index 0000000..74539cf
--- /dev/null
+++ b/ts-database/src/main/kotlin/cn/tursom/database/JsonType.kt
@@ -0,0 +1,27 @@
+package cn.tursom.database
+
+import com.ddbes.kotlin.Utils
+import com.google.gson.Gson
+import me.liuwj.ktorm.schema.SqlType
+import java.lang.reflect.Type
+import java.sql.PreparedStatement
+import java.sql.ResultSet
+import java.sql.Types
+
+@Suppress("MemberVisibilityCanBePrivate")
+class JsonType<T : Any>(
+    val clazz: Type,
+    type: Int = Types.VARCHAR,
+    val gson: Gson = Utils.gson
+) : SqlType<T>(type, "json") {
+    constructor(clazz: Class<T>, type: Int = Types.VARCHAR) : this(clazz as Type, type)
+
+    override fun doGetResult(rs: ResultSet, index: Int): T? {
+        val result = rs.getString(index) ?: return null
+        return gson.fromJson(result, clazz)
+    }
+
+    override fun doSetParameter(ps: PreparedStatement, index: Int, parameter: T) {
+        ps.setString(index, gson.toJson(parameter))
+    }
+}
\ No newline at end of file
diff --git a/ts-database/src/main/kotlin/cn/tursom/database/SqlExtension.kt b/ts-database/src/main/kotlin/cn/tursom/database/SqlExtension.kt
new file mode 100644
index 0000000..ae7aa40
--- /dev/null
+++ b/ts-database/src/main/kotlin/cn/tursom/database/SqlExtension.kt
@@ -0,0 +1,151 @@
+@file:Suppress("unused")
+
+package cn.tursom.database
+
+import com.ddbes.kotlin.Utils
+import com.ddbes.kotlin.jdbc.simpTableField
+import com.ddbes.kotlin.uncheckedCast
+import com.google.gson.Gson
+import me.liuwj.ktorm.dsl.Query
+import me.liuwj.ktorm.dsl.QueryRowSet
+import me.liuwj.ktorm.schema.*
+import java.math.BigDecimal
+import java.sql.Date
+import java.sql.Time
+import java.sql.Timestamp
+import java.sql.Types
+import java.time.*
+import java.util.*
+import kotlin.reflect.KProperty
+import kotlin.reflect.KProperty1
+import kotlin.reflect.jvm.javaField
+import kotlin.reflect.jvm.javaType
+
+val KProperty<*>.table
+  get() = AutoTable[javaField!!.declaringClass].uncheckedCast<AutoTable<Any>>()
+val <T : Any> KProperty<T>.sql
+  get() = table[this.uncheckedCast<KProperty1<Any, T>>()]
+
+inline val <reified T : Any> KProperty1<T, *>.table
+  get() = AutoTable[T::class.java]
+
+inline val <reified T : Any, R : Any> KProperty1<T, R?>.sql
+  get() = table[this]
+
+fun <T> Query.getOne(transform: (rowSet: QueryRowSet) -> T): T? = if (rowSet.next()) {
+  transform(rowSet)
+} else {
+  null
+}
+
+inline fun <reified T : Any> Query.getOne(): T? = if (rowSet.next()) {
+  AutoTable[T::class].createEntity(rowSet)
+} else {
+  null
+}
+
+fun <C : Any, E : Any> BaseTable<E>.json(
+    field: KProperty1<E, C?>,
+    type: Int = Types.VARCHAR,
+    gson: Gson = Utils.gson,
+): Column<C> {
+  val sqlType = JsonType<C>(field.returnType.javaType, type, gson)
+  return this.registerColumn(field.simpTableField, sqlType)
+}
+
+fun <E : Any> BaseTable<E>.boolean(
+    field: KProperty1<E, Boolean?>,
+) = boolean(field.simpTableField)
+
+fun <E : Any> BaseTable<E>.int(
+    field: KProperty1<E, Int?>,
+) = int(field.simpTableField)
+
+fun <E : Any> BaseTable<E>.long(
+    field: KProperty1<E, Long?>,
+) = long(field.simpTableField)
+
+fun <E : Any> BaseTable<E>.float(
+    field: KProperty1<E, Float?>,
+) = float(field.simpTableField)
+
+fun <E : Any> BaseTable<E>.double(
+    field: KProperty1<E, Double?>,
+) = double(field.simpTableField)
+
+fun <E : Any> BaseTable<E>.decimal(
+    field: KProperty1<E, BigDecimal?>,
+) = decimal(field.simpTableField)
+
+fun <E : Any> BaseTable<E>.varchar(
+    field: KProperty1<E, String?>,
+) = varchar(field.simpTableField)
+
+fun <E : Any> BaseTable<E>.text(
+    field: KProperty1<E, String?>,
+) = text(field.simpTableField)
+
+fun <E : Any> BaseTable<E>.blob(
+    field: KProperty1<E, ByteArray?>,
+) = blob(field.simpTableField)
+
+fun <E : Any> BaseTable<E>.bytes(
+    field: KProperty1<E, ByteArray?>,
+) = bytes(field.simpTableField)
+
+fun <E : Any> BaseTable<E>.jdbcTimestamp(
+    field: KProperty1<E, Timestamp?>,
+) = jdbcTimestamp(field.simpTableField)
+
+fun <E : Any> BaseTable<E>.jdbcDate(
+    field: KProperty1<E, Date?>,
+) = jdbcDate(field.simpTableField)
+
+fun <E : Any> BaseTable<E>.jdbcTime(
+    field: KProperty1<E, Time?>,
+) = jdbcTime(field.simpTableField)
+
+fun <E : Any> BaseTable<E>.timestamp(
+    field: KProperty1<E, Instant?>,
+) = timestamp(field.simpTableField)
+
+fun <E : Any> BaseTable<E>.datetime(
+    field: KProperty1<E, LocalDateTime?>,
+) = datetime(field.simpTableField)
+
+fun <E : Any> BaseTable<E>.date(
+    field: KProperty1<E, LocalDate?>,
+) = date(field.simpTableField)
+
+fun <E : Any> BaseTable<E>.time(
+    field: KProperty1<E, LocalTime?>,
+) = time(field.simpTableField)
+
+fun <E : Any> BaseTable<E>.monthDay(
+    field: KProperty1<E, MonthDay?>,
+) = monthDay(field.simpTableField)
+
+
+fun <E : Any> BaseTable<E>.yearMonth(
+    field: KProperty1<E, YearMonth?>,
+) = yearMonth(field.simpTableField)
+
+
+fun <E : Any> BaseTable<E>.year(
+    field: KProperty1<E, Year?>,
+) = year(field.simpTableField)
+
+fun <E : Any> BaseTable<E>.uuid(
+    field: KProperty1<E, UUID?>,
+) = uuid(field.simpTableField)
+
+fun <E : Any, C : Enum<C>> BaseTable<E>.enum(
+    field: KProperty1<E, C?>,
+    typeRef: TypeReference<C>,
+) = enum(field.simpTableField, typeRef)
+
+fun <E : Any, C : Enum<C>> BaseTable<E>.enum(
+    field: KProperty1<E, C?>,
+    type: Class<C>,
+) = registerColumn(field.simpTableField, EnumSqlType(type))
+
diff --git a/ts-database/src/main/kotlin/cn/tursom/database/TypeAdapter.kt b/ts-database/src/main/kotlin/cn/tursom/database/TypeAdapter.kt
new file mode 100644
index 0000000..e38fc29
--- /dev/null
+++ b/ts-database/src/main/kotlin/cn/tursom/database/TypeAdapter.kt
@@ -0,0 +1,25 @@
+package cn.tursom.database
+
+import me.liuwj.ktorm.schema.BaseTable
+import me.liuwj.ktorm.schema.Column
+import kotlin.reflect.KProperty1
+
+/**
+ * 将属性转化为表列的适配器
+ */
+interface TypeAdapter<T : Any> {
+    /**
+     * 该适配器的优先级,优先级越高则越优先匹配
+     * 同等优先级先注册者先匹配
+     */
+    val level: Int get() = 0
+
+    /**
+     * 注册列
+     * 如果失败则返回null
+     */
+    fun register(
+        table: BaseTable<Any>,
+        field: KProperty1<Any, T>
+    ): Column<T>?
+}
\ No newline at end of file
diff --git a/ts-database/src/main/kotlin/cn/tursom/database/TypeAdapterFactory.kt b/ts-database/src/main/kotlin/cn/tursom/database/TypeAdapterFactory.kt
new file mode 100644
index 0000000..a82961f
--- /dev/null
+++ b/ts-database/src/main/kotlin/cn/tursom/database/TypeAdapterFactory.kt
@@ -0,0 +1,76 @@
+package cn.tursom.database
+
+import com.ddbes.kotlin.classutil.getClassByPackage
+import com.ddbes.kotlin.clone.InstantAllocator
+import com.ddbes.kotlin.uncheckedCast
+import me.liuwj.ktorm.schema.BaseTable
+import me.liuwj.ktorm.schema.Column
+import java.util.concurrent.ConcurrentSkipListMap
+import java.util.concurrent.CopyOnWriteArraySet
+import kotlin.reflect.KProperty1
+import kotlin.reflect.full.isSubclassOf
+
+/**
+ * 注册类型适配器的工厂
+ */
+object TypeAdapterFactory {
+    private val adapterMap = ConcurrentSkipListMap<Int, MutableSet<TypeAdapter<*>>>()
+
+    init {
+        scanPackage(TypeAdapterFactory::class.java.`package`.name + ".typeadapter")
+    }
+
+    private fun getAdapterQueue(level: Int): MutableCollection<TypeAdapter<*>> {
+        var set = adapterMap[-level]
+        if (set == null) {
+            synchronized(this) {
+                adapterMap[-level] = CopyOnWriteArraySet()
+                set = adapterMap[-level]!!
+            }
+        }
+        return set!!
+    }
+
+    /**
+     * 扫描包并注册适配器
+     */
+    fun scanPackage(
+        pkg: String,
+        classLoader: ClassLoader = this.javaClass.classLoader,
+    ) {
+        classLoader.getClassByPackage(pkg).forEach {
+            try {
+                val clazz = Class.forName(it).kotlin
+                if (clazz.isSubclassOf(TypeAdapter::class)) {
+                    val adapter: TypeAdapter<*> = InstantAllocator[clazz].uncheckedCast()
+                    registerAdapter(adapter)
+                }
+            } catch (e: Throwable) {
+            }
+        }
+    }
+
+    /**
+     * 注册适配器实例
+     */
+    fun registerAdapter(adapter: TypeAdapter<*>) {
+        getAdapterQueue(adapter.level).add(adapter)
+    }
+
+    fun register(
+        table: BaseTable<*>,
+        field: KProperty1<*, *>,
+    ): Column<*>? {
+        adapterMap.forEach { (_, queue) ->
+            queue.forEach {
+                val column = it.register(table.uncheckedCast(), field.uncheckedCast())
+                if (column != null) {
+                    return column
+                }
+            }
+        }
+        return null
+    }
+
+    override fun toString() = adapterMap.toString()
+}
diff --git a/ts-database/src/main/kotlin/cn/tursom/database/annotations/Json.kt b/ts-database/src/main/kotlin/cn/tursom/database/annotations/Json.kt
new file mode 100644
index 0000000..b26a628
--- /dev/null
+++ b/ts-database/src/main/kotlin/cn/tursom/database/annotations/Json.kt
@@ -0,0 +1,7 @@
+package cn.tursom.database.annotations
+
+
+@MustBeDocumented
+@Retention(AnnotationRetention.RUNTIME)
+@Target(AnnotationTarget.PROPERTY)
+annotation class Json
\ No newline at end of file
diff --git a/ts-database/src/main/kotlin/cn/tursom/database/typeadapter/BooleanAdapter.kt b/ts-database/src/main/kotlin/cn/tursom/database/typeadapter/BooleanAdapter.kt
new file mode 100644
index 0000000..31b2328
--- /dev/null
+++ b/ts-database/src/main/kotlin/cn/tursom/database/typeadapter/BooleanAdapter.kt
@@ -0,0 +1,20 @@
+package cn.tursom.database.typeadapter
+
+import cn.tursom.database.TypeAdapter
+import cn.tursom.database.boolean
+import me.liuwj.ktorm.schema.BaseTable
+import me.liuwj.ktorm.schema.Column
+import kotlin.reflect.KProperty1
+import kotlin.reflect.jvm.jvmErasure
+
+object BooleanAdapter : TypeAdapter<Boolean> {
+    override fun register(table: BaseTable<Any>, field: KProperty1<Any, Boolean>): Column<Boolean>? {
+        return if (field.returnType.jvmErasure == Boolean::class) {
+            table.boolean(field)
+        } else {
+            null
+        }
+    }
+
+    override fun toString() = "BooleanAdapter"
+}
\ No newline at end of file
diff --git a/ts-database/src/main/kotlin/cn/tursom/database/typeadapter/BytesAdapter.kt b/ts-database/src/main/kotlin/cn/tursom/database/typeadapter/BytesAdapter.kt
new file mode 100644
index 0000000..3720b9b
--- /dev/null
+++ b/ts-database/src/main/kotlin/cn/tursom/database/typeadapter/BytesAdapter.kt
@@ -0,0 +1,20 @@
+package cn.tursom.database.typeadapter
+
+import cn.tursom.database.TypeAdapter
+import cn.tursom.database.bytes
+import me.liuwj.ktorm.schema.BaseTable
+import me.liuwj.ktorm.schema.Column
+import kotlin.reflect.KProperty1
+import kotlin.reflect.jvm.jvmErasure
+
+object BytesAdapter : TypeAdapter<ByteArray> {
+    override fun register(table: BaseTable<Any>, field: KProperty1<Any, ByteArray>): Column<ByteArray>? {
+        return if (field.returnType.jvmErasure == ByteArray::class) {
+            table.bytes(field)
+        } else {
+            null
+        }
+    }
+
+    override fun toString() = "BytesAdapter"
+}
\ No newline at end of file
diff --git a/ts-database/src/main/kotlin/cn/tursom/database/typeadapter/DateAdapter.kt b/ts-database/src/main/kotlin/cn/tursom/database/typeadapter/DateAdapter.kt
new file mode 100644
index 0000000..e1b5219
--- /dev/null
+++ b/ts-database/src/main/kotlin/cn/tursom/database/typeadapter/DateAdapter.kt
@@ -0,0 +1,21 @@
+package cn.tursom.database.typeadapter
+
+import cn.tursom.database.TypeAdapter
+import cn.tursom.database.jdbcDate
+import me.liuwj.ktorm.schema.BaseTable
+import me.liuwj.ktorm.schema.Column
+import java.sql.Date
+import kotlin.reflect.KProperty1
+import kotlin.reflect.jvm.jvmErasure
+
+object DateAdapter : TypeAdapter<Date> {
+    override fun register(table: BaseTable<Any>, field: KProperty1<Any, Date>): Column<Date>? {
+        return if (field.returnType.jvmErasure == Date::class) {
+            table.jdbcDate(field)
+        } else {
+            null
+        }
+    }
+
+    override fun toString() = "DateAdapter"
+}
\ No newline at end of file
diff --git a/ts-database/src/main/kotlin/cn/tursom/database/typeadapter/DoubleAdapter.kt b/ts-database/src/main/kotlin/cn/tursom/database/typeadapter/DoubleAdapter.kt
new file mode 100644
index 0000000..7c089df
--- /dev/null
+++ b/ts-database/src/main/kotlin/cn/tursom/database/typeadapter/DoubleAdapter.kt
@@ -0,0 +1,20 @@
+package cn.tursom.database.typeadapter
+
+import cn.tursom.database.TypeAdapter
+import cn.tursom.database.double
+import me.liuwj.ktorm.schema.BaseTable
+import me.liuwj.ktorm.schema.Column
+import kotlin.reflect.KProperty1
+import kotlin.reflect.jvm.jvmErasure
+
+object DoubleAdapter : TypeAdapter<Double> {
+    override fun register(table: BaseTable<Any>, field: KProperty1<Any, Double>): Column<Double>? {
+        return if (field.returnType.jvmErasure == Double::class) {
+            table.double(field)
+        } else {
+            null
+        }
+    }
+
+    override fun toString() = "DoubleAdapter"
+}
\ No newline at end of file
diff --git a/ts-database/src/main/kotlin/cn/tursom/database/typeadapter/EnumAdapter.kt b/ts-database/src/main/kotlin/cn/tursom/database/typeadapter/EnumAdapter.kt
new file mode 100644
index 0000000..1b5dbc5
--- /dev/null
+++ b/ts-database/src/main/kotlin/cn/tursom/database/typeadapter/EnumAdapter.kt
@@ -0,0 +1,28 @@
+package cn.tursom.database.typeadapter
+
+import cn.tursom.database.TypeAdapter
+import com.ddbes.kotlin.jdbc.simpTableField
+import com.ddbes.kotlin.uncheckedCast
+import me.liuwj.ktorm.schema.BaseTable
+import me.liuwj.ktorm.schema.Column
+import me.liuwj.ktorm.schema.EnumSqlType
+import kotlin.reflect.KProperty1
+import kotlin.reflect.full.isSubclassOf
+import kotlin.reflect.jvm.jvmErasure
+
+object EnumAdapter : TypeAdapter<EnumAdapter.EnumType> {
+    enum class EnumType
+
+    override fun register(table: BaseTable<Any>, field: KProperty1<Any, EnumType>): Column<EnumType>? {
+        val kClass = field.returnType.jvmErasure
+        return if (kClass.isSubclassOf(Enum::class)) {
+            table.registerColumn(field.simpTableField, EnumSqlType<EnumType>(kClass.java.uncheckedCast()))
+                .uncheckedCast()
+        } else {
+            null
+        }
+    }
+
+    override fun toString() = "EnumAdapter"
+
+}
\ No newline at end of file
diff --git a/ts-database/src/main/kotlin/cn/tursom/database/typeadapter/FloatAdapter.kt b/ts-database/src/main/kotlin/cn/tursom/database/typeadapter/FloatAdapter.kt
new file mode 100644
index 0000000..cbecf76
--- /dev/null
+++ b/ts-database/src/main/kotlin/cn/tursom/database/typeadapter/FloatAdapter.kt
@@ -0,0 +1,20 @@
+package cn.tursom.database.typeadapter
+
+import cn.tursom.database.TypeAdapter
+import cn.tursom.database.float
+import me.liuwj.ktorm.schema.BaseTable
+import me.liuwj.ktorm.schema.Column
+import kotlin.reflect.KProperty1
+import kotlin.reflect.jvm.jvmErasure
+
+object FloatAdapter : TypeAdapter<Float> {
+    override fun register(table: BaseTable<Any>, field: KProperty1<Any, Float>): Column<Float>? {
+        return if (field.returnType.jvmErasure == Float::class) {
+            table.float(field)
+        } else {
+            null
+        }
+    }
+
+    override fun toString() = "FloatAdapter"
+}
\ No newline at end of file
diff --git a/ts-database/src/main/kotlin/cn/tursom/database/typeadapter/InstantAdapter.kt b/ts-database/src/main/kotlin/cn/tursom/database/typeadapter/InstantAdapter.kt
new file mode 100644
index 0000000..eda69b9
--- /dev/null
+++ b/ts-database/src/main/kotlin/cn/tursom/database/typeadapter/InstantAdapter.kt
@@ -0,0 +1,21 @@
+package cn.tursom.database.typeadapter
+
+import cn.tursom.database.TypeAdapter
+import cn.tursom.database.timestamp
+import me.liuwj.ktorm.schema.BaseTable
+import me.liuwj.ktorm.schema.Column
+import java.time.Instant
+import kotlin.reflect.KProperty1
+import kotlin.reflect.jvm.jvmErasure
+
+object InstantAdapter : TypeAdapter<Instant> {
+    override fun register(table: BaseTable<Any>, field: KProperty1<Any, Instant>): Column<Instant>? {
+        return if (field.returnType.jvmErasure == Instant::class) {
+            table.timestamp(field)
+        } else {
+            null
+        }
+    }
+
+    override fun toString() = "InstantAdapter"
+}
\ No newline at end of file
diff --git a/ts-database/src/main/kotlin/cn/tursom/database/typeadapter/IntAdapter.kt b/ts-database/src/main/kotlin/cn/tursom/database/typeadapter/IntAdapter.kt
new file mode 100644
index 0000000..1a2e2ee
--- /dev/null
+++ b/ts-database/src/main/kotlin/cn/tursom/database/typeadapter/IntAdapter.kt
@@ -0,0 +1,20 @@
+package cn.tursom.database.typeadapter
+
+import cn.tursom.database.TypeAdapter
+import cn.tursom.database.int
+import me.liuwj.ktorm.schema.BaseTable
+import me.liuwj.ktorm.schema.Column
+import kotlin.reflect.KProperty1
+import kotlin.reflect.jvm.jvmErasure
+
+object IntAdapter : TypeAdapter<Int> {
+    override fun register(table: BaseTable<Any>, field: KProperty1<Any, Int>): Column<Int>? {
+        return if (field.returnType.jvmErasure == Int::class) {
+            table.int(field)
+        } else {
+            null
+        }
+    }
+
+    override fun toString() = "IntAdapter"
+}
\ No newline at end of file
diff --git a/ts-database/src/main/kotlin/cn/tursom/database/typeadapter/IntAdapterAdapter.kt b/ts-database/src/main/kotlin/cn/tursom/database/typeadapter/IntAdapterAdapter.kt
new file mode 100644
index 0000000..e9c69be
--- /dev/null
+++ b/ts-database/src/main/kotlin/cn/tursom/database/typeadapter/IntAdapterAdapter.kt
@@ -0,0 +1,21 @@
+package cn.tursom.database.typeadapter
+
+import cn.tursom.database.TypeAdapter
+import cn.tursom.database.decimal
+import me.liuwj.ktorm.schema.BaseTable
+import me.liuwj.ktorm.schema.Column
+import java.math.BigDecimal
+import kotlin.reflect.KProperty1
+import kotlin.reflect.jvm.jvmErasure
+
+object IntAdapterAdapter : TypeAdapter<BigDecimal> {
+    override fun register(table: BaseTable<Any>, field: KProperty1<Any, BigDecimal>): Column<BigDecimal>? {
+        return if (field.returnType.jvmErasure == BigDecimal::class) {
+            table.decimal(field)
+        } else {
+            null
+        }
+    }
+
+    override fun toString() = "IntAdapterAdapter"
+}
\ No newline at end of file
diff --git a/ts-database/src/main/kotlin/cn/tursom/database/typeadapter/JsonAdapter.kt b/ts-database/src/main/kotlin/cn/tursom/database/typeadapter/JsonAdapter.kt
new file mode 100644
index 0000000..4122ae4
--- /dev/null
+++ b/ts-database/src/main/kotlin/cn/tursom/database/typeadapter/JsonAdapter.kt
@@ -0,0 +1,23 @@
+package cn.tursom.database.typeadapter
+
+import cn.tursom.database.TypeAdapter
+import cn.tursom.database.annotations.Json
+import cn.tursom.database.json
+import me.liuwj.ktorm.schema.BaseTable
+import me.liuwj.ktorm.schema.Column
+import kotlin.reflect.KProperty1
+import kotlin.reflect.full.findAnnotation
+
+object JsonAdapter : TypeAdapter<Int> {
+    override val level: Int get() = -16
+
+    override fun register(table: BaseTable<Any>, field: KProperty1<Any, Int>): Column<Int>? {
+        return if (field.findAnnotation<Json>() != null) {
+            table.json(field)
+        } else {
+            null
+        }
+    }
+
+    override fun toString() = "JsonAdapter"
+}
\ No newline at end of file
diff --git a/ts-database/src/main/kotlin/cn/tursom/database/typeadapter/LocalDateAdapter.kt b/ts-database/src/main/kotlin/cn/tursom/database/typeadapter/LocalDateAdapter.kt
new file mode 100644
index 0000000..2638b58
--- /dev/null
+++ b/ts-database/src/main/kotlin/cn/tursom/database/typeadapter/LocalDateAdapter.kt
@@ -0,0 +1,21 @@
+package cn.tursom.database.typeadapter
+
+import cn.tursom.database.TypeAdapter
+import cn.tursom.database.date
+import me.liuwj.ktorm.schema.BaseTable
+import me.liuwj.ktorm.schema.Column
+import java.time.LocalDate
+import kotlin.reflect.KProperty1
+import kotlin.reflect.jvm.jvmErasure
+
+object LocalDateAdapter : TypeAdapter<LocalDate> {
+    override fun register(table: BaseTable<Any>, field: KProperty1<Any, LocalDate>): Column<LocalDate>? {
+        return if (field.returnType.jvmErasure == LocalDate::class) {
+            table.date(field)
+        } else {
+            null
+        }
+    }
+
+    override fun toString() = "LocalDateAdapter"
+}
\ No newline at end of file
diff --git a/ts-database/src/main/kotlin/cn/tursom/database/typeadapter/LocalDateTimeAdapter.kt b/ts-database/src/main/kotlin/cn/tursom/database/typeadapter/LocalDateTimeAdapter.kt
new file mode 100644
index 0000000..b490c0e
--- /dev/null
+++ b/ts-database/src/main/kotlin/cn/tursom/database/typeadapter/LocalDateTimeAdapter.kt
@@ -0,0 +1,21 @@
+package cn.tursom.database.typeadapter
+
+import cn.tursom.database.TypeAdapter
+import cn.tursom.database.datetime
+import me.liuwj.ktorm.schema.BaseTable
+import me.liuwj.ktorm.schema.Column
+import java.time.LocalDateTime
+import kotlin.reflect.KProperty1
+import kotlin.reflect.jvm.jvmErasure
+
+object LocalDateTimeAdapter : TypeAdapter<LocalDateTime> {
+    override fun register(table: BaseTable<Any>, field: KProperty1<Any, LocalDateTime>): Column<LocalDateTime>? {
+        return if (field.returnType.jvmErasure == LocalDateTime::class) {
+            table.datetime(field)
+        } else {
+            null
+        }
+    }
+
+    override fun toString() = "LocalDateTimeAdapter"
+}
\ No newline at end of file
diff --git a/ts-database/src/main/kotlin/cn/tursom/database/typeadapter/LocalTimeAdapter.kt b/ts-database/src/main/kotlin/cn/tursom/database/typeadapter/LocalTimeAdapter.kt
new file mode 100644
index 0000000..c80e3ab
--- /dev/null
+++ b/ts-database/src/main/kotlin/cn/tursom/database/typeadapter/LocalTimeAdapter.kt
@@ -0,0 +1,21 @@
+package cn.tursom.database.typeadapter
+
+import cn.tursom.database.TypeAdapter
+import cn.tursom.database.time
+import me.liuwj.ktorm.schema.BaseTable
+import me.liuwj.ktorm.schema.Column
+import java.time.LocalTime
+import kotlin.reflect.KProperty1
+import kotlin.reflect.jvm.jvmErasure
+
+object LocalTimeAdapter : TypeAdapter<LocalTime> {
+    override fun register(table: BaseTable<Any>, field: KProperty1<Any, LocalTime>): Column<LocalTime>? {
+        return if (field.returnType.jvmErasure == LocalTime::class) {
+            table.time(field)
+        } else {
+            null
+        }
+    }
+
+    override fun toString() = "LocalTimeAdapter"
+}
\ No newline at end of file
diff --git a/ts-database/src/main/kotlin/cn/tursom/database/typeadapter/LongAdapter.kt b/ts-database/src/main/kotlin/cn/tursom/database/typeadapter/LongAdapter.kt
new file mode 100644
index 0000000..6a8ba9a
--- /dev/null
+++ b/ts-database/src/main/kotlin/cn/tursom/database/typeadapter/LongAdapter.kt
@@ -0,0 +1,20 @@
+package cn.tursom.database.typeadapter
+
+import cn.tursom.database.TypeAdapter
+import cn.tursom.database.long
+import me.liuwj.ktorm.schema.BaseTable
+import me.liuwj.ktorm.schema.Column
+import kotlin.reflect.KProperty1
+import kotlin.reflect.jvm.jvmErasure
+
+object LongAdapter : TypeAdapter<Long> {
+    override fun register(table: BaseTable<Any>, field: KProperty1<Any, Long>): Column<Long>? {
+        return if (field.returnType.jvmErasure == Long::class) {
+            table.long(field)
+        } else {
+            null
+        }
+    }
+
+    override fun toString() = "LongAdapter"
+}
\ No newline at end of file
diff --git a/ts-database/src/main/kotlin/cn/tursom/database/typeadapter/MonthDayAdapter.kt b/ts-database/src/main/kotlin/cn/tursom/database/typeadapter/MonthDayAdapter.kt
new file mode 100644
index 0000000..385b71b
--- /dev/null
+++ b/ts-database/src/main/kotlin/cn/tursom/database/typeadapter/MonthDayAdapter.kt
@@ -0,0 +1,21 @@
+package cn.tursom.database.typeadapter
+
+import cn.tursom.database.TypeAdapter
+import cn.tursom.database.monthDay
+import me.liuwj.ktorm.schema.BaseTable
+import me.liuwj.ktorm.schema.Column
+import java.time.MonthDay
+import kotlin.reflect.KProperty1
+import kotlin.reflect.jvm.jvmErasure
+
+object MonthDayAdapter : TypeAdapter<MonthDay> {
+    override fun register(table: BaseTable<Any>, field: KProperty1<Any, MonthDay>): Column<MonthDay>? {
+        return if (field.returnType.jvmErasure == MonthDay::class) {
+            table.monthDay(field)
+        } else {
+            null
+        }
+    }
+
+    override fun toString() = "MonthDayAdapter"
+}
\ No newline at end of file
diff --git a/ts-database/src/main/kotlin/cn/tursom/database/typeadapter/StringAdapter.kt b/ts-database/src/main/kotlin/cn/tursom/database/typeadapter/StringAdapter.kt
new file mode 100644
index 0000000..1aeb332
--- /dev/null
+++ b/ts-database/src/main/kotlin/cn/tursom/database/typeadapter/StringAdapter.kt
@@ -0,0 +1,20 @@
+package cn.tursom.database.typeadapter
+
+import cn.tursom.database.TypeAdapter
+import cn.tursom.database.varchar
+import me.liuwj.ktorm.schema.BaseTable
+import me.liuwj.ktorm.schema.Column
+import kotlin.reflect.KProperty1
+import kotlin.reflect.jvm.jvmErasure
+
+object StringAdapter : TypeAdapter<String> {
+    override fun register(table: BaseTable<Any>, field: KProperty1<Any, String>): Column<String>? {
+        return if (field.returnType.jvmErasure == String::class) {
+            table.varchar(field)
+        } else {
+            null
+        }
+    }
+
+    override fun toString() = "StringAdapter"
+}
\ No newline at end of file
diff --git a/ts-database/src/main/kotlin/cn/tursom/database/typeadapter/TimeAdapter.kt b/ts-database/src/main/kotlin/cn/tursom/database/typeadapter/TimeAdapter.kt
new file mode 100644
index 0000000..7d13a0b
--- /dev/null
+++ b/ts-database/src/main/kotlin/cn/tursom/database/typeadapter/TimeAdapter.kt
@@ -0,0 +1,21 @@
+package cn.tursom.database.typeadapter
+
+import cn.tursom.database.TypeAdapter
+import cn.tursom.database.jdbcTime
+import me.liuwj.ktorm.schema.BaseTable
+import me.liuwj.ktorm.schema.Column
+import java.sql.Time
+import kotlin.reflect.KProperty1
+import kotlin.reflect.jvm.jvmErasure
+
+object TimeAdapter : TypeAdapter<Time> {
+    override fun register(table: BaseTable<Any>, field: KProperty1<Any, Time>): Column<Time>? {
+        return if (field.returnType.jvmErasure == Time::class) {
+            table.jdbcTime(field)
+        } else {
+            null
+        }
+    }
+
+    override fun toString() = "TimeAdapter"
+}
\ No newline at end of file
diff --git a/ts-database/src/main/kotlin/cn/tursom/database/typeadapter/TimestampAdapter.kt b/ts-database/src/main/kotlin/cn/tursom/database/typeadapter/TimestampAdapter.kt
new file mode 100644
index 0000000..9257fe1
--- /dev/null
+++ b/ts-database/src/main/kotlin/cn/tursom/database/typeadapter/TimestampAdapter.kt
@@ -0,0 +1,21 @@
+package cn.tursom.database.typeadapter
+
+import cn.tursom.database.TypeAdapter
+import cn.tursom.database.jdbcTimestamp
+import me.liuwj.ktorm.schema.BaseTable
+import me.liuwj.ktorm.schema.Column
+import java.sql.Timestamp
+import kotlin.reflect.KProperty1
+import kotlin.reflect.jvm.jvmErasure
+
+object TimestampAdapter : TypeAdapter<Timestamp> {
+    override fun register(table: BaseTable<Any>, field: KProperty1<Any, Timestamp>): Column<Timestamp>? {
+        return if (field.returnType.jvmErasure == Timestamp::class) {
+            table.jdbcTimestamp(field)
+        } else {
+            null
+        }
+    }
+
+    override fun toString() = "TimestampAdapter"
+}
\ No newline at end of file
diff --git a/ts-database/src/main/kotlin/cn/tursom/database/typeadapter/UUIDAdapter.kt b/ts-database/src/main/kotlin/cn/tursom/database/typeadapter/UUIDAdapter.kt
new file mode 100644
index 0000000..06de931
--- /dev/null
+++ b/ts-database/src/main/kotlin/cn/tursom/database/typeadapter/UUIDAdapter.kt
@@ -0,0 +1,21 @@
+package cn.tursom.database.typeadapter
+
+import cn.tursom.database.TypeAdapter
+import cn.tursom.database.uuid
+import me.liuwj.ktorm.schema.BaseTable
+import me.liuwj.ktorm.schema.Column
+import java.util.*
+import kotlin.reflect.KProperty1
+import kotlin.reflect.jvm.jvmErasure
+
+object UUIDAdapter : TypeAdapter<UUID> {
+    override fun register(table: BaseTable<Any>, field: KProperty1<Any, UUID>): Column<UUID>? {
+        return if (field.returnType.jvmErasure == UUID::class) {
+            table.uuid(field)
+        } else {
+            null
+        }
+    }
+
+    override fun toString() = "UUIDAdapter"
+}
\ No newline at end of file
diff --git a/ts-database/src/main/kotlin/cn/tursom/database/typeadapter/YearAdapter.kt b/ts-database/src/main/kotlin/cn/tursom/database/typeadapter/YearAdapter.kt
new file mode 100644
index 0000000..e5bc90b
--- /dev/null
+++ b/ts-database/src/main/kotlin/cn/tursom/database/typeadapter/YearAdapter.kt
@@ -0,0 +1,21 @@
+package cn.tursom.database.typeadapter
+
+import cn.tursom.database.TypeAdapter
+import cn.tursom.database.year
+import me.liuwj.ktorm.schema.BaseTable
+import me.liuwj.ktorm.schema.Column
+import java.time.Year
+import kotlin.reflect.KProperty1
+import kotlin.reflect.jvm.jvmErasure
+
+object YearAdapter : TypeAdapter<Year> {
+    override fun register(table: BaseTable<Any>, field: KProperty1<Any, Year>): Column<Year>? {
+        return if (field.returnType.jvmErasure == Year::class) {
+            table.year(field)
+        } else {
+            null
+        }
+    }
+
+    override fun toString() = "YearAdapter"
+}
\ No newline at end of file
diff --git a/ts-database/src/main/kotlin/cn/tursom/database/typeadapter/YearMonthAdapter.kt b/ts-database/src/main/kotlin/cn/tursom/database/typeadapter/YearMonthAdapter.kt
new file mode 100644
index 0000000..c53cc16
--- /dev/null
+++ b/ts-database/src/main/kotlin/cn/tursom/database/typeadapter/YearMonthAdapter.kt
@@ -0,0 +1,21 @@
+package cn.tursom.database.typeadapter
+
+import cn.tursom.database.TypeAdapter
+import cn.tursom.database.yearMonth
+import me.liuwj.ktorm.schema.BaseTable
+import me.liuwj.ktorm.schema.Column
+import java.time.YearMonth
+import kotlin.reflect.KProperty1
+import kotlin.reflect.jvm.jvmErasure
+
+object YearMonthAdapter : TypeAdapter<YearMonth> {
+    override fun register(table: BaseTable<Any>, field: KProperty1<Any, YearMonth>): Column<YearMonth>? {
+        return if (field.returnType.jvmErasure == YearMonth::class) {
+            table.yearMonth(field)
+        } else {
+            null
+        }
+    }
+
+    override fun toString() = "YearMonthAdapter"
+}
\ No newline at end of file