使用JDBC的基本步骤

源网址: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());
         }
    }
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值