开发一个访问数据库的应用程序,首先要加载数据库的驱动程序,只需要在第一次访问数据库时加载一次,然后每次运行时创建一个Connection实例,紧接着执行操作数据库的SQL语句,并处理返回的结果集,最后在完成完成此次操作时销毁前面创建的Connection,释放与数据库的连接。

加载数据库驱动

在连接数据库之前,首先要把JDBC驱动类加载到java虚拟机,可以使用java.lang.Class类的静态方法forName(String className)。成功加载后会将加载的驱动类注册给DriverManager类,加载失败将抛出ClassNotFoundException异常。

创建数据库连接

DriverManager类跟踪已注册的驱动程序,通过调用DriverManager类的静态方法getConnection(String url, String user, String password)可以建立与数据库的连接。3个参数依次为欲连接的数据库的路径、用户名和密码,方法返回值类型为java.sql.Connection。当调用该方法时,会搜索整个驱动程序列表,直到找到一个能够连接至数据连接字符串中指定的数据库的驱动程序为止。

执行SQL语句,得到结果集

当数据库连接建立以后,就可以使用该连接创建Statement实例,并将SQL语句传递给它所连接的数据库,并返回类型为ResultSet的对象(查询的时候),Statement实例分为3种类型:

  • Statement实例:该类型的实例只能用来执行静态的SQL
  • PreparedStatement实例:该类型的实例可以执行动态的SQL
  • CallableStatement实例:该类型的实例可以执行数据库的存储过程

处理查询结果

对于返回的结果集,使用ResultSet对象的next()方法将光标指向下一行。最初光标位于第一行之前,因此第一次调用next()方法将光标置于第一行上,如果到达结果集的末尾,则ResultSet的next()方法会返回false,方法getXXX提供了获取当前行中某一列的值的途径,列名或列号可用于标识要从中获取数据的列。

连接示例

为了方便操作,这里我选用H2数据库,这样电脑上没有安装数据库的朋友也可以快速的构建程序,H2数据库的官网地址为:
http://www.h2database.com/html/main.html

H2是一个短小精干的嵌入式数据库引擎,主要的特性包括:
1. 免费、开源、快速
2. 嵌入式的数据库服务器,支持集群
3. 提供JDBC、ODBC访问接口,提供基于浏览器的控制台管理程序
4. Java编写,可使用GCJ和IKVM.NET编译
5. 短小精干的软件,1M左右

如电脑上已经安装了数据库,直接使用对应数据库厂商提供的驱动包即可,操作过程一致。

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

public class JDBCConnectDemo
{
   public static void main(String[] args)
   {
      // 加载数据库驱动
      try
      {
         Class.forName("org.h2.Driver");
      }
      catch (ClassNotFoundException e)
      {
         System.out.println("加载数据库驱动失败...");
         return;
      }
      // 初始化数据库,方便运行加的这一段代码,实际开发中,数据库应该是初始化好的,如果已存在数据库,请将该段代码注释掉,无需执行
      try
      {
         initDataBase();
      }
      catch (SQLException e1)
      {
         System.out.println("数据库表初始化失败驱动失败...");
         return;
      }
      Connection conn = null;
      Statement statement = null;
      ResultSet resultSet = null;
      try
      {
         // 获得数据库连接
         conn = DriverManager.getConnection("jdbc:h2:h2.db", "test", "123");
         statement = conn.createStatement();
         resultSet = statement
               .executeQuery("SELECT USER_ID, USER_NAME FROM USER_INFO");
         System.out.printf("%20s %50s\n", "USER_ID", "USER_NAME");
         // 遍历结果集
         while (resultSet.next())
         {
            System.out.printf("%20s %50s\n", resultSet.getString("USER_ID"),
                  resultSet.getString("USER_NAME"));
         }
      }
      catch (SQLException e)
      {
         System.out.println("出现异常...");
      }
      finally
      {
         // 释放资源
         if (resultSet != null)
         {
            try
            {
               resultSet.close();
            }
            catch (SQLException e)
            {
               e.printStackTrace();
            }
         }
         if (statement != null)
         {
            try
            {
               statement.close();
            }
            catch (SQLException e)
            {
               e.printStackTrace();
            }
         }
         if (conn != null)
         {
            try
            {
               conn.close();
            }
            catch (SQLException e)
            {
               e.printStackTrace();
            }
         }
      }
   }

   /**
    * 初始化数据库
    * 
    * @throws SQLException
    */
   private static void initDataBase() throws SQLException
   {
      Connection conn = null;
      Statement statement = null;
      try
      {
         // 获得数据库连接
         conn = DriverManager.getConnection("jdbc:h2:h2.db", "test", "123");
         // 创建一张表
         String sql = "CREATE TABLE IF NOT EXISTS USER_INFO (USER_ID VARCHAR(20) PRIMARY KEY, USER_NAME VARCHAR(50))";
         statement = conn.createStatement();
         statement.executeUpdate(sql);
      }
      catch (SQLException e)
      {
         throw e;
      }
      finally
      {
         if (statement != null)
         {
            try
            {
               statement.close();
            }
            catch (SQLException e)
            {
               e.printStackTrace();
            }
         }
         if (conn != null)
         {
            try
            {
               conn.close();
            }
            catch (SQLException e)
            {
               e.printStackTrace();
            }
         }
      }
   }
}

常用数据库驱动类及连接字符串

数据库

驱动类

连接字符串

Oracle

oracle.jdbc.driver.OracleDriver

jdbc:oracle:thin:@[IP]:[PORT]:[SID]

DB2

com.ibm.db2.jdbc.app.DB2Driver

jdbc:db2://[IP]:[PORT]/[databaseName]

Sql Server

com.microsoft.jdbc.sqlserver.SQLServerDriver

jdbc:microsoft:sqlserver://[IP]:[PORT];databaseName=[databaseName]

Sybase

com.sybase.jdbc.SybDriver

jdbc:sybase:Tds:[IP]:[PORT]/databaseName

MySQL

com.mysql.jdbc.Driver

jdbc:mysql://[IP]:[PORT]/databaseName

其中[]为需要替换的部分。