JDBC

对于Microsoft编程体系的程序员来说，ODBC应当很熟悉了。它是Microsoft所制定的标准数据库访问接口，使用这个接口无需修改程序就可以访问不同的数据库。

在JSP中也存在类似的接口，它所使用的是Java的数据库访问方法，这就是JDBC(JavaDataBase Connectivity)。

JDBC是由Sun公司提供的与平台无关的数据库标准API，它将数据库访问封装在为数不多的方法内，使用户可以极其方便的查询数据库、插入新的数据甚至调用存储过程。

事实上JDBC是一种规范，目前各大数据库厂商基本都提供了JDBC驱动程序，甚至像raysQI这样的微型数据库也有数种JDBC驱动程序可选，这样就使得Java应用程序能独立运行于各种各样的数据库之上。

通过Sun公司开发的JDBC-ODBC驱动程序，Java也可以通过ODBC来访问数据库。

JDBC提供的主要接口是：

iava．sql．DriverManager，Drivermanager类用于处理驱动程序的调入并且对新的数据库连接提供支持。 · 、

java．sql．Connection， 指应用程序与特定数据库的连接。

java．sql．Statement，用于一般SQL语句的执行，SQL语句可以查询语句，也可以用于更新语句，甚至可以创建数据库和执行存储过程。

java．sql．ResultSet，查询所返回的结果保存在此对象中，用它可以浏览和存取数据库内的记录。

如果用户要在JSP中直接访问数据库时，必须在访问数据库前将java．sql．*引入，如；

〈% page import= “java.sql.*”%>

这样JSP才能找到对应的SQL接口函数。下面的章节将详细介绍如何使用JDBC接口访问数据库。

## 连接数据库

Sun公司提供的JDBC-ODBC桥可以访问任何支持ODBC的数据库。在这种方式之下，用户无需获取额外的JDBC驱动程序，而仅需设置对应数据库的ODBC数据源(DataSource Name)即可。

这个数据源会把要连接数据库的相关信息提供给JDBC-ODBC驱动程序，由它转换成JDBC接口供应用程序使用。Windows NT在控制面板中提供了ODBC管理员小” 程序，可以进行DSN的设置。在进行DSN设置时，需要先决定建立的DSN种类，如表所示。

表 DSN的种类

设置供Web服务器使用的DSN时，必须建立System形态的DSN，以下是在NT上建立一个SQL Server的pubs数据库的DSN的过程。

## JDBC的用处以及实现步骤

通过前面的学习，对JDBC的功能以及它其中的一些重要组成部分已经有了一个大致的了解，下面将简单的介绍它的功能及其具体实现步骤：

### 1.JDBC的用处

简单的说就是JDBC完成的三件事。

(1)同一个数据库建立连接；

(2)向数据库发送SQL语句；

(3)处理数据库返回的结果；

### 2. JDBC具体的实现步骤

(1)通过驱动器管理器获取连接接口， 注册一个driver。

(2)建立一个到数据库的连接。

(3)创建一个statement。

(4)执行SQL语句。

(5)处理结果。

(6)关闭statement。

(7)关闭连接接口。

### JDBC驱动程序的分类

目前比较常见的JDBC驱动程序可分为以下四个种类。

JDBC-ODBC桥加ODBC驱动程序

JavaSoft桥产品利用ODBC驱动程序提供JDBC访问。注意，必须将ODBC二进制代码（许多情况下还包括数据库客户机代码)加载到使用该驱动程序的每个客户机上。因此，这种类型的驱动程序最适合于企业网，或者是用Java编写的三层结构的应用程序服务器代码。

2.本地API

这种类型的驱动程序把客户机API上的JDBC调用转换为Oracle、Sybase、Informix、DB2或其它DBMS的调用。注意，象桥驱动程序一样，这种类型的驱动程序要求将某些二进制代码加载到每台客户机上。

3.JDBC网络纯Java驱动程序

这种驱动程序将JDBC转换为与DBMS无关的网络协议，之后这种协议又被某个服务器转换为一种DBMS协议。这种网络服务器中间件能够将它的纯Java客户机连接到多种不同的数据库上。所用的具体协议取决于提供者。通常，这是最为灵活的JDBC驱动程序。有可能所有这种解决方案的提供者都提供适合于Intranet用的产品。为了使这些产品也支持Internet访问，它们必须处理Web所提出的安全性、通过防火墙的访问等方面的额外要求。几家提供者正将JDBC驱动程序加到他们现有的数据库中间件产品中。

4.本地协议纯Java驱动程序

这种类型的驱动程序将JDBC调用直接转换为DBMS所使用的网络协议。这将允许从客户机机器上直接调用DBMS服务器，是Intranet访问的一个很实用的解决方法。由于许多这样的协议都是专用的，因此数据库提供者自己将是主要来源。

第三、四类驱动程序为从JDBC访问数据库的首选方法。第一、二类驱动程序在直接的纯Java驱动程序还没有上市前会作为过渡方案来使用。

