「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 を数週間しか学んでおらず、よくわかりません。