在Java应用程序中,与数据库的交互是常见的需求。本文将介绍如何在Java中使用JDBC-ODBC桥接驱动程序来连接和操作数据库。将跳过数据库的基础知识,直接进入主题。
在Java中,为了在运行时连接到任何数据源,需要加载一个驱动程序。对于ODBC数据源也是如此。驱动程序被实现为一个类,在运行时被定位和加载。JDBC连接的ODBC驱动程序名称为sun.jdbc.odbc.JdbcOdbcDriver
。
类似于在Visual C++中,需要一个ODBC连接字符串来连接到数据源。例如,如果正在编写一个连接到名为myDB.mdb
的Access数据库文件的VC++程序,会使用如下的ODBC连接字符串:
"Driver={Microsoft Access Driver (*.mdb)};DBQ=myDB.mdb;"
在Java中,会写一个类似的连接字符串,但会有一个额外的指定指向连接所需的驱动程序,即:
"jdbc:odbc:Driver={Microsoft Access Driver (*.mdb)}; DBQ=myDB.mdb;"
因此,为了概括上述内容,要连接到一个ODBC DSN,需要一个形式如下的连接字符串:
"jdbc:odbc:ODBC DSN String"
包含数据库相关类的包位于java.sql
中。因此,按照以下方式导入:
import java.sql.*;
动态加载类sun.jdbc.odbc.JdbcOdbcDriver
,如下所示:
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
String database = "jdbc:odbc:Driver={Microsoft Access Driver (*.mdb)};DBQ=myDB.mdb;";
Connection conn = DriverManager.getConnection(database, "", "");
必须创建一个Statement
对象来在打开的数据库上执行SQL查询。这是通过以下代码完成的:
Statement s = conn.createStatement();
完成SQL查询后,调用s.close()
来释放Statement
对象。然后,在结束程序之前或在决定不再需要数据库之后,通过调用conn.close()
来关闭数据库。以下代码在完成后进行清理:
s.close(); // 关闭语句
conn.close(); // 关闭数据库,不再需要
当需要执行一个SQL查询时,调用s.execute("SQL statement")
。它返回查询影响的行数。如果最后一个查询持有要返回的ResultSet
,这通常发生在SELECT ...
类型的查询中,那么调用s.getResultSet()
,它返回ResultSet
对象。以下代码展示了如何使用一个SELECT
查询并显示表中前两列包含的值。
String selTable = "SELECT * FROM SOMETABLE";
s.execute(selTable);
ResultSet rs = s.getResultSet();
while ((rs != null) && (rs.next())) {
System.out.println(rs.getString(1) + ": " + rs.getString(2));
}
以下应用程序执行以下操作:
myDB.mdb
文件。Statement
对象。Statement
对象,然后关闭数据库连接。
/*
Program:
* Setup database driver manager to understand and use ODBC MS-ACCESS data source.
* Written by Arnav Mukhopadhyay (ARNAV.MUKHOPADHYAY@smude.edu.in)
* Compile as: javac dbAccess.java
*/
import java.sql.*;
public class dbAccess {
public static void main(String[] args) {
try {
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
String database = "jdbc:odbc:Driver={Microsoft Access Driver (*.mdb)};DBQ=myDB.mdb;";
Connection conn = DriverManager.getConnection(database, "", "");
Statement s = conn.createStatement();
// create a table
String tableName = "myTable" + String.valueOf((int)(Math.random() * 1000.0));
String createTable = "CREATE TABLE " + tableName + "(id Integer, name Text(32))";
s.execute(createTable);
// enter value into table
for (int i = 0; i < 25; i++) {
String addRow = "INSERT INTO " + tableName + " VALUES (" + String.valueOf((int) (Math.random() * 32767)) + ", 'Text Value " + String.valueOf(Math.random()) + "')";
s.execute(addRow);
}
// Fetch table
String selTable = "SELECT * FROM " + tableName;
s.execute(selTable);
ResultSet rs = s.getResultSet();
while ((rs != null) && (rs.next())) {
System.out.println(rs.getString(1) + ": " + rs.getString(2));
}
// drop the table
String dropTable = "DROP TABLE " + tableName;
s.execute(dropTable);
// close and cleanup
s.close();
conn.close();
} catch (Exception ex) {
ex.printStackTrace();
}
}
}