如何在JDBC驱动程序和源代码之间实现松散耦合?

时间:2012-06-23 17:05:39

标签: java jdbc loose-coupling

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

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

是不是?

4 个答案:

答案 0 :(得分:3)

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

A.使用Hibernate,但这可能会对您的需求造成过大影响并损害性能(如果您的应用程序主要执行写操作)

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

C.如果您的代码是Java EE代码,您可以使用DataSources,并在Java应用程序服务器上配置它们 - 您将按名称查找数据源,并且您将不知道后面的实现细节。 > D.您可以确保在层中构建应用程序 - 一个业务逻辑层,它使用数据访问层,它使用一些数据引擎(确保您的数据引擎类实现一个接口,以便您可以轻松地更改实现)。登记/>
您的数据引擎类可以从配置(XML文件的属性)中读取有关jdbc驱动程序的信息 - 例如,这基本上就是Hibernate的功能。

答案 1 :(得分:2)

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

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

答案 2 :(得分: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是一个非常常见的工具,可以为您抽象出数据库的读/写,并且可以配置为根据需要使用不同的数据库,只有它具有多年的经验和错误修复。这不是最容易学习的东西(对于复杂的查询和连接等),但对于基本模型和映射到数据库,它将为您提供所需的一切和​​更多,包括非常容易和懒惰地打开/关闭缓存的能力加载数据,这样就不会引入数以千计的不会使用的记录。创建和强化这样的系统会花费很长时间。

答案 3 :(得分:1)

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

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

更多关于Datasource,直接来自javax.sql.DataSource javadoc

  

用于连接物理数据源的工厂   DataSource对象表示。 DriverManager的替代方案   设施,DataSource对象是获取a的首选方法   连接。

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

支持ORM范例的Mybatis,Hibernate等库可以为您自动执行这些步骤。