{"id":17629602,"url":"https://github.com/skynest-studios/skydatabase","last_synced_at":"2025-04-14T03:34:01.786Z","repository":{"id":259051462,"uuid":"860813006","full_name":"SkyNest-Studios/SkyDatabase","owner":"SkyNest-Studios","description":"An high performance API for managing databases using MySQL","archived":false,"fork":false,"pushed_at":"2024-11-04T19:07:29.000Z","size":69,"stargazers_count":0,"open_issues_count":0,"forks_count":2,"subscribers_count":0,"default_branch":"main","last_synced_at":"2025-03-27T17:35:53.045Z","etag":null,"topics":["async","cache","cache-storage","crud","crud-api","database","database-management","fast","fast-api","gradle","groovy","high-performance","java","maven","mysql","mysql-database","spigot","sync"],"latest_commit_sha":null,"homepage":"https://skynest.xyz","language":"Java","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"gpl-3.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/SkyNest-Studios.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null}},"created_at":"2024-09-21T08:30:38.000Z","updated_at":"2024-11-04T19:07:33.000Z","dependencies_parsed_at":"2025-04-14T03:33:13.225Z","dependency_job_id":null,"html_url":"https://github.com/SkyNest-Studios/SkyDatabase","commit_stats":null,"previous_names":["skynest-studios/skydatabase"],"tags_count":4,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/SkyNest-Studios%2FSkyDatabase","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/SkyNest-Studios%2FSkyDatabase/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/SkyNest-Studios%2FSkyDatabase/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/SkyNest-Studios%2FSkyDatabase/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/SkyNest-Studios","download_url":"https://codeload.github.com/SkyNest-Studios/SkyDatabase/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":248816295,"owners_count":21166055,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["async","cache","cache-storage","crud","crud-api","database","database-management","fast","fast-api","gradle","groovy","high-performance","java","maven","mysql","mysql-database","spigot","sync"],"created_at":"2024-10-23T00:05:16.784Z","updated_at":"2025-04-14T03:34:01.764Z","avatar_url":"https://github.com/SkyNest-Studios.png","language":"Java","funding_links":[],"categories":[],"sub_categories":[],"readme":"# SkyDatabase\n\nSkyDatabase is an API for managing databases using MySQL, featuring automatic caching and temporary storage in case of crashes. It is developed by **SkyNest Studios**.\n\n### Features:\n- Automatic caching\n- Temporary storage in case of crashes\n- Automatic CRUD (Create, Read, Update, Delete) operations on MySQL databases\n- Special constructor function for bukkit plugin developers\n\n### Compatibility\nThis project is created in Java 8 (1.8) for compatibility with all versions of Java up to 8.\n\n### Why You Should Use SkyDatabase\n\nSkyDatabase's automatic caching system stores data locally, eliminating the need for constant database queries. Instead, it makes one query at the start to load data and another at the end to update it. This ensures that, even when a client is connected to the server, the client's ping or latency will not increase, as there are no continuous queries running throughout the operation.\n\nSkyDatabase is also perfect for developers looking to implement systems such as team management, player statistics tracking, and other related features in their applications.\n\nMoreover, **bukkit plugin developers** benefit from a dedicated function within the constructor, available at the bottom of the file, which allows easy integration and customization specific to their plugins. This makes the API highly adaptable and developer-friendly, providing additional control and flexibility for custom plugin development.\n\n---\n\n## Setup\n\n### 1. Adding SkyDatabase to your project\n\n#### Maven\n\nAdd the following repository and dependency to your `pom.xml` file:\n\n```xml\n\u003crepository\u003e\n    \u003cid\u003eskynest-repo\u003c/id\u003e\n    \u003curl\u003ehttps://repo.skynest.xyz/releases\u003c/url\u003e\n\u003c/repository\u003e\n\n\u003cdependency\u003e\n    \u003cgroupId\u003edev.skynest.xyz\u003c/groupId\u003e\n    \u003cartifactId\u003eSkyDatabase\u003c/artifactId\u003e\n    \u003cversion\u003e1.3-BETA\u003c/version\u003e\n\u003c/dependency\u003e\n```\n\n#### Gradle\n\nFor Gradle, add the following lines to your `build.gradle` file:\n\n```groovy\nrepositories {\n    maven {\n        url 'https://repo.skynest.xyz/releases'\n    }\n}\n\ndependencies {\n    implementation 'dev.skynest.xyz:SkyDatabase:1.3-BETA'\n}\n```\n\n#### Groovy (for Gradle Groovy DSL)\n\n```groovy\nrepositories {\n    maven {\n        url 'https://repo.skynest.xyz/releases'\n    }\n}\n\ndependencies {\n    compile group: 'dev.skynest.xyz', name: 'SkyDatabase', version: '1.3-BETA'\n}\n```\n\n---\n\n## Usage\n\n### 1. Creating a Data Handler for User Data\n\nTo use SkyDatabase, you need to define a data handler that implements the `IDataManipulator\u003cT\u003e` interface.\n\n```java\npackage dev.skynest.xyz.user.manipulator;\n\nimport dev.skynest.xyz.interfaces.IDataManipulator;\nimport dev.skynest.xyz.user.UserData;\n\npublic class UserManipulator implements IDataManipulator\u003cUserData\u003e {\n    @Override\n    public String inString(UserData user) {\n        return user.getName() + \";\" + user.getMoney();\n    }\n\n    @Override\n    public UserData fromString(String data) {\n        String[] format = data.split(\";\");\n        return new UserData(format[0], Integer.parseInt(format[1]));\n    }\n\n    @Override\n    public UserData create(String name) {\n        return new UserData(name, 1);\n    }\n}\n```\n\n### 2. Creating a Class for SQL Queries\n\nYou need to implement the `IQuery\u003cT\u003e` interface to perform database operations.\n\n```java\npackage dev.skynest.xyz.user.query;\n\nimport dev.skynest.xyz.interfaces.IQuery;\nimport dev.skynest.xyz.user.UserData;\n\nimport java.sql.Connection;\nimport java.sql.PreparedStatement;\nimport java.sql.ResultSet;\nimport java.sql.SQLException;\nimport java.util.ArrayList;\nimport java.util.List;\n\npublic class DatabaseQuery implements IQuery\u003cUserData\u003e {\n\n    @Override\n    public List\u003cUserData\u003e getDatas(Connection connection) {\n        List\u003cUserData\u003e players = new ArrayList\u003c\u003e();\n        String query = \"SELECT * FROM users\";\n\n        try (PreparedStatement stmt = connection.prepareStatement(query);\n             ResultSet rs = stmt.executeQuery()) {\n\n            while (rs.next()) {\n                String name = rs.getString(\"name\");\n                int money = rs.getInt(\"money\");\n                players.add(new UserData(name, money));\n            }\n        } catch (SQLException e) {\n            e.printStackTrace();\n        }\n        return players;\n    }\n\n    @Override\n    public void setDatas(List\u003cUserData\u003e list, Connection connection) {\n        String query = \"INSERT INTO users (name, money) VALUES (?, ?) ON DUPLICATE KEY UPDATE money = ?\";\n        try (PreparedStatement stmt = connection.prepareStatement(query)) {\n            for (UserData user : list) {\n                stmt.setString(1, user.getName());\n                stmt.setInt(2, user.getMoney());\n                stmt.setInt(3, user.getMoney());\n                stmt.executeUpdate();\n            }\n        } catch (SQLException e) {\n            e.printStackTrace();\n        }\n    }\n\n    @Override\n    public void remove(String name, Connection connection) {\n        String query = \"DELETE FROM users WHERE name = ?\";\n\n        try (PreparedStatement stmt = connection.prepareStatement(query)) {\n            stmt.setString(1, name);\n            stmt.executeUpdate();\n        } catch (SQLException e) {\n            e.printStackTrace();\n        }\n    }\n\n    @Override\n    public void clear(Connection connection) {\n        String query = \"DELETE FROM users\";\n\n        try (PreparedStatement stmt = connection.prepareStatement(query)) {\n            stmt.executeUpdate();\n        } catch (SQLException e) {\n            e.printStackTrace();\n        }\n    }\n\n    @Override\n    public void set(String name, UserData data, Connection connection) {\n        String query = \"UPDATE users SET money = ? WHERE name = ?\";\n\n        try (PreparedStatement stmt = connection.prepareStatement(query)) {\n            stmt.setInt(1, data.getMoney());\n            stmt.setString(2, name);\n            stmt.executeUpdate();\n        } catch (SQLException e) {\n            e.printStackTrace();\n        }\n    }\n\n    @Override\n    public void createTable(Connection connection) {\n        String query = \"CREATE TABLE IF NOT EXISTS users (name VARCHAR(255) PRIMARY KEY, money INT)\";\n\n        try (PreparedStatement stmt = connection.prepareStatement(query)) {\n            stmt.executeUpdate();\n        } catch (SQLException e) {\n            e.printStackTrace();\n        }\n    }\n}\n```\n\n### 3. Defining the `UserData` Class\n\n```java\npackage dev.skynest.xyz.user;\n\nimport dev.skynest.xyz.interfaces.IData;\nimport lombok.Getter;\nimport lombok.Setter;\n\n@Setter\n@Getter\npublic class UserData extends IData {\n\n    private int money;\n\n    public UserData(String name, int money) {\n        super(name);\n        this.money = money;\n    }\n\n    @Override\n    protected void save() {\n        // create the instance and save this\n        // like Main.getInstance().getSkyDatabase().save(this);\n    }\n}\n```\n\n### 4. Initializing the Database\n\n### Constructor\n\nTo initialize the `SkyDatabase`, you need to provide the following parameters:\n- **Plugin instance** (optional for bukkit plugin developer)\n- **Database Authentication Information**\n- **Query Implementation**\n- **User Manipulator**\n- **Async Mode** (optional, default is `false`)\n- **Debug Mode** (optional, default is `false`)\n- **Temporary Storage Directory** (optional, default is `./tmp`)\n\nHere’s an example of how to initialize `SkyDatabase`:\n\n```java\nSkyDatabase skyDatabase = SkyDatabase.builder()\n    .auth(new Auth(\"sd\", \"localhost\", 3306, \"root\", \"\"))    // DB connection\n    .query(new DatabaseQuery())                             // Query implementation\n    .manipulator(new UserManipulator())                     // Data manipulator\n    .async(false)                                           // Enable async (Recommended false)\n    .debug(false)                                           // Enable Debug\n    .path(\"./tmp\")                                          // Temporary storage directory (optional)\n);\n\n// Perform operations with SkyDatabase...\n\n// On program exit\nskyDatabase.exit();\n```\n\nThis is the constructor plugin developer (Recommended Constructor)\n```java\nSkyDatabase skyDatabase = SkyDatabase.builder()\n        .plugin(plugin)                                       // Put here the instance of the plugin\n        .auth(new Auth(\"sd\", \"localhost\", 3306, \"root\", \"\"))  // DB connection\n        .query(new DatabaseQuery()),                          // Query implementation\n        .manipulator(new UserManipulator())                   // Data manipulator\n);\n\n```\n\nSure! Here's a revised version of your README section that improves clarity and readability for users on GitHub:\n\n---\n\n### 5. Using the Database\n\nYou can interact with the database using the following methods:\n\n#### Retrieve or Create User Data\nTo retrieve user data by ID (e.g., \"test\"), and create it if it does not exist, use:\n```java\nUserData userData = skyDatabase.getOrCreate(\"test\");\n```\n\n#### Save User Data\nTo save user data to the database, you can use:\n```java\nskyDatabase.save(userData);\n```\nIf you have an abstract save method implemented, you can call:\n```java\ndefaultUser.save();\n```\n\n#### Remove User Data\nTo remove user data by username, use:\n```java\nskyDatabase.remove(userName);\n```\n\n#### Retrieve All User Data\nTo get a list of all user data, use:\n```java\nList\u003cT\u003e allUsers = skyDatabase.get();\n```\n\n#### Retrieve a Single User Data\nTo retrieve a specific user by ID, use:\n```java\nT user = skyDatabase.get(\"id\");\n```\n\n### Error Handling\nIf you attempt to create or save data when the database is not fully loaded, an error will occur:\n```\nDatabaseNotArealLoaded\n```\n\nTo avoid this error, check if the database is loaded using:\n```java\nboolean isLoaded = skyDatabase.isLoaded();\n```\n\n---\n\n## License\n\nProject developed by **SkyNest Studios**.\n\nDiscord: discord.skynest.xyz\n\n---\n\n\n\n\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fskynest-studios%2Fskydatabase","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fskynest-studios%2Fskydatabase","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fskynest-studios%2Fskydatabase/lists"}