### JDBC连接各类数据库的驱动程序

通过前面的学习了解到JDBC可以连接许多种数据库，下面就来看看JDBC连接他们的驱动程序。

#### 1.连接Oracle的驱动程序

String url="jdbc:oracle:thin:@localhost:1521:orcl";

String user="root";

String password="password";

Connection can=DriverManager.getConnection(url,user,password);

其中orcl为所要连接的Oracle的数据库的名字。

### 2.连接SQL Server 2000的驱动程序

String url="jdbc:microsoft:sqlserver://localhost:1433;DatabaseName=pubs";

String user="sa";

String password="";

Connection conn=DriverManager.getConnection(url,user,password);

其中pubs为所要连接的SQL Server 2000的数据库的名字。

### 3.连接MySQL的驱动程序

String url="jdbc:mysql://localhost/testDB,user=soft,password=soft1234" Connection conn=DriverManager.getConnection(url);

其中testDB为所要连接的MySQL的数据库的名字。

### 4.连接DB2的驱动程序

String url="jdbc:db2://localhost:5000/databasename";

String user="admin";

String password="";

Connection conn=DriverManager.getConnection(url,user,password);

其中databasename为所要连接的DB2的数据库的名字。

### 5.连接Informix的驱动程序

String url ="jdbc:informix-sqli://127.0.0.1:1533/testDB:INFORMIXSERVER=myserver;

user=testuser;password=testpassword";

Connection conn= DriverManager.getConnection(url);

其中testDB为所要连接的Informix的数据库的名字。

### 6.连接Sybase的驱动程序：

String url =" jdbc:sybase:Tds:localhost:5007/testDB";

Properties sysProps = System.getProperties();

SysProps.put("user","userid");

SysProps.put("password","user_password");

Connection conn= DriverManager.getConnection(url, SysProps);

其中testDB为所要连接的Sybase的数据库的名字。

## 在JSP中使用JDBC

在如今的JSP开发中，已经很少直接在JSP页面中写入大量的逻辑代码，而是把访问数据的代码放在JavaBean 或者Servlet中执行。这样，不仅页面容易维护，而且代码也能得到很好的重用。下面来看看怎么在JavaBean中操作数据库。在下面的例子中，JavaBean对数据库执行两个典型的操作，一个是查询，另一个是更新。相信大家理解了这两个操作，其它数据库的操作也是能编写的。

操作数据库的JavaBean如下代码所示。

1. package com.jspdev.ch12;

2. import java.sql.*;

3. public class ContactBean

