0

私は宿題をやっていて、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 からではなく、コマンドから直接クエリを実行することを好みますが、この問題を解決するために必要なことは何でもします。

問題を詳細かつ適切に説明したと思いますが、追加の情報や理解が必要な場合はお知らせください。より具体的に説明します。


私の問題を調べるために時間を割いていただきありがとうございます。お手数ですが、よろしくお願いいたします。-アレックス

4

1 に答える 1

1

あなたのアプローチは多くの異なるレベルで見当違いです。ここで何をどのように行うべきかを理解することさえできません。

1)staticクラス変数は、そこで何をするかを理解していない限り、決して使用しないでください (そして、私は確信していますが、あなたはそうではありません)。

2)独自のjdbc接続を作成する理由があると思います(たとえば、宿題の一部です)そうでない場合は、それを行うべきではありません。私はあなたがそれらを使用しているのを見てDriverManagerPreparedStatement一部ではそれらを使用し続ける必要があります.

3)あなたのアプローチは、比較的優れたコードベース(あなたの部分)から始めて、データベース接続(あなたの)commandで非常に低レベルの粗雑なアプローチに進むことを意図しているようです。MysqlManager同じレベルの抽象化を行い、ニーズに合った最も抽象的なものを目指します。(この場合、書いMysqlManagerた通りに書いてくださいCommand

4) あなたの前の質問 (ここにいる全員が読んだと仮定しただけですが、そうではありません) で、アイデアを再設計するよう提案されました。それを行うべきです。本当に、コーディングの原則のクラスを受講して、アンチパターンについて学び、ゼロから始めてください。

結論として、少なくとも MysqlManager を書き直してください。修復できないほど致命的に壊れています。ごめんなさい。さらに質問がある場合は、私に電子メールを書いてください。どのようにお手伝いできるか、時間をかけて確認します. (an@steamnet.de)

于 2012-07-25T21:11:28.450 に答える