1

为什么我不能在构造函数之外执行查询?我不能使用我在构造函数中声明的变量。为什么不?我是否必须将数据库连接放在带参数的方法中?

public class main extends javax.swing.JFrame
{
    DefaultListModel model = new DefaultListModel();

    public main()
    {
        initComponents();
        try
        {
            Connection con = DriverManager.getConnection("jdbc:mysql://localhost/project", "root", "password");
            Statement stat = con.createStatement();
            ResultSet resultaat = stat.executeQuery(query);

            while (resultaat.next())
            {
                model.addElement(resultaat.getString(2));
            }
        }
        catch (Exception ex)
        {
            System.out.println(ex);
        }
    }
}
4

4 回答 4

2

我不能使用我在构造函数中声明的变量。为什么不?

因为,当它们在构造函数中声明时,它们被限制在那个范围内。您无法在构造函数之外访问它们。如果您想在构造函数之外使用它们,请将它们作为您应该首先做的实例变量。

你的班级应该是这样的:

public class DBConnection {
  Connection con=null;
  public DBConnection() {
    initComponents();
    try {
      conn = DriverManager.getConnection("jdbc:mysql://localhost/project","root","password");
    }
    catch(SQLException ex) {
    }
  }

  public void doDBOps() {
    String yourQuey="whatever";
    PreparedStatement stmnt = this.conn.preparedStatement(yourQuery);
    ResultSet rs = stmnt.executeQuery();
    //rest of your code 
  }
}
于 2012-12-11T16:46:31.360 回答
2

con 在你的构造函数范围内。利用

Connection con;

作为类变量和构造函数

con = DriverManager.getConnection("jdbc:mysql://localhost/project","root","password");

只用这个。对所需变量执行相同操作。您需要在整个课程中使用它。

于 2012-12-11T16:47:36.017 回答
0

看来您总体上正在寻找的是数据库的单例类。您可以在其他类中使用该类来访问现有的连接,而不是DriverManager每次都使用工厂来获取新的连接对象。

下面的样本是无耻地从这里偷来的

public class DBConnectionSingleton
{
  private static DBConnectionSingleton instance = null;
  private static Connection conn;
  private DBConnectionSingleton()
  {
    String dbDriver = ..
    String url = ..
    String username= ..
    String password = ..
    try
    {
      Class.forName(dbDriver);
      conn = DriverManager.getConnection(url, username, password);
    }
    catch (ClassNotFoundException cnfErr)
    {
      cnfErr.printStackTrace();
    }
    catch (SQLException err)
    {
      err.printStackTrace();
    }
  }

  public static DBConnectionSingleton getInstance()
  {
    if (instance == null)
      return new DBConnectionSingleton();
    else
      return instance;
  }
  public static Connection getConnection()
  {
    return conn;
  }
}
于 2012-12-11T16:53:36.900 回答
0

在方法或构造函数中定义的变量仅限于该范围。如果你想初始化一个变量并在你的类中使用它,你必须将它变成一个类字段(因此,将其范围扩大到类本身),并且按照惯例,定义一个get和/或set方法。

于 2012-12-11T16:48:37.413 回答