4. {

5. private Connection con;

6. //初始化连接。

7. public ContactBean()

8. {

9. String CLASSFORNAME="com.microsoft.jdbc.sqlserver.SQLServerDriver";

10. String SERVANDDB="jdbc:microsoft:sqlserver://127.0.0.1:1433;DatabaseName=jspdev";

11. String USER="bn";

12. String PWD="bn";

13. try

14. {

15. Class.forName(CLASSFORNAME);

16. con = DriverManager.getConnection(SERVANDDB, USER, PWD);

17. }

18. catch(Exception e)

19. {

20. e.printStackTrace();

21. }

22. }

23. //在数据库中添加信息

24. public void addContact()throws Exception

25. {

26. try

27. {

28. PreparedStatement pstmt=con.prepareStatement("insert into Contact values(?, ?, ?, ?, ?, ?)");

29. pstmt.setString(1, "hellking");

30. pstmt.setInt(2, 136234234);

31. pstmt.setString(3, "010455554");

32. pstmt.setString(4, "lxh@some.com");

33. pstmt.setDate(5, new java.sql.Date(new java.util.Date().getTime()));

34. pstmt.setString(6, "other email:ddd@d.com");

35. pstmt.execute();

36. // con.close();

37. catch(Exception e)

38. {

39. e.printStackTrace();

40. throw e;

41. }

42. }

43. //查询数据库

44. public ResultSet getContact(String userName)

45. {

46. try

47. {

48. Statement stm=con.createStatement();

49. ResultSet result=stm.executeQuery("select * from contact where userName='"+userName+"'");

50. return result;

51. }

52. catch(Exception e)

53. {

54. }

55. return null;

56. }

57. }

可以看到JavaBean中操作数据库和在JSP中操作数据库基本上一样。不同的是JavaBean只负责执行数据库操作，不关心显示方面的逻辑。这样就有效地实现了显示和业务逻辑的分享。下面来看看怎么在JSP页面中使用这个JavaBean，如下面的程序所示。

1. <%@ page contentType="text/html; charset=gb2312" language="java" import="java.sql.*, java.io.*"%>

2. <jsp:useBean id="contact" class="com.jspdev.ch12.ContactBean" scope="page"/>

3. <html>

4. <body>

5. 使用JavaBean来操作数据库：<hr>

6. <table border=1>

7. <tr><td>姓名</td><td>手机</td><td>电话</td><td>email</td><td>最后的联系时间</td><td>备注</td></tr>

8. <%

9. Try

10. {

11. contact.addContact();

12. ResultSet rst=contact.getContact("hellking");

13. while(rst.next())

14. {

15. out.println("<tr>");

16. out.println("<td>"+rst.getString("userName")+"</td>");

17. out.println("<td>"+rst.getInt("mobile")+"</td>");

18. out.println("<td>"+rst.getString("phone")+"</td>");

19. out.println("<td>"+rst.getString("mail")+"</td>");

20. out.println("<td>"+rst.getDate("lastcontact")+"</td>");

21. out.println("<td>"+rst.getString("mem")+"</td>");

22. out.println("</tr>");

23. }

24. rst.close();

25. }

26. catch(Exception e)

27. {

28. }

29. %>

30. </table>

31. </body>

32. </html>

关于在JSP中怎么使用JavaBean的问题已经介绍过。这里关心的是怎么让JSP和JavaBean进行交互。对于不返回结果的操作，直接调用Bean的方法即可，如：

Contact.addContact();

对于返回结果的调用，可以在调用的时候同时返回结果，如：

ResultSet rst=contact.getContact(“hellking”);

## 在Servlet中使用JDBC

既然能够在JSP和JavaBean中访问数据库，那么在Servlet中访问数据库也同样很简单。在这一节，仍然依照前面的例子，在Servlet中执行两种操作：一种是查询，另一种是删除一条记录。下面来看怎么在Servlet中使用JDBC操作数据库，如下程序所示。

1. package com.jspdev.ch12;

2. import javax.servlet.*;

3. import javax.servlet.http.*;

4. import com.microsoft.jdbc.sqlserver.SQLServerDriver;

5. import java.sql.*;

6. import java.util.*;

7. import java.io.*;

8. public class ContactServlet extends HttpServlet

9. {

10. Connection con;

11. public void doGet(HttpServletRequest request,

12. HttpServletResponse response

13. throws IOException, ServletException

14. {

15. request.setCharacterEncoding("gb2312");

16. response.setContentType("text/html;charset=gb2312");

17. PrintWriter out = response.getWriter( String action=(String)request.getParameter("action")

18. String userName=(String)request.getParameter("userName")

19. if(action.equals("delete"))

20. {

21. Try

22. {

23. deleteContact(userName);

24. out.println("成功删除！"+userName);

25. }

26. catch(Exception e)

27. {

28. out.println("删除失败或者没有这个信息："+userName);

29. }

30. }

31. else

32. {

33. ResultSet rst=getContact(userName);

34. out.println("<table border=1><tr><td>姓名</td><td>手机</td><td>电话</td><td>email</td><td>最后的联系时间</td><td>备注</td></tr>");

35. Try

36. {

37. while(rst.next())

38. {

39. out.println("<tr>");

40. out.println("<td>"+rst.getString("userName")+"</td>"); out.println("<td>"+rst.getInt("mobile")+"</td>"); out.println("<td>"+rst.getString("phone")+"</td>"); out.println("<td>"+rst.getString("mail")+"</td>"); out.println("<td>"+rst.getDate("lastcontact")+"</td>");

41. out.println("<td>"+rst.getString("mem")+"</td>");out.println("</tr>"

42. }

43. out.println("</table>");

44. rst.close();}

45. catch(Exception e)

46. {

47. }

48.

49. }

50.

51. }

52. public void doPost(HttpServletRequest requ

53. HttpServletResponse response)

54. throws IOException, ServletException

55. {

56. doGet(request, response);

57. }

58.

59. //创建一个Connection对象, 用于执行数据库操作。

60. public ContactServlet()

61. {

62. String CLASSFORNAME="com.microsoft.jdbc.sqlserver.SQLServerDriver";

63. String SERVANDDB="jdbc:microsoft:sqlserver://127.0.0.1:1433;DatabaseName=jspdev";

64. String USER="bn";

65. String PWD="bn";

66. Try

67. Class.forName(CLASSFORNAME);

68. con = DriverManager.getConnection(SERVANDDB, USER, PWD);

69. }

70. catch(Exception e)

71. {

72. e.printStackTrace();

73. }

74. }

75.

76. //在数据库中添加信息

77. public void deleteContact(String userName)throws Exception

78. {

79. try

80. {

81. Statement stmt=con.createStatement()

82. stmt.execute("delete from contact where userName='"+userName+"'");

83. stmt.close();

84. }

85. catch(Exception e)

86. {

87. e.printStackTrace();

88. throw e;

89. }

90. }

91. //查询数据库

92. public ResultSet getContact(String userName)

93. {

94. try

95. Statement stm=con.createStatement();

96. ResultSet result=stm.executeQuery("select * from contact where userName='"+userName+"'");

97. return result;

98. }

99. catch(Exception e)

100. {

101. }

102. return null;

103. }

104. }