【问题标题】:Passing SQL connections to objects将 SQL 连接传递给对象
【发布时间】:2013-07-29 11:57:46
【问题描述】:

注意:不是 java EE 问题

在 java 中,我需要将 SQL 连接从一个类传递到另一个类作为参数。 但似乎接收类获得了 Connection 对象,但它为 null 且未连接。

我读到 java EE 使用了一个池。但是我的项目很小,使用 JDBC 的驱动程序管理器进行 localhost 连接。 我也读过java不通过引用传递。

有什么方法可以将实时连接从一个班级传递到另一个班级?

编辑: 课堂连接

try
  {
      Class.forName("com.mysql.jdbc.Driver");
      connect = DriverManager.getConnection(
                "jdbc:mysql://localhost/MYDATABASE?user="+username+"&password="+password);
return connect;
  }catch(Exception e){
      return null;

在我的主班

connect c = new connect(user,pass);

【问题讨论】:

  • 向我们展示代码,以便我们更好地帮助您(此外,将连接传递给另一个对象是丑陋
  • 向我们展示一些代码,您在哪里以及如何通过。您可以有一个 ConnectionManager 类,其他类可以从该类请求 Connection 对象。
  • 如果接收类得到一个空值,那么你传递给它一个空值。参数本身不能神奇地变为 null。
  • @Kayaman 我不知道。这就是实际发生的事情。我尝试在我的第一堂课中执行查询并且它有效。在我的第二堂课中,相同的查询引发空指针异常!
  • @XperiazX catch(Exception e){ return null; } 是正在发生的事情。添加e.printStackTrace(); 并亲自查看。

标签: java sql jdbc parameters connection


【解决方案1】:
public class Connect
{
private static Connection sharedConnection;
public static Connection createOrAccessConnection(String user,String pass, boolean forceNew){ 
Connection connect = sharedConnection;
try
  {

      Class.forName("com.mysql.jdbc.Driver");
      if(forceNew || connect == null)
         { 
              connect = DriverManager.getConnection(
                "jdbc:mysql://localhost/MYDATABASE?user="+username+"&password="+password);
              if(sharedConnection == null ) 
                { 
                sharedConnection = connect; 
                }  
         }
return connect;
  }catch(Exception e){
      return null;
}
}



class Main
   {
   public void transactionMethod()
   {
       //Some code here.
       //This is what you need to add.
       Connection con = Connect.createConnection(user,pass,false);
       Sysout(con);
       AnotherClass ac = new AnotherClass();
       ac.operation1(con, false);
       ac.operation1(null,true);  
   }



class AnotherClass
       {
       public void operation1(Connection con, boolean createNew) 
            {
            if(createNew || con==null)
               {
               con = Connect.createConnection(user,pass,false);
               }
            //Some code here
            if(createNew)
               {
               //Close connection here. 
               }      
            }
       } 

       }

【讨论】:

  • 以上代码应该可以解决您的问题。另外,请注意,它有助于在静态加载时和动态地创建连接。
【解决方案2】:

我猜你已经做对了,但这只是使用方法的一个例子,没有trick

class A
{
    Connection connection;

    public void setConnection( Connection connection )
    {
        if ( connection == null ) System.out.println("null passed!");
        this.connection = connection;
    }
}

现在你只需调用方法,就是这样:

Connection c = null;
// TODO: added code here to establish the connection.
A a = new A();
if ( c == null ) System.out.println("c is null before passing it on!");
a.setConnection(c);

如果传递的值是null(未连接),那么您需要查看创建连接的代码,以确保您传递的是有效(已连接)对象。

编辑
我刚刚看到您添加的代码 sn-p。如果 try {...} catch 在您的构造函数中,那么它将不起作用......甚至不应该编译!构造函数不能用于返回值,只有方法可以。

【讨论】:

  • 这确实帮助了我。我的问题是连接,作为我的主类(公共或私有)中的成员,永远不能传递给其他对象。 (也许是因为它是静态的,但仍然不知道为什么)但是本地创建的非静态连接可以很容易地传递和接收。
【解决方案3】:
  • 我可以看出,由于 return 语句,您没有在构造函数中创建连接。

请看下面:

class Connect
{
public Connection createConnection(){ 
try
  {
      Class.forName("com.mysql.jdbc.Driver");
      connect = DriverManager.getConnection(
                "jdbc:mysql://localhost/MYDATABASE?user="+username+"&password="+password);
return connect;
  }catch(Exception e){
      return null;
}
}



class Main
   {
   public void connectionNeededHere()
   {
       //Some code here.
       ...
       //This is what your are calling. 
       Connect c = new connect(user,pass);
       //This is what you need to add.
       Connection con = c.createConnection();
       Sysout(con);
   }

   }

【讨论】:

  • class,不是 Connect 和 Main 的 Class ;)
  • 非常感谢您的回答。但我的问题是将主类的数据成员传递给另一个类。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-08-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-12-02
  • 1970-01-01
相关资源
最近更新 更多