JDBC目标•深刻理解JDBC的概念及JDBCAPI主要内容•熟练掌握JDBC应用程序开发流程•熟练掌握应用JDBC实现数据库记录的插入、删除和修改操作•熟练掌握应用JDBC查询数据库记录JDBC基础JDBC概述–在两层模型中,Javaapplet或应用程序将直接与数据库进行对话图13.1JDBC数据库访问两层模型–在三层模型中,命令先是被发送到服务的“中间层”,然后由它将SQL语句发送给数据库JDBC数据库访问三层模型使用JDBC与数据库建立连接–JDBC是一种底层API,它可以直接调用SQL语句,也是构造高级API和数据库开发工具的基础。JDBC2.0中的类和接口包括如表11.1所示表11.1JDBC2.0类和接口类/接口名类/接口功能java.sql.Connection完成对某一个指定数据库的连接功能java.sql.Statement在一个给定的连接中作为SQL语句执行的容器java.sql.PreparedStatement用于执行预编译的SQL语句java.sql.CallableStatement用于返回执行数据库中存储过程调用java.sql.ResultSet查询语句返回的结果集•DriverManager类–DriverManager类是JDBC的管理层,作用于用户和驱动程序之间。它跟踪可用的驱动程序,并在数据库和相应驱动程序之间建立连接。使用JDBC-ODBC桥驱动程序建立连接的语句如下:Class.forName(sun.jdbc.odbc.JdbcOdbcDriver);Stringurl=jdbc:odbc:happychat;DriverManager.getConnection(url,sa,);•Connection类–Connection对象代表与数据库的连接。连接过程包括所执行的SQL语句和在该连接上所返回的结果。一个应用程序可与单个数据库有一个或多个连接,也可以与多个数据库有连接•下面的语句打开一个与位于URLjdbc:odbc:happychat的数据库的连接。所用的用户标识符为sa,口令为。Stringurl=jdbc:odbc:happychat;Connectionconn=DriverManager.getConnection(url,sa,);•Statement类–Statement接口提供了三种执行SQL语句的方法:executeQuery、executeUpdate和execute,使用哪一个方法由SQL语句所产生的内容决定。•方法executeQuery用于产生单个结果集的语句,例如SELECT语句。•方法executeUpdate用于执行INSERT、UPDATE或DELETE语句以及SQLDDL(数据定义语言)语句。–例如CREATETABLE和DROPTABLE。INSERT、UPDATE或DELETE语句的效果是修改表中零行或多行中的一列或多列。executeUpdate的返回值是一个整数,指示受影响的行数(即更新计数)。对于CREATETABLE或DROPTABLE等不操作行的语句,executeUpdate的返回值总为零。•方法execute用于执行返回多个结果集、多个更新计数或二者组合的语句•ResultSet类用于获得查询结果•ResultSet.next方法用于移动到ResultSet中的下一行,使下一行成为当前行。结果集一般是一个表,其中有查询所返回的列标题及相应的值。执行SQL语句并输出结果集的语句如下:Statementstmt=conn.createStatement();ResultSetrs=stmt.executeQuery(SELECTu_name,u_passFROMusers);while(rs.next()){//打印当前行的值。Stringname=r.getString(u_name);Stringpass=r.getString(u_pass);System.out.println(name++pass);}数据库操作过程•加载驱动程序•通过DriverManager得到一个与数据库连接的句柄•通过连接句柄绑定要执行的语句•接收执行结果•可选的对结果的处理•关闭数据库连接SQLServer2000DriverForJDBC驱动程序–MicrosoftSQLServer2000DriverforJDBC是一种用以面向企业级Java环境提供具备高度可伸缩性与可靠性连通能力的Type4JDBC驱动程序。这种驱动程序为JDBC提供了通过具备Java支持能力的applet、应用程序或应用服务器访问SQLServer2000的能力。现在,Java开发人员可以利用这种能够通过Internet与企业内部网络提供高性能点对点n层SQLServer2000访问能力的驱动程序来充分享受SQLServer2000所提供的丰富功能与强壮特性。•获得程序–从微软的网站上下载驱动程序:SQLServer2000ForJDBC驱动程序,然后将它安装好。(比如安装目录是D:\SQLDriverForJDBC。)•配置环境–修改环境变量中的CLASSPATH,把SQLServer2000ForJDBC驱动程序安装目录下的如下目录追加到CLASSPATH中去。D:\SQLDriverForJDBC\lib\msbase.jar;D:\SQLDriverForJDBC\lib\mssqlserver.jar;D:\SQLDriverForJDBC\msutil.jar;•一旦SQLServer2000DriverForJDBC驱动程序安装配置好,即可用于SQLServer2000的数据库访问。JDBC的查询发送机制Statement接口–Statement接口用于执行不带参数的简单SQL语句。ReparedStatement接口和Callablestatement接口都是继承了Statement接口。–创建一个Statement类的实例的方法很简单,只需调用类Connection中的方法createStatement()就可以了。一般形式如下:Connectioncon=DriverManager.getConnection(URL,user,password)Statementsm=con.createStatement();–创建了Statement类的实例后,可调用其中的方法执行SQL语句,JDBC中提供了三种执行方法,它们是execute(),executeQuery(),executeUpdate()PreparedStatement接口–PreparedStatement类是Statement类的子类,它直接继承并重载了Statement的方法,PrepardStatement类有两大特点:•一个PreparedStatement的对象中包含的SQL语句是预编译的,因此当需要多次执行同一条SQL语句时,利用PreparedStatement传送这条SQL语句可以大大应用扩展执行效率。•PreparedStatement的对象所包含的SQL语句中允许有一个或多个输入参数–创建PreparedStatement对象•创建一个PreparedStatement类的对象也只需在建立连接后,调用Connection类中的方法prepareStatement()创建一个PreparedStatement的对象,其中包含一条带参数的SQL语句。一般形式如下:PreparedStatementpsm=con.prepareStatement(INSERTINTOusers(u_name,u_pass)VALUES(?,?));–输入参数的赋值•对上例,如果将第一个参数设为‘zhao’,第二个参数设为‘zhao0212’,就会在“users”表中插入的记录一条新的记录,实现该功能的语句为:psm.setString(1,“zhao”);psm.setString(2,“zhao0212”);应用实例建立数据库•Users表:保存用户注册信息。包括用户名(U_Name)、用户密码(U_Pass)、性别(U_Gender)、年龄(U_Age)和电子邮件地址(U_Email)。•History表:保存用户聊天信息。包括聊天编号(H_No)、聊天用户(H_User)、聊天时间(H_Time)和聊天内容(U_Content)创建数据库和表的脚本如下:CREATEDATABASEHappyChatGOUSEHappyChatCREATETABLEusers(U_NameVARCHAR(16)PRIMARYKEY,U_PassVARCHAR(16)NOTNULL,U_GenderCHAR(2)NOTNULL,U_AgeINTNOTNULL,U_EmailVARCHAR(20)NOTNULL)CREATETABLEhistory(H_NoINTIDENTITY(1,1),H_UserVARCHAR(16)NOTNULL,H_TimeDATETIMENOTNULL,U_ContentVARCHAR(60))CREATEPROCdelRecord@nameCHAR(16)ASDELETEFROMUsersWHEREU_name=@name插入、修改和删除操作JDBC插入、修改和删除数据库数据//JDBC插入、修改和删除演示程序importjavax.swing.*;importjava.awt.*;importjava.awt.event.*;importjava.io.*;importjava.sql.*;publicclassJdbcModifyDemoextendsJFrameimplementsActionListener{JPanelpnlMain;JLabellblName,lblPass;JTextFieldtxtName,txtPass;JButtonbtnInsert,btnSave,btnUpdate,btnDelete;publicJdbcModifyDemo(){super(JDBC插入、修改和删除演示);pnlMain=newJPanel();lblName=newJLabel(用户名:)lblPass=newJLabel(密码:);txtName=newJTextField(16);txtPass=newJTextField(16);btnInsert=newJButton(插入);btnInsert.addActionListener(this);btnSave=newJButton(保存);btnSave.setEnabled(false);btnSave.addActionListener(this);btnUpdate=newJButton(修改);btnUpdate.addActionListener(this);btnDelete=newJButton(删除);btnDelete.addActionListener(this);pnlMain.add(lblName);pnlMain.add(txtName);pnlMain.add(lblPass);pnlMain.add(txtPass);pnlMain.add(btnInsert);pnlMain.add(btnSave);pnlMain.add(btnUpdate);pnlMain.add(btnDelete);setContentPane(pnlMain);setSize(250,150);setVisible(true);}publicvoidactionPerformed(ActionEventae){if(ae.getSource()==btnInsert)initComponent();if(ae.getSource()==btnSave)saveRecord();if(ae.getSource()==btnUpdate)updateRecord(