Java 选择显示错误结果的查询

Java 选择显示错误结果的查询,java,mysql,Java,Mysql,我试图检查数据库表中是否有可用的数据。如果没有,它将插入数据。但在第一个按钮点击它的作品完美。当我尝试用相同的值再次单击按钮时,它被插入到表中。请帮助某人 private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) { // TODO add your handling code here: try {

我试图检查数据库表中是否有可用的数据。如果没有,它将插入数据。但在第一个按钮点击它的作品完美。当我尝试用相同的值再次单击按钮时,它被插入到表中。请帮助某人

private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {                                         
    // TODO add your handling code here:

    try {
        // TODO add your handling code here:
        DefaultTableModel model = (DefaultTableModel) jTable1.getModel();
        ArrayList<String> list = new ArrayList<>();
        Object obj[] = null;
        Class.forName("com.mysql.jdbc.Driver");
        java.sql.Connection con = DriverManager.getConnection("jdbc:mysql://localhost:3306/cem?useSSL=false", "root", "123");
        //here stu is database name, root is username and password
        Statement stmt = con.createStatement();

        String pn = "select gname from games where gname='" + jTextField1.getText() + "'";
        ResultSet rsPn = stmt.executeQuery(pn);
        System.out.println(rsPn.next());
        if (rsPn.next() == false) {

            String q = ("insert into games(gid,gname) values(NULL,'" + jTextField1.getText() + "')");
            int i = 0;
            i = stmt.executeUpdate(q);
            if (i > 0) {
                System.out.println("success");
                list.add(jTextField1.getText());
                obj = list.toArray();
                model.addRow(obj);

            } else {
                System.out.println("stuck somewhere");

            }

            StudentDetails.details();
            jTextField1.setForeground(Color.BLACK);
            stmt.close();
            con.close();
        } else {
            jTextField1.setForeground(Color.red);
            System.out.println("Name Already exist");
        }

    } catch (SQLException ex) {
        Logger.getLogger(InsertPanel.class.getName()).log(Level.SEVERE, null, ex);
    } catch (ClassNotFoundException ex) {
        Logger.getLogger(InsertPanel.class.getName()).log(Level.SEVERE, null, ex);
    }
}                
private void jButton1ActionPerformed(java.awt.event.ActionEvent evt){
//TODO在此处添加您的处理代码:
试一试{
//TODO在此处添加您的处理代码:
DefaultTableModel=(DefaultTableModel)jTable1.getModel();
ArrayList=新建ArrayList();
对象obj[]=null;
Class.forName(“com.mysql.jdbc.Driver”);
java.sql.Connection con=DriverManager.getConnection(“jdbc:mysql://localhost:3306/cem?useSSL=false“,”根“,”123”);
//这里stu是数据库名,root是用户名和密码
语句stmt=con.createStatement();
String pn=“从游戏中选择gname,其中gname=”+jTextField1.getText()+”;
结果集rsPn=stmt.executeQuery(pn);
System.out.println(rsPn.next());
if(rsPn.next()==false){
字符串q=(“插入到游戏(gid,gname)值中(NULL,“+jTextField1.getText()+”);
int i=0;
i=标准执行更新(q);
如果(i>0){
System.out.println(“成功”);
add(jTextField1.getText());
obj=list.toArray();
模型addRow(obj);
}否则{
System.out.println(“卡在某处”);
}
StudentDetails.details();
jTextField1.设置前景(颜色:黑色);
stmt.close();
con.close();
}否则{
jTextField1.设置前景(颜色:红色);
System.out.println(“名称已存在”);
}
}catch(SQLException-ex){
Logger.getLogger(InsertPanel.class.getName()).log(Level.SEVERE,null,ex);
}捕获(ClassNotFoundException ex){
Logger.getLogger(InsertPanel.class.getName()).log(Level.SEVERE,null,ex);
}
}                
您正在调用
next()
两次:

System.out.println(rsPn.next());
if (rsPn.next() == false) {
即使已经有一行,第二个调用也将返回
false
(不过如果有两行或更多行,它应该可以工作)。改用变量:

boolean hasNext = rdPn.next();
System.out.println(hasNext);
if (!hasNext) {

你为什么不在gname上设置一个唯一的键呢?这个代码不是个好主意。您不应该以这种方式将UI和数据库代码混合在一起。这是一个不稳定的混乱局面。最好编写一个可以测试并搁置的存储库类,提供对控制器类的引用。repository类应将结果集加载到集合中,并将其返回给调用方法。你的方式显然是错误的。