Java的。在类之间共享MySQL连接

时间:2014-04-25 10:06:25

标签: java

我是Java的新手。

我想创建一个小应用程序,它连接到MySQL并执行一些查询。

我真正的问题 - 连接到mysql,并为其他类保留此连接,而无需一次又一次地打开连接。

我阅读了有关MVC和OOP的文档。但我仍然无法理解如何解决这个问题。

正如我想象的那样,我应该继承模型中的数据库类,例如来自user的{​​{1}}和messages。但我不会想象它应该是什么样子。

我已经尝试在google中搜索一些示例,但我发现只有一个主类和数据库类的简单示例。

所以,我需要一个能为我解释的人

我将不胜感激任何帮助

用户类

mypackage

消息类

package mypackage;
class user {
    public String getName() {
        // return value from mysql
    }
}

数据库类

package mypackage;
class messages {
    public String getMessage() {
        // return value from mysql
    }
}

主要课程

package database;
class db {
        private String dbUri = "jdbc:mysql://";
    private String dbDriver = "com.mysql.jdbc.Driver";
    private Connection connection;

    public boolean connect(String host, String base, String user, String pass)
    {
        try {
            Class.forName(dbDriver);
            String uri = dbUri + host + '/' + base;
            connection = DriverManager.getConnection(uri, user, pass);
            return true;
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
            return false;
            // Could not find the database driver
        } catch (SQLException e) {
            e.printStackTrace();
            return false;
            // Could not connect to the database
        }
    }
}

3 个答案:

答案 0 :(得分:4)

您的db类已存储连接,因此只需创建检索它的方法:

package database;
class Database {
    private String dbUri = "jdbc:mysql://";
    private String dbDriver = "com.mysql.jdbc.Driver";
    private Connection connection;

    public boolean connect(String host, String base, String user, String pass)  {
       try {
            Class.forName(dbDriver);
            String uri = dbUri + host + '/' + base;
            connection = DriverManager.getConnection(uri, user, pass);
            return true;
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
            return false;
            // Could not find the database driver
        } catch (SQLException e) {
            e.printStackTrace();
            return false;
            // Could not connect to the database
        }
    }

    public Connection getConnection() {
        return connection;
    }
}

在你的主要:

class Main
{
    public static void main(String[] args)
    {
        Database db = new Database();
        if (db.connect(/* parameters for database connection here */)) {
            final Connection conn = db.getConnection();
            // you can use conn for your queries. If they are in other classes, pass connection as parameter.
        }
    }
}

我试图让它变得简单,但实际上你应该使用工厂和单例模式来创建和存储连接,一旦创建,然后在应用程序中静态检索它。一旦您对这个概念感到满意,您还应该将connection pooling视为  在评论中建议,例如使用BoneCP

答案 1 :(得分:1)

注意:这不是问题的答案,这是关于Singleton模式的正确示例的后续问题的答案。我知道这在技术上不是SO如何运作。但无论如何,这个问题并非如此。

好的,所以有一些不同的策略来创建一个Singleton,我选择展示的是经典的Singleton模式,它适用于任何事情,无论你使用什么框架。当然,如果你正在使用依赖注入/反转控制容器,比如Guice或Spring(bean),你应该遵循这些指导而不是这些。

首先是代码:

public final class ClassicSingleton {

    private static ClassicSingleton instance; 
    private final String exampleImmutable = "My state cannot be changed.";
    private String exampleMutable = "My state can be changed.";

    private ClassicSingleton() {
    }

    public static ClassicSingleton getInstance() {
        if (instance == null)
            instance = new ClassicSingleton();
        return instance;
    }

    public String getExampleImmutable() {
        return exampleImmutable;
    }

    public String getExampleMutable() {
        return exampleMutable;
    }

    public void setExampleMutable(String exampleMutable) {
        this.exampleMutable = exampleMutable;
    }
}

现在,首先要注意的是它有一个私有的构造函数,这是为了防止Java使用默认的构造函数。它还确保只有ClassicSingleton类可以创建ClassicSingleton对象。由于这只在一个地方完成,并且因为一个地方只被调用一次,所以我们通过代码强制执行,在任何给定时间只能有一个该对象的实例。此外,这个特定的实现是懒惰的实例化(它是在你第一次需要时创建的。这是否有用取决于你正在编写什么样的应用程序。

要注意的第二件事是该类是最终的,你不能继承它。虽然这在技术上无论如何都是不可能的(因为构造函数是私有的),但对于完整性来说它是一件好事。

完成它的是静态实例变量和静态访问器,它让你得到实例变量。这为Singleton提供了全局可访问性。一般来说,当一个班级有一个getInstance()方法时,可以安全地认为它是一个单身人士。这是一个惯例。

最后,该示例包含不可变和可变成员的示例。您需要哪种类型取决于您的具体需求。

无论如何,我希望我帮你清理一些事情。

答案 2 :(得分:0)

您需要以这种方式共享类之间的连接,

Provider.java,包含许多常量的接口,例如DRIVER_CLASSCONNECTION_URLUSERNAMEPASSWORD

ConnectionProvider.java,一个负责返回object of Connection的类。它使用Singleton和工厂方法设计模式。

界面:

public interface Provider {
String DRIVER="driver_name";
String CONNECTION_URL="URL";
String USERNAME="";
String PASSWORD="";
}

ConnectionProvider类

public class ConnectionProvider {
private static Connection con=null;
static{
try{
Class.forName(DRIVER);
con=DriverManager.getConnection(CONNECTION_URL,USERNAME,PASSWORD);
}catch(Exception e){}
}

public static Connection getCon(){
    return con;
}    
}

Dao课程中,为connection创建一个对象并使用它,

Connection con=ConnectionProvider.getCon();

希望这会有所帮助!!