核心API介绍:
java.sql.DriverManager: 除了装载JDBC驱动程序, DriverManager 还负责返回适当的驱动程序连接.getConnection()方法被调用的时候, DriverManager试图在已经注册的驱动程序中为URL寻找一个合适的驱动程序.
java.sql.Driver: Driver对象实现了acceptsURL(String url)方法,确认自己具有连接到DriverManager传递的URL上的能力
java.sql.Connection:Connection对象提供了JDBC API和URL指定的数据库管理系统之间的连接.Connection表示与特定数据库的会话
java.sql.Statement:Statement对象作为在给定上执行SQL语句的容器
java.sql.ResultSet:ResultSet控制通过游标的移动对变化的结构中给定Statement的结果进行访问和使用一系列的getXXX()方法访问数据
JDBC API作为java核心类库的一部分,直接包含在JDK软件包中,其对应的包为java.sql,要使用JDBC,必须在程序开始import这个包:
import java.sql.*;以下分别来说明使用JDBC来存取数据库的几个步骤。
- 载入JDBC driver
- 使用类型1的driver(JDBC-ODBC bridge driver)
类型1的driver直接包含在JDBC软件中,只要在客户端安装好数据库对应的ODBC driver即可使用。
程序中可使用下列语句载入类型1的driver:Class.forName ("sun.jdbc.odbc.JdbcOdbcDriver");
- 使用类型2和类型4的JDBC driver
针对不同类型的数据库,首先要从厂家那里获取相应数据库的JDBC driver,再按说明将它载入到程序中。下面以oracle的JDBC driver为例说明。
先从oracle的网站下载指定数据库版本的JDBC driver,然后将该driver的存放路径加入CLASSPATH,最后在程序中使用以下语句载入driver:Class.forName("oracle.JDBC.driver.OracleDriver");
如需要,程序员还可以建立一个driver的实例并利用DriverManager类将它登记到系统中:DriverManager.registerDriver(new oracle.jdbc.driver.OracleDriver());
- 使用类型1的driver(JDBC-ODBC bridge driver)
- 与数据库建立连接
Connection con = DriverManager.getConnection (url, db_username, db_password);
其中的db_username和db_password分别对应所连数据库的用户名和口令。url与网络中的URL有所不同,它给出了要连数据库的有关信息。不同类型的JDBC driver对应不同格式的url。即使是同一类型的JDBC driver,不同厂家的数据库其格式也有所不同。这里类型2和类型4的driver均以oracle为例。- 类型1的driver的url的格式
jdbc:odbc:dsn_name
其中,dsn_name为数据库对应的ODBC driver的DSN名 - 类型4的Oracle driver (the thin driver) 的格式
jdbc:oracle:thin@database_name:port_no:SID
其中,database_name为数据库服务器的名字或IP地址,port_no为数据库listener的端口号,Oracle缺省为1521,SID为数据库的SID。如:String url = "jdbc:oracle:thin:@192.168.0.150:1521:ora816";
- 类型2的Oracle driver (the OCI driver) 的格式
jdbc:oracle:oci8@database_name
该database_name或者是SQL*Net中的name- value对(pair), 或者,如果你使用Oracle Name server, 也可以使用tnsname.ora文件中的name。
- 建立Statement对象
Statement stmt = conn.createStatement ();
- 执行SQL查询语句
ResultSet rset = stmt.executeQuery (SELECT ename from emp where empno = 7900);
- 获取数据库查询结果
。。。。。。。。。 boolean more=rset.next(); while (more) { String ename = rset.getString("ename")) System.out.println(ename); more=rset.next(); }
其中,ResultSet的getXXX()方法用于获取该行中指定列的值。通常如对应的SQL类型为字符串或文字类型,可使用getString()方法。如rset中每一行第一列的列名为ename, 其数据库中的SQL类型为VARCHAR,就可以用rset.getString("ename"))获得该列对应的值。如对应的SQL类型为数值类型,如INTEGER, FLOAT, NUMBER等,则可使用getInt(), getFloat()等方法。另外,getXXX()方法的参数也可以是列号,假如上述ename为ResultSet中的第一列,则getString(1)与getString("ename")效果一样。 - 更新数据库
创建表: String createTableCoffees = "CREATE TABLE COFFEES " + "(COF_NAME VARCHAR(32), SUP_ID INTEGER, PRICE FLOAT, " + "SALES INTEGER, TOTAL INTEGER)"; stmt.executeUpdate(createTableCoffees); 在表中插入记录: stmt.executeUpdate( "INSERT INTO COFFEES " + "VALUES ('Colombian', 101, 7.99, 0, 0)"); 更新记录: String updateString = "UPDATE COFFEES " + "SET SALES = 75 " + "WHERE COF_NAME LIKE 'Colombian'"; stmt.executeUpdate(updateString);
- 关闭数据库连接
如:rset.close(); stmt.close(); conn.close();
要注意的是,前面介绍的许多方法如createStatement(), executeQuery()和executeUpdate()等方法均会产生一个SQLException的例外,所以使用这些语句时要作相应的例外处理。