我有一个项目需要连接到数据库。我正在从 config.xml 文件中读取数据库连接信息,但是,我陷入了为特定数据库引擎定义数据源的部分(从技术上讲,它是 dbms,但这些术语似乎可以互换使用) )。这是相关的代码片段:
String engine = get(xmldoc, "engine");
if (engine == "postgres")
{
PGSimpleDataSource ds = new PGSimpleDataSource();
}
else if (engine == "mssql")
{
SQLServerDataSource ds = new SQLServerDataSource();
}
else if (engine == "sqlite")
{
SQLiteDataSource ds = new SQLiteDataSource();
}
else
{
throw new Exception(String.format("Unknown DBMS type %s", engine));
}
ds.setServerName(get(xmldoc, "hostname"));
ds.setDatabaseName(get(xmldoc, "databasename"));
ds.setUser(get(xmldoc, "username"));
当我尝试编译它时,对于每个对 ds
的引用,我都会收到一堆错误:找不到符号
。经过一番挖掘,我发现这是因为我的 ds 变量是声明它的 if 语句的本地变量(引用: Cannot find symbol if statement error )。但与该问题不同的是,我不能简单地在开始时声明它,因为我不知道它将是什么特定的数据源。
那么,动态设置数据源的最佳方法是什么?最好不要将所有初始化代码放入每个 if 语句中,因为那样我也必须将所有数据库调用都放在那里。是否有某种方法可以首先将 ds 声明为通用数据源,然后将其转换为 if 语句中的特定数据源?
最佳答案
首先,您比较字符串的方式是错误的:
但是解决真正问题的方法是使用多态性。
您需要定义一个
DataSource
接口(interface)来声明您的应用程序将调用的所有方法。所有现有的数据库特定数据源类都需要实现
DataSource
接口(interface)及其方法。 (也许您可以使用抽象类来实现一些常见功能。)将
ds
声明为DataSource
;例如String engine = get(xmldoc, "engine"); DataSource ds = null; if (engine.equals("postgres")) { ds = new PGSimpleDataSource(); } else if (engine.equals("mssql")) { ds = new SQLServerDataSource(); } else if (engine.equals("sqlite")) { ds = new SQLiteDataSource(); } else { throw new Exception(String.format("Unknown DBMS type %s", engine)); } ds.setServerName(get(xmldoc, "hostname")); ds.setDatabaseName(get(xmldoc, "databasename")); ds.setUser(get(xmldoc, "username"));
上述问题是标准DataSource
接口(interface)和类没有实现您想要使用的方法。因此,您必须为 PGSimpleDataSource
、SQLServerDataSource
等创建自己的接口(interface)和包装类。
(您确定要自己编写这段代码吗?找到并使用现有的库不是更好吗?或者如果只是设置服务器名称、数据库和用户,请在其中进行“连接”配置if/else 分支使用源特定的 API 方法。)
关于java - 为特定 DBMS(数据库引擎)动态设置数据源的正确方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59257255/