我是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
}
}
}
答案 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_CLASS
,CONNECTION_URL
,USERNAME
和PASSWORD
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();
希望这会有所帮助!!