[英]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.