[英]Does different database system implementations (e.g. MySQL, and Microsoft SQL Server) affect `DataSource` and `DriverManager` differently?
這是使用DataSource
和使用https://stackoverflow.com/a/19674833/1224441中的 DriverManager
一些比較
使用JDBC,我們可以使用抽象類,例如
java.sql.DataSource
,它定義了一個數據庫。 但是, MySQL數據源和Microsoft SQL數據源是不同的實現。 JDBC不知道您要使用哪一個。因此,您可以使用DriverManager來指定要使用MySQL實現的JDBC,然后加載該驅動程序的類。 稍后再說,切換到Microsoft SQL。 現在,您要做的就是更改DriverManager以加載Microsoft SQL驅動程序的類,並且使用抽象
java.sql
類的所有代碼仍然可以使用。
我在http://zetcode.com/tutorials/jeetutorials/datasource/找到了一些使用DataSource
和使用DriverManager
示例。
但是我看不到不同的實現(例如MySQL和Microsoft SQL Server的實現)如何不同地影響DataSource
和DriverManager
。 還是我誤會了什么?
使用JDBC訪問數據庫時,將處理接口的java.sql.Connection
, java.sql.Resultset
...。 實際上,您將使用特定於數據庫的實現。
這樣,您為一個數據庫編寫的大多數代碼都可以與另一個數據庫一起使用,並且不必在每次需要訪問新數據庫時都學習新的API。
您需要首先指定JDBC驅動程序所提供的實現。 您可以使用老式的 DriverManager
或現在首選的DataSource
。
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的注冊)。
供您參考, 這是com.mysql.jdbc.Driver
的代碼片段,用於在com.mysql.jdbc.Driver
進行驅動程序注冊:
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
更適合外部配置。 DataSource
是一個interface
,其實現直接取決於數據庫。
在您的示例中,在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>
這樣,您不必編寫任何特定的代碼行。 如果您更改數據庫,(理論上)只需更改配置即可。 不是代碼。
Class.forName
。所有您需要的是在類路徑中具有驅動程序。 DriverManager
。 請參閱javadoc中的此摘錄 注意 :JDBC 2.0 API中新增的DataSource接口提供了另一種連接數據源的方法。 使用DataSource對象是連接到數據源的首選方法。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.