[英]Executing JDBC MySQL query with this custom method
我一直在做作業,因此決定將我的鋼筆投票系統重寫為一個名為MysqlManager的新類,它管理我的鋼筆投票系統的mysql。 我創建的MysqlManager類需要允許Commands類連接到mysql-完成了,它需要允許Commands類執行查詢-我需要這部分的幫助。 我在制作新類方面取得了很多進步,但我仍然停留在該類的最后一個最重要的部分之一,再次允許命令類執行查詢。
在我的MysqlManager類中,我將代碼連接到
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)時,將執行command函數。 這不是整個命令類,只是我認為需要張貼的部分,以便我的問題足夠詳細以提供有用的答案。
注意:我有所有進口商品。
注意:Mysql成功連接。
注意:我需要使上面的命令代碼片段能夠執行mysql查詢。
注意:我更喜歡直接從命令而不是從MysqlManager執行查詢,但是我將盡我所能解決此問題。
我覺得我已經詳細,相關地描述了我的問題,但是如果您需要其他信息或對任何事情的理解,請告訴我,我會嘗試更加具體。
感謝您抽出寶貴的時間來檢查我的問題。 在此先感謝您能為您提供幫助。 -亞歷克斯
您的方法在許多不同層面上都被誤導了,我什至無法開始意識到應該怎么做。
1)永遠不要使用static
類變量,除非您知道在那里做什么(而且我敢肯定,您不會)
2)我認為有一個原因創建您自己的jdbc連接(例如,它是家庭作業的一部分),否則,您不應該這樣做。 我看到您在一部分中使用了DriverManager
和PreparedStatement
,您應該繼續使用它們。
3)您的方法似乎打算從一個相對好的代碼庫(您的command
部分)開始,然后轉到數據庫連接的一個非常低級的粗略方法(您的MysqlManager
),除非確實有必要並且您知道自己要做什么,否則應該保持相同的抽象水平,並針對適合您需求的最抽象。 (在這種情況下,寫MysqlManager
你寫的方式Command
)
4)在上一個問題(您只是假設這里的每個人都閱讀過,不是這樣)中,您得到了重新設計想法的建議,您應該這樣做。 確實,上一門編碼原理課來學習反模式,然后從頭開始。
因此,可以得出結論:至少再次編寫MysqlManager,其致命故障無法修復。 對不起。 如果您還有其他問題,請給我寫電子郵件,我會花時間查看如何為您提供幫助。 (an@steamnet.de)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.