2012-07-25 50 views
0

我一直在做我的功課,我決定將我的vote4cash類管理mysql的vote4cash獎勵系統重新寫入一個名爲MysqlManager的新類。我所做的MysqlManager類需要允許Commands類連接到mysql - 完成,它需要允許Commands類執行查詢 - 我需要幫助這個部分。我已經取得了更多的進展,但是我仍然停留在類的最後一個最重要的部分之一上,允許命令類執行查詢。使用此自定義方法執行JDBC MySQL查詢

在我MysqlManager類我已經把代碼連接到MySql下

public synchronized static void createConnection() {

現在我只需要把它允許類的命令下,這個執行查詢以及代碼。我已經研究並嘗試過一段時間了,但我絕對沒有運氣。

整個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; 

了命令的工作: 當玩家類型::命令名(在這種情況下,claimreward)命令功能將被執行。這不是整個命令類,只是我認爲需要發佈的部分才能爲我的問題提供足夠詳細的答案。

注:我有我所有的進口。

注意:Mysql連接成功。

注:我需要使上述命令代碼片段能夠執行mysql查詢。

注意:我更喜歡直接從命令執行查詢,而不是從MysqlManager執行,但我會盡我所能解決此問題。

我覺得我已經詳細而且相關地描述了我的問題,但如果您需要更多的信息或理解任何事情,請告訴我,我會盡量做得更具體。


謝謝您花時間檢查我的問題。如果您能夠提供幫助,請提前致謝。 -Alex

+0

你不應該使用root作爲mysql用戶(只是順便說一句,並且與你的問題無關) – 2012-07-25 20:39:50

+0

@AngeloNeuschitzer它是localhost,沒關係。這不是我將來要使用的。 – 2012-07-25 20:54:18

+0

你說這是作業,請刪除其中一個標籤(例如查詢)並將作業標籤添加到它。 – 2012-07-25 20:56:28

回答

1

你的方法在許多不同的層面上被誤導了,我甚至無法開始意識到應該怎麼做到這裏。

1)千萬不要使用static類變量,除非你知道你在那裏做什麼(我敢肯定,你不這樣做)

2)我假設有你創建你自己的JDBC的理由連接(例如作業的一部分),如果沒有,你不應該那樣做。我看到你在一個部分使用DriverManagerPreparedStatement,你應該繼續使用它們。3)你的方法似乎打算從一個相對較好的代碼庫(你的command部分)開始,然後在數據庫連接(你的MysqlManager)上進行一個非常低級的粗糙的方法,除非真的有必要,你知道你那麼,你應該保持在同一個抽象層次上,並且瞄準最符合你需求的抽象。 (在這種情況下,你寫的方式寫MysqlManager

4)在你之前的問題中去做。真的,在編碼原理課上學習反模式,然後從頭開始。

所以總結一下:至少再寫一遍MysqlManager,其致命的破壞無法修復。對不起。如果您還有其他問題,請給我發電子郵件,我會抽出時間看看我可以如何幫助您。 ([email protected]

+0

好的,通過作業我正在講研究。感謝您的建議。 – 2012-07-25 22:20:04