2012-07-25 57 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