SQL
SQLite, MySQL, and PostgreSQL storage
Honey's SQL backend stores serialized JSON blobs in a single shared table. It supports SQLite (local file), MySQL, and PostgreSQL.
When to Use
- Production servers with moderate to large datasets
- When you need atomic operations
- When multiple plugins share a database
- Most common choice for Minecraft plugins
Setup
import me.jordanfails.honey.DataHandler
import me.jordanfails.honey.DataStoreType
import me.jordanfails.honey.connection.dataFramework
// Local file — no server needed
dataFramework {
sqlite(path = "./data/honey.db")
}
val store = DataHandler.createStoreType<String, PlayerData>(DataStoreType.SQL) {
it.id = "players"
}import me.jordanfails.honey.DataHandler
import me.jordanfails.honey.DataStoreType
import me.jordanfails.honey.connection.dataFramework
dataFramework {
mysql(
host = "localhost",
port = 3306,
database = "myplugin",
username = "root",
password = "secret"
)
}
val store = DataHandler.createStoreType<String, PlayerData>(DataStoreType.SQL) {
it.id = "players"
}import me.jordanfails.honey.DataHandler
import me.jordanfails.honey.DataStoreType
import me.jordanfails.honey.connection.dataFramework
dataFramework {
postgres(
host = "localhost",
port = 5432,
database = "myplugin",
username = "postgres",
password = "secret"
)
}
val store = DataHandler.createStoreType<String, PlayerData>(DataStoreType.SQL) {
it.id = "players"
}Full Example
class StatsPlugin : JavaPlugin(), Listener {
private lateinit var statsStore: DataStore<String, PlayerStats>
override fun onEnable() {
dataFramework {
sqlite(path = File(dataFolder, "stats.db").path)
}
statsStore = DataHandler.createStoreType(DataStoreType.SQL) {
it.id = "player_stats"
}
server.pluginManager.registerEvents(this, this)
}
override fun onDisable() {
DataHandler.closeAllConnections()
}
@EventHandler
fun onKill(event: PlayerDeathEvent) {
val killer = event.entity.killer ?: return
val stats = statsStore.retrieve(killer.uniqueId.toString())
?: PlayerStats(killer.uniqueId.toString(), killer.name)
stats.kills++
statsStore.store(stats.uuid, stats)
}
@EventHandler
fun onJoin(event: PlayerJoinEvent) {
val stats = statsStore.retrieve(event.player.uniqueId.toString())
?: PlayerStats(event.player.uniqueId.toString(), event.player.name)
event.player.sendMessage("§aYour K/D: §f${stats.kills}§7/§f${stats.deaths}")
}
}
data class PlayerStats(
val uuid: String,
var name: String,
var kills: Int = 0,
var deaths: Int = 0
)Database Schema
Honey creates a single honey_store table:
CREATE TABLE honey_store (
store_id VARCHAR(255) NOT NULL,
key VARCHAR(255) NOT NULL,
value TEXT NOT NULL,
PRIMARY KEY (store_id, key)
);| Column | Description |
|---|---|
store_id | Your store's it.id value |
key | The key you passed to store() |
value | Serialized JSON blob |
Connection Pool
Honey manages a connection pool automatically. Call closeAllConnections()
on shutdown to release resources.