0

我有一个类,其中包含连接到数据库、运行查询以及将数据库中的数据分配给变量的方法。

该 Java 程序的目的是扫描一个数据库,该数据库包含有关客户端服务器安全威胁的信息。当查询运行时,它应该在读取到攻击次数(target_stats.num_attacks)大于 0 时从 2 个表(target_stats 和 attack_stats)中返回选定的数据字段。

我可以成功地从目标表中检索数据,但我从攻击者表中获取空值,并且我知道该字段在数据库中不为空。

我的问题:任何人都可以在我的查询中检测到导致不利结果的错误,很可能是逻辑错误吗?我是一名初级程序员,对 SQL 相当陌生。

另外,我正在这个程序中学习setter和getter,所有检索到的数据都将用于另一个类,但我现在只使用目标字段进行测试和学习。也许这引起了问题?

更新我咆哮他在 MySQL 查询浏览器中查询并得到相同的不利结果,所以问题出在我的查询逻辑中。我已经对查询和连接进行了一些研究,但肯定仍然缺乏合适的知识。

我的代码(希望我以正确的格式发布):

public class Database {

String details = null;
int threat_level = 0;
ResultSet rslt = null;

private String target2;

Connection con;
public void createConnection() {

    //Establish a connection
    try {
        con = DriverManager.getConnection("sensitiveInformation");
    } catch (SQLException e) {

        e.printStackTrace();
    }
    System.out.println("Database connected");
}

public ResultSet getData() {

    String query =  "SELECT target_stats.server_id, target_stats.target, target_stats.threat_level, target_stats.client_id, attack_stats.attacker, attack_stats.num_this_attack " +
            "       FROM target_stats " +
            "       LEFT OUTER JOIN attack_stats " +
            "       ON target_stats.target = attack_stats.target " +
            "       WHERE target_stats.num_attacks > '0' " +
            "       AND target_stats.interval_id>'2'";
    Statement stmt = null;
    try {
        stmt = con.createStatement();
    } catch (SQLException e) {

        e.printStackTrace();
    }

    try {
        rslt = stmt.executeQuery(query);
    } catch (SQLException e) {

        e.printStackTrace();
    }

    return rslt;    

}

public void process() {

    try {


        String server_id = rslt.getString("server_id");
        target2 = rslt.getString("target");
        threat_level = rslt.getInt("threat_level");
        int client_id = rslt.getInt("client_id");
        String attacker = rslt.getString("attacker");
        String num_this_attack = rslt.getString("num_this_attack");
        details = "Target IP: " + target2 + " Server ID: " + server_id + " Client ID: " + client_id + " Threat Level: " + threat_level  + " Attacker IP: " + attacker + " Number of attacks: " + num_this_attack;


        System.out.println(details);


    } catch (SQLException e) {

        e.printStackTrace();
    }
}
public String getTraget2() {
    return target2;
}

}

更新:我应该提到我在另一个类中有一个while循环,可以正确读取每条记录。

更新 2:这是主类,我现在不关心 GUI 元素:

public class MainDisplay extends JFrame {

static Toolkit tk = Toolkit.getDefaultToolkit();
static int Width = (int)tk.getScreenSize().getWidth();
static int Height = (int)tk.getScreenSize().getHeight();

public static JFrame frame = new JFrame();
public static JLayeredPane lpane = new JLayeredPane();
public static String target;

public static void main (String[] args) { new MainDisplay();

}

公共主显示(){

frame.setPreferredSize(new Dimension(Width, Height));
frame.setLocation(0,0);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setUndecorated(true);

//NoRisk Run = new NoRisk();
//Run.NoThreat();


ThreatPanel Run = new ThreatPanel();
Database Data = new Database();

//Create Connection to Database and run query

Data.createConnection();
Data.getData();
    try {
        while(Data.rslt.next()){
            Data.process();
            Run.TargetServer = Data.getTraget2();
            System.out.print(Data.getTraget2()); //for testing purposes
            Run.ShowThreats();
            try {
                Thread.sleep(1000*10); // sleeps for ten seconds
            } catch (InterruptedException e) {

                e.printStackTrace();
            }

        }
    } catch (SQLException e) {

        e.printStackTrace();
    }

//Run.ShowThreats();

frame.setLayout(new BorderLayout());
frame.add(lpane, BorderLayout.CENTER);
lpane.setBounds(0,0, Width, Height);






frame.pack();
frame.setVisible(true);

} }

4

3 回答 3

1

攻击者表中的字段可能不为空,但是当您有 LEFT OUTER JOIN 时 - 当 attack_stats 表中没有相应数据时,您将在查询中具有空值 - 请检查。

查询看起来没问题 - 尝试使用LEFT INNER JOIN - 然后在attack_stats 表中没有相应数据的情况下,您将看不到任何行。

于 2013-06-28T06:45:46.603 回答
1

您是否尝试在数据库中执行相同的查询?您提到它应该返回一些结果,但是您在输入代码之前是否在数据库中尝试过?如果数据库没有返回理想的结果,我们将查看查询语句,例如,您可能不得不使用内连接来代替左外连接。

于 2013-06-28T06:18:36.513 回答
0

帕特,您能否发布您的主要方法,从您调用此代码的位置。此外,您应该遍历结果集以移动光标。

while(rslt.next())
{
 String server_id = rslt.getString("server_id");
        target2 = rslt.getString("target");
        threat_level = rslt.getInt("threat_level");
        int client_id = rslt.getInt("client_id");
        String attacker = rslt.getString("attacker");
        String num_this_attack = rslt.getString("num_this_attack");
        details = "Target IP: " + target2 + " Server ID: " + server_id + " Client ID: " + client_id + " Threat Level: " + threat_level  + " Attacker IP: " + attacker + " Number of attacks: " + num_this_attack;


        System.out.println(details);

}
于 2013-06-28T06:21:42.787 回答