[英]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.