不同的数据库系统实现(例如MySQL和Microsoft SQL Server)是否会以不同的方式影响`DataSource`和`DriverManager`?

时间:2017-12-10 16:46:32

标签: java database jdbc

以下是使用DataSource和使用https://stackoverflow.com/a/19674833/1224441中的DriverManager的比较

  

使用JDBC,我们可以使用抽象类,例如   java.sql.DataSource,定义数据库。然而,    MySQL DataSource和Microsoft SQL DataSource是不同的   实现。 JDBC不知道您要使用哪一个。

     

因此,您使用DriverManager指定要使用的JDBC   MySQL实现,你加载该驱动程序的类。    请稍后再切换到Microsoft SQL。现在,你需要做的就是   是更改DriverManager加载Microsoft SQL驱动程序的类,   以及使用抽象java.sql的所有代码   课程仍然有效。

我找到了一些使用DataSource并在http://zetcode.com/tutorials/jeetutorials/datasource/使用DriverManager

的示例

但是我没有看到不同的实现(例如MySQL和Microsoft SQL Server的实现)会以不同的方式影响DataSourceDriverManager。或者我误解了什么?

1 个答案:

答案 0 :(得分:0)

使用JDBC访问数据库时,您将处理java.sql.Connectionjava.sql.Resultset ...这些是接口。您将实际使用特定于数据库的实现。

这样,您为一个数据库编写的大部分代码都可以与另一个数据库一起使用,而且每次需要访问新数据库时都不必学习新的API。

您需要首先指定JDBC驱动程序提供的所需实现。您可以使用旧学校 DriverManager或现在首选的DataSource进行此操作。

的DriverManager

DriverManager是一个具体的类。它并不特定于任何数据库。总而言之,它只是您注册驱动程序的地方,以便您可以在以后获得所需的所有特定实现。它本身并不具体,但它提供了您需要的所有特定内容。

以下是您在我的一些评论中提到的示例的摘录。

final String url = "jdbc:mysql://localhost:3306/books";

//This line returns the Class of the Jdbc drive
//It will not be used but doing this will allow 
//static initializations where it will register
//the driver to the DriverManager
Class.forName("com.mysql.jdbc.Driver");

//Here you get your connection implmentation
Connection con = DriverManager.getConnection(url, "root", "");

//MySQL specific Statement
Statement stmt = con.createStatement();
//MySQL specific ResultSet
ResultSet result = stmt.executeQuery("SELECT * FROM books");

"陷阱"这是在调用Class.forName方法时,在静态初始化期间完成驱动程序(到DriverManager)的注册。

为了您的信息,herecom.mysql.jdbc.Driver在init中执行驱动程序注册的代码段:

public class Driver extends NonRegisteringDriver implements java.sql.Driver {
    //
    // Register ourselves with the DriverManager
    //
    static {
        try {
            java.sql.DriverManager.registerDriver(new Driver());
        } catch (SQLException E) {
            throw new RuntimeException("Can't register driver!");
        }
    }

数据源

使用DataSource更适合外部配置。 DataSourceinterface,实现直接取决于数据库。

在您的示例中,驱动程序实现在web.xml文件中指定。

首先,我们定义驱动程序,以便能够使用JNDI

找到它
<database>
  <jndi-name>jdbc/mysql</jndi-name>
  <driver>
    <type>com.mysql.jdbc.jdbc2.optional.MysqlConnectionPoolDataSource</type>
    <url>jdbc:mysql://localhost:3306/books</url>
    <user>root</user>
    <password></password>
  </driver>
<database>

然后我们将引用传递给servlet:

<servlet>
 <servlet-name>datasource</servlet-name>
 <servlet-class>com.zetcode.DataSourceExample</servlet-class>
 <init>
    <data-source>${jndi:lookup('jdbc/mysql')}</data-source>
 </init>
</servlet>

这样,您就不必编写任何特定的代码行。如果您更改数据库(理论上),您只需更改配置即可。不是代码。

重要说明

  1. 正如Kayaman在评论中提到的,自Java 6以来不再需要调用Class.forName。您只需要在类路径中使用驱动程序。
  2. 不建议再使用DriverManager提醒您。请参阅javadoc
  3. 中的摘录
      

    注意:JDBC {2.0}中的新增DataSource接口提供了另一种连接数据源的方法。使用DataSource对象是连接数据源的首选方法。