JDBC的实质就是使用统一的、标准化界面存取多种能够数据源,从而实现不同数据库系统间的互操作性。JDBC主要由一组JAVA类库和借口库组成,涉及到的JAVA标准包有java.sql.*和javax.sql.*。JDBC由应用层和驱动程序层两层构成。主要的接口和核心类包括Driver接口、DreverManager类、Connection类、Statement类、PreparedStatement类、CallableStatement以及ResultSet类等。JDBC是由JavaSoft公司开发的,JDBC API是一个标准统一的SQL数据存取接口。它为Java程序提供了一个统一缝地操作各种数据库的接口,程序员编程时,可以不关心它所要操作的数据库是哪个厂家的产品,从而提高了软件的通用性,而且在Internet上确实无法预料你的用户想访问什么类型的数据库。只要系统上安装了正确的驱动器组,JDBC应用程序就可以访问其相关的数据库。
1. Driver接口
每个JDBC数据库驱动程序都会提供Driver接口应用程序调用。此外,在使用Driver接口之前,Java/JSP程序必须使用import语句导入java.sql.*包;在Java/JSP开发中要连接数据库,必须先加载数据库厂商提供的数据库驱动程序。不同类型JDBC驱动程序在JSP编程时的加载方式不同。
2. DriverManager类
DriverManager(驱动程序管理器)类是JDBC的管理程序,在驱动程序和应用程序之间工作。DriverManager类管理着数据库和相应驱动程序之间建立的连接。DriverManger类所提供getConnection函数所返回的Connection接口类十分重要,大部分数据库编程工作都要通过Connection接口类中提供的各类函数才能进行。
3. 数据库连接
DriverManger对象中提供了一个getConnection函数,调用该函数可获得一个数据库连接。该函数有3种不同的函数重在形式,可以在编程时根据具体情况调用。
static Connection getConnection(String url):和一个通过url指定的数据库建立连接。
static Connection getConnection(String url,Properties info):和一个通过url指定的数据库建立连接。info提供了一些属性,这些属性里包括了user和password等属性。
static Connection getConnection(String url,String user,String password):传入参数用户名为user,密码为password,和一通过url指定的数据库建立连接。
url的格式中用冒号分隔。其中jdbc表示协议,JDBC只有一种协议,显然协议是唯一的。Subprotocol表示子协议,用来区分JDBC数据库驱动程序,不同数据库厂商的数据库驱动程序的子协议都不同。subname表示子名,由特定的驱动程序确定,不同的数据库厂商一般采用不用的名称。
getConnection函数返回的Connection对象代表着与指定的数据库的连接,即在已经加载的Driver驱动和指定的数据库之间建立连接。
4. 数据库操作
对于数据库的操作需要通过java.sql.Statement、java.sql.PrepareStatement、java.sql.CallableStatement类之一来完成。Statement类提供了执行基本SQL语句操作的功能。PrepareStatement类继承了Statement类,提供了SQL语句预编译的功能,因而可以显著提高SQL执行的性能。CallableStatement类从PrepareStatement类继承而来,可以用来执行数据库中的存储过程。
关于事务,一般情况下符合JDBC的驱动程序都必须支持事务。事务是由一条或多条语句序列组成,这些语句要么执行,要么全部都不执行,即具有原子特性,也就是说这些操作都是原子操作,不可分开的操作。比如两个银行账户A和B之间转帐,要从A账户转1000元到B账户上去。也就是从A账户减去1000元,然后在B账户加上1000元。但是如果在A账户减去的1000元还没加到B账户上去时候,程序发生了异常,要是不撤销A账户减去1000元的操作A账户就白白损失了1000元。所以A账户减去1000元和B账户加上1000元的操作要么就一起成功,要么就一起失败,这两个操作绑定在一起就是一个事务。提交事务用commit函数,撤销事务用rollback函数。
5. ResultSet结果实例
用JDBC来实现访问数据库记录可以采用下面的几个步骤:
1、 通过驱动器管理器获取连接接口。
2、 获得Statement或它的子类。
3、 限制Statement中的参数。
4、 执行Statement。
5、 查看返回的行数是否超出范围。
6、 关闭Statement。
7、 处理其它的Statement
8、 关闭连接接口。
try ... {
String url = "jdbc:microsoft:sqlserver://localhost:1433;DatabaseName=pubs";
String user = "sa";
String pwd ="";
java.sql.Connection conn = DriverManager.getConnection(url,user,pwd);//使用url,user,pwd与指定的数据库建立连接
java.sql.Statement st = conn.createStatement();//创建执行SQL语句的statement
java.sql.ResultSet rs = st.executeQuery("select * from authors");//执行SQL返回结果集ResultSet
out.println("<table border='1'>");
while(rs.next())
...{
out.println("<tr>");
/** *//**使用列名访问数据**/
out.println("<td>"+rs.getString("au_id")+"</td>");
out.println("<td>"+rs.getString("au_lname")+"</td>");
out.println("<td>"+rs.getString("au_fname")+"</td>");
out.println("<td>"+rs.getString("phone")+"</td>");
out.println("<td>"+rs.getString("address")+"</td>");
out.println("<td>"+rs.getString("city")+"</td>");
out.println("<td>"+rs.getString("state")+"</td>");
out.println("<td>"+rs.getString("zip")+"</td>");
/** *//**使用序列号访问数据**/
/**//*out.println("<td>"+rs.getString(1)+"</td>");
out.println("<td>"+rs.getString(2)+"</td>");
out.println("<td>"+rs.getString(3)+"</td>");
out.println("<td>"+rs.getString(4)+"</td>");
out.println("<td>"+rs.getString(5)+"</td>");
out.println("<td>"+rs.getString(6)+"</td>");
out.println("<td>"+rs.getString(7)+"</td>");
out.println("<td>"+rs.getString(8)+"</td>");*/
out.println("</tr>");
}
out.println("</table>");
rs.close();//释放返回结果集
conn.close();//释放数据库连接
}
catch (SQLException ex)
... {
out.println("error!");
out.println(ex.getMessage());
}