繁体   English   中英

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

[英]How to achieve loose coupling between JDBC drivers and source code?

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

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

这样对吗?

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

A.使用Hibernate,但这可能对您的需求来说是过大的选择,并且会降低性能(如果您的应用程序主要执行写操作)

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

C.如果您的代码是Java EE代码,则可以使用DataSources,并在Java应用程序服务器上对其进行配置-您将按名称查找数据源,而您将不知道后面的实现细节

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

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

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

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

当然,这可能对您有用。 不过,对于以后的问题读者,我会更加完整:

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

MySQL:

select * from products LIMIT 0,10

然后用于接下来的10行:

select * from products LIMIT 10,10

等等

太棒了,因此用户可以将MySQL用于数据库。 那么,如果他们使用的是postgres,另一个免费且非常受欢迎的数据库,该怎么办? 该查询将无法正常工作:

SELECT * FROM product LIMIT 10 OFFSET 10

因此,您的代码不像您想象的那样可移植。

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

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

要么...

另一个选择可能更优雅,更防错(嗯……也许)是让其他人为您执行此操作。 Hibernate是一种非常常用的工具,可以为您抽象出数据库读/写的内容,并且可以配置为根据需要使用其他数据库,只有它具有多年的经验和错误修复。 这不是最简单的学习方法(对于复杂的查询和联接等),但是对于基本模型和到数据库的映射,它将为您提供所需的一切以及更多功能,包括能够非常轻松,轻松地打开/关闭缓存的功能。加载数据,这样就不会带来成千上万的不必要的记录,这将花费很长时间来创建和加固这样的系统。

外部化连接字符串不会使您的应用程序处理其他数据库。 但是,这就是您可以做的。

使用数据源代替连接这将使您能够使用JNDI,从连接池等以多种方式创建连接。

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM