Documentation is a work in progress — some pages may be incomplete.
Unify

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)
);
ColumnDescription
store_idYour store's it.id value
keyThe key you passed to store()
valueSerialized JSON blob

Connection Pool

Honey manages a connection pool automatically. Call closeAllConnections() on shutdown to release resources.

On this page