0

我不想让我的代码与一些 JDBC 驱动程序(例如 MySql)紧密耦合。我想制作通用代码,可以与许多数据库实现一起使用。而且我不太明白在使用 JDBC 时如何实现这个目标。

我认为要实现这一点,我只需要将驱动程序类名(和连接字符串)导出到.properties文件(例如"com.mysql.jdbc.Driver"),然后在代码中像这样使用它Class.forName(PROPERTIES.getDriverName()).newInstance();所以当我决定更改我的数据库时,我需要更改的只是 jdbc文件中的驱动程序名称.properties(例如 to "COM.ibm.db2.jdbc.app.DB2Driver"),连接字符串,并.jar在类路径中更改驱动程序的文件。

这样对吗?

4

4 回答 4

3

松散耦合可以通过多种方式实现 -

A. 使用 Hibernate ,但这可能对您的需求过度杀伤并损害性能(如果您的应用程序主要执行写操作)

B. 使用 Spring-JDBC 或任何其他用作 JDBC 包装器的框架- 通常它们提供某种抽象

C。如果您的代码是 Java EE 代码,您可以使用 DataSources,并在您的 Java 应用程序服务器上配置它们 - 您将按名称查找数据源,并且您不会知道实现细节在

D 之后。您可以确保您在分层中构建应用程序 - 一个业务逻辑层,它使用一个数据访问层,它使用一些数据引擎(确保您的数据引擎类实现一个接口,以便您可以轻松更改实现)。

您的数据引擎类可以从配置(XML 文件的属性)中读取有关 jdbc 驱动程序的信息 - 例如,这基本上是 Hibernate 所做的。

于 2012-06-23T17:30:39.510 回答
2

你答对了。外部化驱动程序类名称、数据库 URL、用户和密码,然后就可以了。无论如何,大多数“框架”都会这样做:Java EE 服务器允许在服务器中配置数据源,并使用 JNDI 访问它。Hibernate 在其配置文件中对此有条目,连接池通常使用 XML 或属性文件来保存它们的配置。

当然,如果您使用专有的 SQL 代码,您将无法如此轻松地从一个数据库切换到另一个,但这是另一个问题。

于 2012-06-23T17:34:44.850 回答
1

当然,这可能对你有用。不过,对于这个问题的未来读者,我会更完整一点:

但是您编写的许多查询可能是特定于数据库的,或者依赖于某些关键字才能有效。以一个常见的查询为例。您想列出数据库中的所有产品,但一次向用户显示 10 个:

MySQL:

select * from products LIMIT 0,10

然后对于接下来的 10 行:

select * from products LIMIT 10,10

等等

太棒了,因此用户可以将 MySQL 用于数据库。那么如果他们使用另一个免费且非常流行的数据库 postgres 怎么办?该查询不起作用:

SELECT * FROM product LIMIT 10 OFFSET 10

所以你的代码不像你想象的那样可移植。

解决此问题的一种方法是为您计划执行的所有查询/访问创建自己的接口(接口查询,接口访问),然后根据数据库方言(MySQL,postgres)创建一个可以实例化的查询工厂等)并创建 MySQLQueryImpl 和 PostGresQueryImpl(均实现 Query 接口)。

不幸的是,您必须对某些数据库调用进行两次编码,或者将它们自己移到属性文件中。您还可以将查询因子设计为从属性文件中实例化(就像您最初想要的那样),并允许将来其他用户实现他们自己的查询,因此可扩展性就在那里,您不必自己做所有事情。

或者...

另一种选择,可能更优雅和防错(嗯......也许)是让别人为你做这件事。Hibernate是一个非常常用的工具,可以为您抽象出数据库读/写,并且可以根据需要配置为使用不同的数据库,只有它具有多年的经验和错误修复。这不是最容易学习的东西(对于复杂的查询和连接等),但对于基本模型和到数据库的映射,它将为您提供您想要的一切以及更多,包括非常轻松和懒惰地打开/关闭缓存的能力加载数据,这样您就不会引入数千条您不会使用的记录。创建和强化这样的系统需要很长时间。

于 2012-06-23T17:32:12.337 回答
1

外部化连接字符串不会使您的应用程序能够处理不同的数据库。但这是你可以做的。

使用数据源而不是连接这使您能够使用 JNDI、连接池等多种不同的方式创建连接。

有关数据源的更多信息,直接来自 javax.sql.DataSource javadoc

用于连接到此 DataSource 对象所代表的物理数据源的工厂。作为 DriverManager 工具的替代方法,DataSource 对象是获取连接的首选方法。

定义用于访问数据的DAO 接口。使您的应用程序代码依赖于接口。您可以为 DAO 接口提供特定于数据库的实现。当数据库发生变化时,为数据库创建新的实现。让 DAO 工厂根据数据库选择合适的 DAO 实例。

Mybatis、Hibernate 等支持ORM范式的库会为您自动执行这些步骤。

于 2012-06-23T18:00:40.553 回答