源网址:http://www.javacamp.org/moreclasses/jdbc/jdbc.html#code
使用JDBC的基本步骤
目录
使用JDBC的七个步骤
示例程序(Access)
连接到Access数据库(代码)
如何使用 AS/400 JDBC驱动程序
什么是JDBC
JDBC是Java程序与各种数据库交互的中间件。
JDBC使用的七个步骤
JDBC查询数据库包含七个过程:
1. 载入JDBC驱动
2. 定义数据库连接URL
3. 建立连接
4. 创建一个statement对象
5. 执行查询或修改命令
6. 处理查询结果
7. 关闭连接
1. 载入JDBC驱动
载入JDBC驱动分为如下几步:载入合适的驱动包;使用Class.forName(String)方法引入驱动。
try {
Class.forName("connect.microsoft.MicrosoftDriver");
//Class.forName("oracle.jdbc.driver.OracleDriver"); for Oracle driver
//Class.forName("com.sybase.jdbc.SybDriver"); for sybase driver
} catch(ClassNotFoundException e) {
System.err.println("Error loading driver: " + e);
}
传入到Class.forName(String)方法中的String为对应类的全名,通过查看驱动自带的文档,可以找到类对应的全名。大部分数据库都提供了免费的JDBC驱动实现,对于许多旧的数据库,也有JDBC的三方实现。
2. 定义数据库连接URL
加载JDBC驱动后,我们需要指定数据库服务器的URL,总体来说,URL的格式为:jdbc:vendordb:userinfo加上服务器地址、端口号和数据库名称。通过查看驱动自带的文档,可以得知URL的准确格式。以下是两个连接示例:
//for one of Oracle drivers
String host = "dbhost.yourcompany.com";
String dbName = "someName";
int port = 1234;
String oracleURL = "jdbc:oracle:thin:@" + host + ":" + port + ":" + dbName;
//for sybase driver
String host = "dbhost.yourcompany.com";
String dbName = "someName";
int port = 1234;
String sybaseURL = "jdbc:sybase:Tds:" + host + ":" + port + ":" + "?SERVICENAME=" + dbName;
3. 建立连接
通过向DriverManager类中的getConnection方法传递URL、数据库用户名、密码等信息,可以得到真实的连接,如下所示:
String username = "jay_debesee";
String password = "secret";
Connection connection = DriverManager.getConnection(oracleURL, username, password);
通过调用Connection类的getMetaData可以查询数据库的元信息。getMetaData方法会返回一个DatabaseMetaData对象,该对象包含数据库本身的名称和版本等信息、JDBC驱动的名称和版本信息。
DatabaseMetaData dbMetaData = connection.getMetaData();
String productName = dbMetaData.getDatabaseProductName();
System.out.println("Database: " + productName);
String productVersion = dbMetaData.getDatabaseProductVersion();
System.out.println("Version: " + productVersion);
Connection类中还包含其他常用的方法,如:
prepareStatement
prepareCall
rollback
commit
close
isClosed
4. 创建Statement对象
Statement对象用于向数据库发送查询语句和更新命令,其创建方式如下
Statement statement = connection.createStatement();
5. 执行查询或修改命令
一旦建立了Statement对象,你可以通过调用executeQuery方法并传入该对象执行SQL查询语句,查询结果会被放在一个ResultSet中。样例如下
String query = "SELECT col1, col2, col3 FROM sometable";
ResultSet resultSet = statement.executeQuery(query);
调用executeUpdate方法,可以完成数据库修改。executeUpdate方法接受以UPDATE, INSERT, DELETE等关键字开头的SQL语句。Statement中还包含execute(执行任意SQL语句)和etQueryTimeout(设置查询超时时间)等。你也可以提交预编译的SQL语句并向其中传入查询参数。
6. 处理查询结果
最常见的处理查询结果的方法是对查询结果进行逐行遍历,通过调用ResultSet中的next()方法可以在查询结果中移动一行。在每一行中,ResultSet提供了getXxx方法用来提取某一单元格中的数据并将其转换为特定的Java数据类型。比如,如果该单元格中的值为int类型,可以通过调用getint方法取出该值。如果你仅仅想显示这些值,只需要调用getString方法,而无需关心真正的数据类型。注意:如果你使用columnIndex来对单元格进行定位,那么columnIndex从1开始,而不像数组等Java数据结构一样从0开始。以下是示例代码:
while(resultSet.next()) {
System.out.println(results.getString(1) + " " +
results.getString(2) + " " +
results.getString(3));
}
7. 关闭连接
如果需要显式地关闭连接,你需要调用如下方法。
connection.close();
如果还有其他的数据库操作,你需要延迟数据库的关闭。数据库的连接和关闭开销较大,重用数据库连接是一种重要的优化方式。
程序示例(Access)
让我们把以上七个步骤合并起来。
我们下面将介绍JDBC连接 MicrosoftAccess数据库的方法。为使我们的代码生效,我们首先对ODBC数据源进行配置,具体可参考链接http://www.realinfo.com.cn/tec/tech161.htm
以下是遵循七个步骤的数据库连接实例。
import java.sql.*;
public class TestDBDriver {
static Connection con;
static Statement stmt;
static ResultSet rs;
public static void main(String[] args) {
//step 1: load driver
loadDriver();
//step 3: establish connection
makeConnection();
//create a table
createTable();
//insert data
insertData();
//use precompiled statement to update data
usePreparedStatement();
//retrieve data
retrieveData();
//close all resources
closeAll();
}
// load a driver
static void loadDriver() {
try {
//step 2: Define connection URL
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
} catch(java.lang.ClassNotFoundException e) {
System.err.print("ClassNotFoundException: ");
System.err.println(e.getMessage());
}
}
// make a connection step 3: establish connection
static void makeConnection() {
//for how to set up data source name see below.
String dsn = "judydriver";
String url = "jdbc:odbc:" + dsn;
try {
con = DriverManager.getConnection(url, "", "");
}catch(SQLException ex) {
System.err.println("database connection: " + ex.getMessage());
}
}
//create a table
static void createTable() {
String createString = "create table COFFEES " +
"(COF_NAME VARCHAR(32), " +
"SUP_ID INTEGER, " +
"PRICE FLOAT, " +
"SALES INTEGER, " +
"TOTAL INTEGER)";
try {
//step 4: create a statement
stmt = con.createStatement();
//step 5: execute a query or update.
stmt.execute("drop table COFFEES");//if exists, drop it, get new one
stmt.executeUpdate(createString);
}catch(SQLException ex) {
System.err.println("CreateTable: " + ex.getMessage());
}
}
//insert data to table COFFEES
static void insertData() {
try {
stmt.executeUpdate("INSERT INTO COFFEES " + "VALUES ('Colombian', 101, 7.99, 0, 0)");
stmt.executeUpdate("INSERT INTO COFFEES " + "VALUES ('French_Roast', 49, 8.99, 0, 0)");
stmt.executeUpdate("INSERT INTO COFFEES " + "VALUES ('Espresso', 35, 5.99, 0, 0)");
stmt.executeUpdate("INSERT INTO COFFEES " + "VALUES ('Colombian_Decaf', 101, 4.99, 0, 0)");
stmt.executeUpdate("INSERT INTO COFFEES " + "VALUES ('French_Roast_Decaf', 49,6.99, 0, 0)");
}catch(SQLException ex) {
System.err.println("InsertData: " + ex.getMessage());
}
}
//use PreparedStatement to precompile sql statement
static void usePreparedStatement() {
try {
PreparedStatement updateSales;
String updateString = "update COFFEES " +
"set SALES = ? where COF_NAME like ?";
updateSales = con.prepareStatement(updateString);
int [] salesForWeek = {175, 150, 60, 155, 90};
String [] coffees = {"Colombian", "French_Roast", "Espresso",
"Colombian_Decaf", "French_Roast_Decaf"};
int len = coffees.length;
for(int i = 0; i < len; i++) {
updateSales.setInt(1, salesForWeek[i]);
updateSales.setString(2, coffees[i]);
updateSales.executeUpdate();
}
}catch(SQLException ex) {
System.err.println("UsePreparedStatement: " + ex.getMessage());
}
}
//retrieve data from table COFFEES
static void retrieveData() {
try {
String gdta="SELECT COF_NAME, PRICE FROM COFFEES WHERE PRICE < 9.00";
//step 6: process the results.
rs = stmt.executeQuery(gdta);
while (rs.next()) {
String s = rs.getString("COF_NAME");
float n = rs.getFloat("PRICE");
System.out.println(s + " " + n);
}
}catch(SQLException ex) {
System.err.println("RetrieveData: " + ex.getMessage());
}
}
//close statement and connection
//step 7: close connection, etc.
static void closeAll() {
try {
stmt.close();
con.close();
} catch(SQLException ex) {
System.err.println("closeAll: " + ex.getMessage());
}
}
}