【问题标题】:Netbeans MySQL Connection - not to do with jbdcNetbeans MySQL 连接 - 与 jbdc 无关
【发布时间】:2017-08-28 10:11:51
【问题描述】:

我有一个登录应用程序,它需要连接到服务器以检查用户名和密码。我正在使用 netbeans 并且 jbdc 已安装并在服务选项卡中工作(感谢堆栈溢出!)。 jbdc 是工作,我的意思是我可以通过它执行 SQL 脚本。

我已经使用 MS Server 16 和 MySQL 进行了设置,所以我确信它是代码:

连接方式:

package dbUtil;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;

public class dbConnection {
    private static final String USERNAME = "root";
    private static final String PASSWORD = "mess";
    private static final String SQCONN = "jdbc:mysql://localhost:1434/MessyLogin?zeroDateTimeBehavior=convertToNull";


    public static Connection getConnection()throws SQLException{

        try {
            Class.forName("com.mysql.jdbc.Driver");
            return DriverManager.getConnection(SQCONN, USERNAME, PASSWORD);
        }catch (ClassNotFoundException e) {
        }
        return null;
    }
}

登录模型:

package LogIn;


import dbUtil.dbConnection;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.logging.Level;
import java.util.logging.Logger;



public class LogInModel {
    Connection connection;

    public LogInModel() {
        try{

            this.connection = dbConnection.getConnection();

        }catch(SQLException e){

        }

        if(this.connection == null){
            System.out.println("here");
            // System.exit(1);
        }
    }
    public boolean isDatabaseConnected(){
        return this.connection != null;
    }

    public boolean isLogin(String username, String password) throws Exception{
        PreparedStatement pr = null;
        ResultSet rs = null;

        String sql = "SELECT * FROM MessyLogin where username = ? and Password = ?";

        try{
            pr = this.connection.prepareStatement(sql);
            pr.setString(1, username);
            pr.setString(2, password);

            rs = pr.executeQuery();

            boolean bool1;

            if(rs.next()){
                return true;
            }
            return false;
        }
        catch(SQLException ex){        
            return false;
        }

        finally {
            {
                pr.close();
                rs.close();
            }
        }
    }  

}

我认为问题在于 dbConnection 文件中的 return null;if(this.connection==Null) 返回 true,系统正在退出。

提前谢谢你。

【问题讨论】:

  • 你不知道写空 catch 块时会发生什么。打印堆栈跟踪。
  • 也许你应该在使用方法“getConnection()”之前在“LogInModel”中实例化(使用新的)类“dbConnection”。
  • 你可以用调试器检查一下“dbConnection”是否真的与null不同,所以你可以调用它的方法。
  • @duffymo netbeans 告诉我删除堆栈跟踪。会把它放回去。
  • 这就是您不应该使用 NetBeans 的原因。多么垃圾的建议。

标签: java mysql javafx netbeans


【解决方案1】:

您的 dbConnection 类是个坏主意。既然可以传入这些值,为什么还要硬连接它们?

如果您以这种方式编码,您的应用程序将只有一个连接。更实用的解决方案将使用连接池。

了解Java coding standards。您的代码不遵循它们;它使阅读和理解变得更加困难。

这里有几个建议:

package dbUtil;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;

public class dbConnection {

    public static final String DRIVER = "com.mysql.jdbc.Driver";
    public static final String USERNAME = "root";
    public static final String PASSWORD = "mess";
    public static final String URL = "jdbc:mysql://localhost:1434/MessyLogin?zeroDateTimeBehavior=convertToNull";


    public static Connection getConnection(String driver, String url, String username, String password) throws ClassNotFoundException, SQLException {
        Class.forName(driver);
        return DriverManager.getConnection(url, username, password);
    }
}

我可能会这样写 LogInModel:

package LogIn;


import dbUtil.dbConnection;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.logging.Level;
import java.util.logging.Logger;

public class LogInModel {

    private static final String sql = "SELECT * FROM MessyLogin where username = ? and Password = ?";

    private Connection connection;

    public LogInModel(Connection connection) {
        this.connection = connection;
    }

    public boolean isLogin(String username, String password) {
        boolean isValidUser = false;
        PreparedStatement pr = null;
        ResultSet rs = null;
        try {
            pr = this.connection.prepareStatement(sql);
            pr.setString(1, username);
            pr.setString(2, password);    
            rs = pr.executeQuery();
            while (rs.hasNext()) {
                isValidUser = true; 
            }
        } catch (SQLException ex) {  
            e.printStackTrace();      
            isValidUser = false;
        } finally {
              dbUtils.close(rs);
              dbUtils.close(pr);
        }
        return isValidUser;
    }      
}

以下是我对您的代码失败原因的猜测:您的运行时 CLASSPATH 中没有 MySQL JDBC 驱动程序 JAR。找不到驱动类的时候会抛出异常,但是你不知道是因为你吞了这个异常。

【讨论】:

  • 目前,我不关心这个应用程序的连接。我需要学习和使用连接池(你毫无疑问是正确的)。看到这只是我将永远使用学习连接池的东西,此时似乎没有必要。鉴于这些信息,你认为我应该放弃这个并尝试另一种获取连接的方式吗?
  • 你应该弄清楚这段代码有什么问题,但最终你应该使用一个池。我不知道你的要求。担心先看懂这段代码。
  • 非常感谢您的意见,尤其是编码标准。这将是一个宝贵的资源。
猜你喜欢
  • 2012-07-15
  • 1970-01-01
  • 2012-03-24
  • 2023-03-18
  • 2013-07-29
  • 2017-08-27
  • 2013-10-06
  • 2022-09-24
  • 1970-01-01
相关资源
最近更新 更多