第4章 教案.doc_第1页
第4章 教案.doc_第2页
第4章 教案.doc_第3页
第4章 教案.doc_第4页
第4章 教案.doc_第5页
已阅读5页,还剩13页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

复习大案例的图形用户界面的实现导入新课大案例在工作中会产生大量的数据,例如注册用户信息、好友信息、聊天记录等,而且在工作中需要经常的对这些数据进行读写。存储、管理这些数据目前最合理的方式就是利用数据库来进行,利用数据库管理进行数据的存储及快速检索。新授第4章 任务三:实现大案例的数据库操作(1)重点 理解大案例的数据库的结构 理解JDBC的概念及结构体系 JDBC驱动的类型及使用 使用JDBC实现数据库的基本操作 使用JDBC实现大案例的数据库操作4.1 子任务1:创建大案例的数据库大案例E-R图如图所示。1、userinfo表表名userinfo(用户信息)列名数据类型(精度范围)空/非空约束条件说明usernamevarchar(50)非空PK用户名passwordvarchar(50)非空密码namevarchar(50)空真实姓名sexchar(2)空性别ageint空年龄birthanimalchar(2)空生肖bloodtypevarchar(2)空血型department_IDchar(2)空FK系编号2、friend表表名friend(好友信息表)列名数据类型(精度范围)空/非空约束条件说明username varchar(50)非空FK,PK用户名Friend_username varchar(50)非空FK,PK好友用户名3、department表表名department(系信息表)列名数据类型(精度范围)空/非空约束条件说明department_ID char(2)非空PK系编号department_name varchar(50)非空系名称4、message表表名message(聊天消息表)列名数据类型(精度范围)空/非空约束条件说明message_IDint非空PK消息编号send_usernamevarchar(50)非空FK发送用户名receive_usernamevarchar(50)非空FK接收用户名messagetext非空消息内容timedatetime非空发送时间isofflinebit非空是否为离线消息5、online_username表表名Online_usernama(在线用户信息表)列名数据类型(精度范围)空/非空约束条件说明IDint非空PK在线用户编号usernamevarchar(50)非空FK用户名IPvarchar(50)非空IP地址portint非空端口4.2 子任务2:理解Java与数据库的连接方法4.2.1 JDBCJDBC(Java DataBase Connectivity,java数据库连接)是一种用于执行SQL语句的Java API,可以为多种关系数据库提供统一访问,它由一组用Java语言编写的类和接口组成。JDBC为数据库开发人员提供了一系列标准的API,据此可以构建更高级的工具和接口,使数据库开发人员能够用纯Java API来编写数据库应用程序。4.2.2 JDBC的驱动程序SUN定义的四种JDBC驱动程序标准:1、type 1:jdbc-odbc桥2、type 2:本地api驱动(Java to native API)3、type 3:网络协议驱动(Java to net)4、type 4:本地协议驱动(Java to native database)目前,实际开发中主要根据具体应用选用3、4两种JDBC驱动类型。4.3 子任务3:JDBC驱动程序的安装及配置4.3.1 MS SQLServer2008中需要进行的设置为了保证Java能够通过JDBC实现对数据库的正常访问,需要确认已进行了下列操作。1、设置身份验证模式将“服务器身份验证”一项将 “SQL Server和Windows身份验证模式(S)”设置为选中状态。2、设置登陆名3、配置服务端口SQL SERVER 2008的连接端口并不是静态绑定于某个端口上的,采用的是动态端口的机制。因此在实际开发中使用该数据库时一定要禁用其默认的动态端口机制,将其绑定在某个端口上。4、确认SQL Server服务已经打开4.3.2 驱动程序的下载及安装下载网址为:/downloads/details.aspx?FamilyID=99b21b65-e98f-4a61-b811-19912601fdc9&displaylang=zh-cn。4.3.3 在JBuilder中配置数据库驱动程序1、在ToolsConfigureLibraries菜单项中进行设置:将驱动程序添加进JBuilder的类库。2、在ProjectDefault Project Properties菜单项中进行设置:将驱动程序设置为JBuilder默认项目中所需的类库。3、在EnterpriseEnterprise Setup菜单项中进行设置:将驱动程序添加到可用的数据库驱动程序中。重新启动JBuilder后完成Microsoft SQL Server JDBC Driver 2.0驱动程序的配置,下面我们就可以利用JDBC来操作SQL Server 2008数据库了。图4-21 Enterprise Setup对话框图4-22 选择类库图4-23 实现数据库驱动类库的添加4、设置JDBC驱动使其在JBuilder的数据库组件中可用点击ToolsDatabasePilot,打开对话框如图4-24所示。注意:SQL Server2008的JDBC驱动程序类名及URL格式等与SQL Server2005、SQL Server2000等相似但有所区别。以访问本书大案例的位于本机的campuscommunications数据库为例:SQL Server2008(设置使用1433端口访问): 驱动程序类名:com.microsoft.sqlserver.jdbc.SQLServerDriver URL:jdbc:sqlserver:/:1433;DatabaseName=campuscommunicationsSQL Server2005、SQL Server2000: 驱动程序类名:com.microsoft.jdbc.sqlserver.SQLServerDriver URL:jdbc:microsoft:sqlserver:/:1433;DatabaseName= campuscommunications4.4 子任务4:掌握JDBC的基本使用4.4.1 JDBC的几个核心类1、Driver接口加载MS SQL Server 2008的JDBC驱动:Class.forName(“com.microsoft.sqlserver.jdbc.SQLServerDriver”);加载JDBC-ODBC桥驱动程序:Class.forName(“sun.jdbc.odbc.JdbcOdbcDriver”);每个JDBC驱动程序类在加载时都会执行一个静态的初始化过程,将自己注册到JDBC的DriverManager中去。这样JDBC就可以知道这一驱动程序并可以调用它。2、DriverManager其最常用的方法只有如下一个:public static Connection getConnection(String url,String user,String password)3、ConnectionConnection表示应用程序与URL指定的数据库管理系统之间的连接。Statement createStatement():创建一个Statement对象用来将SQL语句发送到数据库。Statement createStatement(int resultSetType,int resultSetConcurrency):创建一个 Statement 对象,该对象将生成具有给定类型和并发性的ResultSet对象。4、StatementStatement对象用于将SQL语句发送到数据库中。最常用的方法如下:ResultSet executeQuery(String sql):用于提交查询语句(Select语句),返回ResultSet对象。int executeUpdate(String sql):用于提交更新语句(Update、Delete、Insert等语句)或者不返回任何内容的SQL语句(如SQL DDL语句)。返回值表示INSERT、UPDATE 或 DELETE 语句的行计数;如果sql为不返回任何内容的SQL语句,则返回值为0。5、ResultSetResultSet对象中包含符合查询SQL语句条件的所有行,并且通过get方法实现对这些行中数据的访问。对于每一种数据类型都有对应的getXXX方法。boolean next():将指针从当前位置下移一行。4.4.2 利用JDBC连接数据库的步骤在JBuilder中配置好相应的数据库驱动程序后,进行数据库的连接及操作一般需要以下步骤:1、导入相应的包import java.sql.*;2、定义相关的成员变量Connection con=null; /定义Connection对象Statement st=null; /定义Statement对象ResultSet rs=null; /定义ResultSet对象(只有进行查询时需要)3、加载JDBC驱动程序try Class.forName(com.microsoft.sqlserver.jdbc.SQLServerDriver);catch (ClassNotFoundException ex) System.out.println(加载JDBC驱动程序出错);4、建立Connection对象/要连接的数据库的URL,格式为:/jdbc:sqlserver:/服务器IP地址:访问端口;DatabaseName=数据库的名字String url=jdbc:sqlserver:/:1433;DatabaseName=CampusCommunications;/登陆要连接的数据库的用户名和密码,此处假设使用的用户名为sa,密码为空String username=sa;String pa=;try con = DriverManager.getConnection(url, username, pa);catch (SQLException ex1) System.out.println(建立Connection对象出错);5、建立Statement对象try st = con.createStatement();catch (SQLException ex2) System.out.println(建立Statement对象出错);6、执行相应的SQL语句(1)从数据库的表中查询满足一定条件的记录例如,实现如下功能:从CampusCommunications数据库的userinfo表中查出所有属相(birthanimal)为牛的用户的用户名(username)、姓名(name)、年龄(age)。并将所查到的记录逐条显示出来。try rs = st.executeQuery(select username,name,age from userinfo where birthanimal=牛);catch (SQLException ex3) System.out.println(执行查询操作时出错);/处理所得到的结果集try while (rs.next() System.out.println(rs.getString(username)+ +rs.getString(name)+ +rs.getInt(age); catch (SQLException ex5) System.out.println(处理结果集时出错);(2)向数据库的表中插入一条记录例如,实现如下功能:向CampusCommunications数据库的userinfo表中插入一条记录,用户名(username)为spring、密码(password)为123,其它列的数据为默认。try st.executeUpdate(insert into userinfo(username,password)values(spring,123);catch (SQLException ex3) System.out.println(执行插入操作时出错);(3)从数据库的表中删除一条记录例如,实现如下功能:从CampusCommunications数据库的userinfo表中删除用户名(username)为spring的记录。try st.executeUpdate(delete from userinfo where username=spring);catch (SQLException ex3) System.out.println(执行删除操作时出错);7、关闭对象try rs.close(); st.close(); con.close();catch (SQLException ex4) System.out.println(关闭对象时出错);注意:当生成ResultSet对象的Statement对象关闭、重新执行或用来从多个结果的序列检索下一个结果时,该Statement对象会自动关闭ResultSet对象。4.4.3 使用JDBC-ODBC桥连接数据库的步骤1、配置ODBC数据源2、使用JDBC-ODBC桥连接数据库和通过JDBC驱动程序来连接数据库相比,通过JDBC-ODBC桥来连接数据库来连接数据库只有驱动程序类名及数据库的URL格式不同,其余步骤完全相同。(1)加载JDBC-ODBC驱动程序try Class.forName(sun.jdbc.odbc.JdbcOdbcDriver);catch (ClassNotFoundException ex) System.out.println(加载JDBC-ODBC驱动程序出错);(2)建立Connection对象/数据源格式为:jdbc:odbc:ODBC数据源名字String url=jdbc:odbc:campuscommunications;String username=sdsoft;String pa=fsywrxwang;try con = DriverManager.getConnection(url, username, pa);catch (SQLException ex1) System.out.println(建立Connection对象出错);4.5 子任务5:模拟实现大案例的数据库操作假设客户端直接访问数据库,来模拟大案例将要进行的数据库操作。4.5.1 注册功能的实现1、功能要求根据userinfo表的结构,新注册用户需要提供用户名(username)、密码(password)、姓名(name)、性别(sex)、年龄(age)、属相(birthanimal)、血型(bloodtype)、系编号(department_ID)等信息。其中,用户名、密码不能为空,其它信息如果用户不输入,则采用默认值。2、图形用户界面设计3、数据库事务处理点击“注册”按钮后,获取用户输入的信息,信息检查无误后将信息保存至数据库中完成注册。关键代码如下: /数据库操作 /声明对象 Connection con=null; Statement st=null; ResultSet rs=null; /加载驱动程序 try Class.forName(com.microsoft.sqlserver.jdbc.SQLServerDriver); catch (ClassNotFoundException ex) JOptionPane.showMessageDialog(this,加载JDBC驱动程序出错); System.out.println(); /创建与数据库的连接,此处登陆数据库使用用户名“sa”,假设其密码为空 String url=jdbc:sqlserver:/:1433;DatabaseName=campuscommunications; String dbusername=sa; String pa=; try con = DriverManager.getConnection(url, dbusername, pa); catch (SQLException ex1) JOptionPane.showMessageDialog(this,建立Connection对象出错); /创建Statement对象 try st = con.createStatement(); catch (SQLException ex2) JOptionPane.showMessageDialog(this,建立Statement对象出错); /查询用户输入的用户名是否重名 try rs = st.executeQuery(select* from userinfo where username=+username+); if(rs.next() JOptionPane.showMessageDialog(this,用户名重复,请重新输入用户名!); return; catch (SQLException ex3) JOptionPane.showMessageDialog(this,查询重名时出错); /查询系编号(department_ID) String department_ID=; try rs = st.executeQuery(select * from department where department_name=+department_name+); if(rs.next() department_ID=rs.getString(department_ID); catch (SQLException ex3) JOptionPane.showMessageDialog(this,查找系编号时出错); /将用户注册信息存入数据库 try String sql=insert into userinfo(username,password,name,sex,age,birthanimal,bloodtype,department_ID)values(+username+,+password+,+name+,+sex+,+age+,+birthAnimal+,+bloodType+,+department_ID+); st.executeUpdate(sql); JOptionPane.showMessageDialog(this,恭喜你,注册成功!); catch (SQLException ex3) ex3.printStackTrace(); JOptionPane.showMessageDialog(this,执行插入操作时出错,注册失败); 4.5.2 登陆及聊天等功能的实现1、功能要求登陆:输入用户名、密码连接数据库进行检验,若正确,则进入聊天界面,否则提示用户名或者密码错误。进入聊天界面后从数据库获得好友列表并显示。聊天:选择某位好友发送消息,系统将该消息记录到数据库中。添加好友:在添加好友对话框中直接输入用户名添加好友,从数据库中检验该用户存在,则将该用户添加为好友。删除好友:从好友列表中选择某位好友删除,则在数据库中将该用户从好友列表中删除。查看聊天记录:选择某位好友选择查看,则显示当前用户与该好友间的所有聊天记录。2、图形用户界面设计3、创建工程4、通用的数据库连接类DBClass本项目中有多处需要连接数据库进行访问,所以我们设计一个通用的数据库连接类来实现数据库的连接功能,供需要的时候调用。在clientDB项目下新建一个类,类名为DBClass,类的代码如下:import java.sql.*;public class DBClass public static Connection getConnection() throws Exception Connection con=null; Class.forName(com.microsoft.sqlserver.jdbc.SQLServerDriver); String url=jdbc:sqlserver:/:1433;DatabaseName=campuscommunications; String username=sa; String pa=; con = DriverManager.getConnection(url, username, pa); return con; 则工程中需要连接数据库的时候只要通过类名DBClass直接调用静态方法getConnection()即可。5、LoginFrame中登陆功能的实现“登陆”按钮的事件处理代码如下:/获取用户名、密码String username=jTextField1.getText().trim();String password=new String(jPasswordField1.getPassword().trim();/判断用户名密码是否为空if(username.equals()|password.equals() JOptionPane.showMessageDialog(this,请输入用户名及密码!); return;/声明数据库对象Connection con=null;Statement st=null;ResultSet rs=null;/连接数据库try con = DBClass.getConnection();catch (Exception ex) JOptionPane.showMessageDialog(this,连接数据库错误!);try st = con.createStatement();catch (SQLException ex2) JOptionPane.showMessageDialog(this,建立Statement对象出错);try rs = st.executeQuery(select * from userinfo where username=+username+ and password=+password+);catch (SQLException ex3) JOptionPane.showMessageDialog(this,执行查询操作时出错);/如果用户名、密码无误,则登陆到MainFrame。注意,需要从LoginFrame将username/传递到MainFrametry if (rs.next() MainFrame f = new MainFrame(username); f.setVisible(true); this.dispose(); else JOptionPane.showMessageDialog(this,用户名或者密码错误!); catch (SQLException ex1) JOptionPane.showMessageDialog(this,读取数据库错误!);try rs.close(); st.close(); con.close();catch (SQLException ex4) JOptionPane.showMessageDialog(this,关闭数据库对象错误!);6、MainFrame中好友列表的显示try con = DBClass.getConnection();catch (Exception ex) JOptionPane.showMessageDialog(this,连接数据库错误!);try st = con.createStatement();catch (SQLException ex2) JOptionPane.showMessageDialog(this,建立Statement对象出错);try rs = st.executeQuery(select * from friend where username=+username+);catch (SQLException ex3) JOptionPane.showMessageDialog(this,执行查询操作时出错);/将登陆用户的好友逐个添加到v中try while(rs.next() v.add(rs.getString(friend_username); catch (SQLException ex1) JOptionPane.showMessageDialog(this,读取数据库错误!);/设置在jList1中显示vjList1.setListData(v);try rs.close(); st.close(); con.close();catch (SQLException ex4) JOptionPane.showMessageDialog(this,关闭数据库对象错误!);7、ChatPanel中聊天功能的实现(1)“发送”按钮的事件处理代码/从主界面的好友列表中获取接收消息的好友名String receive_username=f.jList1.getSelectedValue().toString();String message=jTextArea2.getText();/将聊天消息显示在文本区jTextArea1.append(to +receive_username+:+message+n);/连接数据库try con = DBClass.getConnection();catch (Exception ex) JOptionPane.showMessageDialog(this,连接数据库错误!);try st = con.createStatement();catch (SQLException ex2) JOptionPane.showMessageDialog(this,建立Statement对象出错);/使用自定义的方法获取时间字符串String time=getTime();/将聊天消息保存到数据库的message表try st.executeUpdate(insert into message(send_username,receive_username,message,time,isoffline) values(+username+,+receive_username+,+message+,+time+,+0+);catch (SQLException ex3) JOptionPane.showMessageDialog(this,保存消息时出错);try st.close(); con.close();catch (SQLException ex4) JOptionPane.showMessageDialog(this,关闭数据库对象错误!);jTextArea2.setText();/返回“年-月-日 时:分:秒”格式的日期字符串public String getTime() Calendar c=Calendar.getInstance(TimeZone.getTimeZone(asia/shanghai); int year=c.get(Calendar.YEAR); int month=c.get(Calendar.MONTH)+1; int day=c.get(Calendar.DAY_OF_MONTH); int hour=c.get(Calendar.HOUR_OF_DAY); int minute=c.get(Calendar.MINUTE); int second=c.get(Calendar.SECOND); return year+-+month+-+day+ +hour+:+minute+:+second;8、AddFriendDialog的添加好友功能的实现(1)“确定”按钮的事件处理代码点击“确定”按钮时,将输入的好友名送至数据库进行查询,若该用户存在,则将该用户在数据库的friend表中加入当前登陆的用户的好友,并将用户名赋值给成员变量friend_usename;若不存在则进行提示。String fn=jTextField1.getText();/判断输入的用户名是否为空if(fn.equals() JOptionPane.showMessageDialog(this,请输入待添加的好友名); return;/判断输入的用户是否已经是当前用户的好友if(f.v.contains(fn) JOptionPane.showMessageDialog(this,该用户已经是您的好友!); return;try con = DBClass.getConnection();catch (Exception ex) JOptionPane.showMessageDialog(this,连接数据库错误!);try st = con.createStatement();catch (SQLException ex2) JOptionPane.showMessageDialog(this,建立Statement对象出错);/判断输入的用户名是否存在try rs = st.executeQuery(select * from userinfo where username=+fn+);catch (SQLException ex3) JOptionPane.showMessageDialog(this,执行查询操作时出错);try if (rs.next() st.executeUpdate(insert into friend(username,friend_username)values( + username + , + fn + ); this.friend_username=fn; else JOptionPane.showMessageDialog(this, 您要添加的好友不存在!); catch (SQLException ex1) JOptionPane.showMessageDialog(this,保存好友时出错);try rs.close(); st.close(); con.close();catch (SQLException ex4) JOptionPane.showMessageDialog(this,关闭数据库对象错误!);this.dispose();(2)MainFrame中调用添加好友功能因为MainFrame中通过菜单、标签等多种方式调用了添加好友功能,所以将添加好友的操作封装为一个方法如下:public void addFriend() AddFriendDialog afd=new AddFriendDialog(this,添加好友,true); afd.setSize(400,300); afd.setVisible(true); if(afd.friend_username!=null) v.add(afd.friend_username); jList1.setListData(v); this.show(); JOptionPane.showMessageDialog(this,已将+afd.friend_username+添加为好友); 则添加好友的菜单、标签等的事件处理代码只需为:addFriend();9、删除好友功能的实现删除好友功能直接在MainFrame中实现。同样,因为在MainFrame中也将在多处调用删除好友功能,所以也将删除好友的操作封装为一个方法如下:public void removeFriend() String friend_username = null; /判别是否已选择待删除的好友 try friend_username = jList1.getSelectedValue().toString(); catch (Exception ex) JOptionPane.showMessageDialog(this,请先从好友列表中选择待删除的好友); return; try con = DBClass.getConnection(); catch (Exception ex) JOptionPane.showMessageDialog(this,连接数据库错误!); try st = con.createStatement(); catch (SQLException ex2) JOptionPane.showMessageDialog(this,建立Statement对象出错); try st.executeUpdate(delete from friend where username=+username+ and friend_username=+friend_username+); catch (SQLException ex3) JOptionPane.showMessageDialog(this,删除好友时出错); try st.close(); con.close(); catch

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论