以下是使用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的实现)会以不同的方式影响DataSource
和DriverManager
。或者我误解了什么?
答案 0 :(得分:0)
使用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)的注册。
为了您的信息,here是com.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
更适合外部配置。 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}中的新增DataSource接口提供了另一种连接数据源的方法。使用DataSource对象是连接数据源的首选方法。