1

「Minecraft」ゲームのサーバーである Bukkit プラグインをプログラミングしています。SQL の書き方がわかりません。構文だけです。

MySQL と SQLite にアクセスするための Java クラスを探しています。プラグインは、構成ファイル、MySQL または SQLite で設定された、一度に 1 つのデータベースのみを使用します。

私はこれを見つけました:

import java.io.*;
import java.sql.*;
import java.util.logging.*;
import org.bukkit.plugin.*;

public class Db {
    private final Plugin plugin;
    private final String url;
    private Logger log;
    Connection connection = null;  
    ResultSet resultSet = null;  
    Statement statement = null;  

    public Db(final Plugin plugin, final String host, final String database,
            final String user, final String password) {
        this.plugin = plugin;
        url = "jdbc:mysql://" + host + "/" + database + "?user=" + user
                + "&password=" + password;
        log = plugin.getServer().getLogger();
        initDriver("com.mysql.jdbc.Driver");
    }

    public Db(final Plugin plugin, final String filePath) {
        this.plugin = plugin;
        url = "jdbc:sqlite:" + new File(filePath).getAbsolutePath();
        log = plugin.getServer().getLogger();
        initDriver("org.sqlite.JDBC");
    }

    private void initDriver(final String driver) {
        try {
            Class.forName(driver);
        } catch (final Exception e) {
            log.severe("Database driver error:" + e.getMessage());
        }
    }

    public int resultInt(ResultSet result, int column) {
        if (result == null)
            return 0;
        try {
            result.next();
            int integer = result.getInt(column);
            result.close();

            return integer;
        } catch (SQLException e) {
            log.severe("Database result error: " + e.getMessage());
        }
        return 0;
    }

    public String resultString(ResultSet result, int column) {
        if (result == null)
            return null;
        try {
            result.next();
            String string = result.getString(column);
            result.close();
            return string;
        } catch (SQLException e) {
            log.severe("Database result error: " + e.getMessage());
        }
        return null;
    }

    public ResultSet query(final String query) {
        return query(query, false);
    }

    public ResultSet query(final String query, final boolean retry) {
        try {
            final Connection connection = DriverManager.getConnection(url);
            final PreparedStatement statement = connection
                    .prepareStatement(query);
            if (statement.execute())
                return statement.getResultSet();
        } catch (final SQLException e) {
            final String msg = e.getMessage();
            log.severe("Database query error: " + msg);
            if (retry && msg.contains("_BUSY")) {
                log.severe("Retrying query...");

                plugin.getServer().getScheduler()
                        .scheduleSyncDelayedTask(plugin, new Runnable() {
                            @Override
                            public void run() {

                                query(query);
                            }
                        }, 20);
            }
        }
        return null;
    }
}

しかし、接続とステートメントを閉じる方法がわかりません。このコードでは、使用する必要があります

base = new Db(this, getDataFolder() + File.separator + "SQLite.db");

しかし、そのコードを使用すると複数のスレッドが作成され、エラーが発生します。接続とステートメントを閉じることができるクラスを見つける必要があります。私は Java を数週間しか学んでおらず、よくわかりません。

4

2 に答える 2

2

Java Tutorials: JDBC Basicsを少しでも読むことをお勧めします。ほとんどすべてがそこで説明されています...

簡単に言えば、各オブジェクトの操作が終わったらResultSet.close()Statement.close(),を呼び出すだけです。 または、Spring 、MyBatis、またはHibernateを使用して、それぞれが前述のフレームワーク手法の上に抽象化 (および複雑さ) の別のレイヤーを追加します。Connection.close()
JdbcTemplate

于 2013-04-05T21:22:53.987 に答える
0

わかりました...新しい作業コードがあります。私は古いものを編集しました:)

import java.io.*;
import java.sql.*;

public class Db {
    private final String url;
    ResultSet resultSet = null;
    Statement statement = null;
    final String driver;
    String user = "";
    String database = "";
    String password = "";
    String port = "";
    String host = "";
    Connection c = null;

    public Db(String Host, String db, String username, String password) {
        this.host = Host;
        this.database = db;
        this.user = username;
        this.password = password;
        url = "jdbc:mysql://" + host + "/" + database + "?user=" + user
                + "&password=" + password;
        driver = ("com.mysql.jdbc.Driver");
    }

    public Db(String filePath) {
        url = "jdbc:sqlite:" + new File(filePath).getAbsolutePath();
        driver = ("org.sqlite.JDBC");
    }

    public Connection open() {
        try {
            Class.forName(driver);
            this.c = DriverManager.getConnection(url);
            return c;
        } catch (SQLException e) {
            System.out
                    .println("Could not connect to MySQL/SQLite server! because: "
                            + e.getMessage());
        } catch (ClassNotFoundException e) {
            System.out.println("JDBC Driver not found!");
        }
        return this.c;
    }

    public boolean checkConnection() {
        if (this.c != null) {
            return true;
        }
        return false;
    }

    public Connection getConn() {
        return this.c;
    }

    public void closeConnection(Connection c) {
        c = null;
    }
}
于 2013-04-06T12:37:06.733 に答える