私は宿題をやっていて、vote4cash 報酬システムの mysql を管理するvote4cash クラスを、MysqlManager という新しいクラスに書き直すことにしました。私が作成した MysqlManager クラスは、Commands クラスが mysql に接続できるようにする必要があります - 完了し、Commands クラスがクエリを実行できるようにする必要があります - この部分について助けが必要です。私が作成した新しいクラスでは、さらに多くの進歩がありましたが、コマンド クラスがクエリを実行できるようにする、クラスの最後の最も重要な部分の 1 つに行き詰まっています。
私のMysqlManagerクラスでは、MySqlに接続するためのコードを下に置きました
public synchronized static void createConnection() {
ここで、Commands クラスがクエリを実行できるようにするコードを、この下にも配置する必要があります。しばらくの間、これを調査して実行しようとしましたが、まったく運がありませんでした。
MysqlManager クラス全体:
package server.util;
/*
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
*/
import java.sql.*;
import java.net.*;
import server.model.players.Client;//Will be needed eventually so that I can reward players who have voted.
/**
* MySQL and Vote4Cash Manager
* @author Cloudnine
*
*/
public class MysqlManager {
/** MySQL Connection */
public static Connection conn = null;
public static Statement statement = null;
public static ResultSet results = null;
public static Statement stmt = null;
public static ResultSet auth = null;
public static ResultSet given = null;
/** MySQL Database Info */
public static String DB = "vote4gold";
public static String URL = "localhost";
public static String USER = "root";
public static String PASS = "";
public static String driver = "com.mysql.jdbc.Driver"; //Driver for JBDC(Java and MySQL connector)
/** Connects to MySQL Database*/
public synchronized static void createConnection() {
try {
Class.forName(driver);
conn = DriverManager.getConnection(URL + DB, USER, PASS);
conn.setAutoCommit(false);
stmt = conn.createStatement();
Misc.println("Connected to MySQL Database");
}
catch(Exception e) {
//e.printStackTrace();
}
}
public synchronized static void destroyConnection() {
try {
statement.close();
conn.close();
} catch (Exception e) {
//e.printStackTrace();
}
}
public synchronized static ResultSet query(String s) throws SQLException {
try {
if (s.toLowerCase().startsWith("select")) {
ResultSet rs = statement.executeQuery(s);
return rs;
} else {
statement.executeUpdate(s);
}
return null;
} catch (Exception e) {
destroyConnection();
createConnection();
//e.printStackTrace();
}
return null;
}
}
私のコマンドのスニペット:
if (playerCommand.equals("claimreward")) {
try {
PreparedStatement ps = DriverManager.getConnection().createStatement("SELECT * FROM votes WHERE ip = hello AND given = '1' LIMIT 1");
//ps.setString(1, c.playerName);
ResultSet results = ps.executeQuery();
if(results.next()) {
c.sendMessage("You have already been given your voting reward.");
} else {
ps.close();
ps = DriverManager.getConnection().createStatement("SELECT * FROM votes WHERE ip = hello AND given = '0' LIMIT 1");
//ps.setString(1, playerCommand.substring(5));
results = ps.executeQuery();
if(results.next()) {
ps.close();
ps = DriverManager.getConnection().createStatement("UPDATE votes SET given = '1' WHERE ip = hello");
//ps.setString(1, playerCommand.substring(5));
ps.executeUpdate();
c.getItems().addItem(995, 5000000);
c.sendMessage("Thank you for voting! You've recieved 5m gold!");
} else {
c.sendMessage("You haven't voted yet. Vote for 5m gold!");
}
}
ps.close();
} catch (Exception e) {
e.printStackTrace();
}
}
return;
コマンドの仕組み: プレイヤーが ::commandname (この場合は claimreward) と入力すると、コマンド関数が実行されます。これはコマンド クラス全体ではありません。有用な回答を得るために十分に詳細に質問するために投稿する必要があると思われる部分だけです。
注:すべての輸入品があります。
注: Mysql は正常に接続します。
注: 上記のコマンド コード スニペットで mysql クエリを実行できるようにする必要があります。
注: MysqlManager からではなく、コマンドから直接クエリを実行することを好みますが、この問題を解決するために必要なことは何でもします。
問題を詳細かつ適切に説明したと思いますが、追加の情報や理解が必要な場合はお知らせください。より具体的に説明します。
私の問題を調べるために時間を割いていただきありがとうございます。お手数ですが、よろしくお願いいたします。-アレックス