《第21章学生信息管理——三层结构数据库编程.ppt》由会员分享,可在线阅读,更多相关《第21章学生信息管理——三层结构数据库编程.ppt(83页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、第第2121章章 学生信息管理学生信息管理三层结构数据库编程三层结构数据库编程 能力目标:能力目标:能使用JDBC建立数据库连接,能编写Java代码连接数据库。能编写添加、修改、删除数据库记录的程序代码。理解表示层、业务逻辑层、数据层,理解三层结构的应用程序。能编写三层结构的学生信息管理应用程序,并能打包发布。内容介绍21.1 任务预览21.2 建立数据库21.3 连接数据库21.4 访问数据库21.5 三层结构应用程序概述21.6 三层结构学生信息管理程序21.7 打包发布程序21.8 本章小结21.9 实训21:实现三层结构学生信息管理程序21.1 任务预览 本章实训程序运行结果:21.2
2、 建立数据库 程序数据和代码往往是分离的。数据使用数据库存放,方便检索,持久保存,能按动态添加、修改和删除,并能共享。数据库管理系统(DBMS)。流行的关系型DBMS:SQL ServerAccessOracleMySQL等每种DBMS有版本之分,如SQL Server有2000、2005、2008等版本,还有企业版、开发版、速成版等。21.2.1 在DBMS上建立数据库 访问数据库之前先要建立数据库。使用DBMS创建数据库优点:操作直观界面友好互动性强关于如何在DBMS上建立数据库,不在本书叙述范围。21.2.2 运行SQL脚本建立数据库 以免费的SQL Server 2005 Expres
3、s Edition(速成版)为例,通过SQL脚本创建数据库。【例21-1】编写SQL脚本,建立学生数据库。数据库含有一个数据表,字段为:学号、姓名、性别、专业和年级。并使用脚本录入4条记录。USE masterGOif exists(select*from sysdatabases where name=Studb)drop database Studb GO CREATE DATABASE Studb GOUSE StudbCREATE TABLE Stus(Num char(8)PRIMARY KEY,Name nvarchar(4)NOT NULL,Sex nchar(1)NOT NUL
4、L,Specialty nvarchar(7)NULL,Year int NULL,CHECK(Sex=男 or Sex=女),CHECK(Year=2000 and Year=2020)or Year=0),)GOinsert into Stus(Num,Name,Sex,Specialty,Year)values(12010001,赵益,男,软件技术,2012)insert into Stus(Num,Name,Sex,Specialty,Year)values(12010002,钱珥,女,软件技术,2012)insert into Stus(Num,Name,Sex,Specialty,
5、Year)values(12010003,孙散,男,软件技术,2012)insert into Stus(Num,Name,Sex)values(12010004,李四,男)GO用记事本把脚本代码录入电脑,存盘为createstudb.sql。设计算机已安装速成版SQL Server 2005,打开命令行窗口,进入脚本文件目录。执行下面命令生成学生数据库Studb.mdf:sqlcmd-S.SQLExpress-E-i createstudb.sql 21.3 连接数据库连接数据库之前先要加载数据库驱动程序。通常是加载JDBC-ODBC桥驱动程序。代码如下:Class.forName(“sun
6、.jdbc.odbc.JdbcOdbcDriver”);JDBC类似于ODBC,是API软件包java.sql,含有多个类和接口,常用的:DriverDriverManagerConnectionStatementPreparedStatementResultSet21.3.1 JDBC与JDBC-ODBCJDBC 简介 Java使用JDBC(Java DataBase Connectivity)技术进行数据库的访问。使用JDBC技术进行数据库访问时,Java应用程序通过JDBC API和JDBC驱动程序管理器之间进行通信,例如Java应用程序可以通过JDBC API向JDBC驱动程序管理器发
7、送一个SQL查询语句。JDBC驱动程序管理器又可以以两种方式和最终的数据库进行通信:一种是使用JDBC/ODBC桥接驱动程序的间接方式;另一种是使用JDBC驱动程序的直接方式。JDBC简介JDBC是一种用于执行SQL语句的Java API,可以为多种关系数据库提供统一访问,它由一组用Java语言编写的类和接口组成。使用JDBC API,可以向各种关系数据发送SQL语句。目前比较常见的JDBC驱动程序可分为以下4个种类:JDBC-ODBC桥加ODBC驱动程序 本地API JDBC网络纯Java驱动程序 本地协议纯Java驱动程序 数据库Java应用程序JDBC驱动程序SQL命令结果使用JDBC/
8、ODBC桥接驱动程序 1.载入驱动程序 使用JDBC/ODBC桥接驱动程序,该驱动程序的名称为sun.jdbc.odbc.JdbcOdbc-Driver,使用下面的语句将载入JDBC/ODBC桥接驱动程序:2.建立连接 使用下面的语句建立一个和数据库的连接:java.sql包JDBC做三件事:与数据库建立连接与数据库建立连接、发送发送 SQL 语句语句并处理结果处理结果。JDBC API包括一个框架(来自java.sql包),凭借此框架可以动态地安装不同驱动程序来访问不同数据源、执行SQL语句、处理结果集或更新数据记录等。类或接口名称说明DriverManager此此类类用于加用于加载载和卸和
9、卸载载各种各种驱动驱动程序并建立程序并建立与数据与数据库库的的连连接接Connection此接口表示与数据的此接口表示与数据的连连接接Statement此接口用于此接口用于执执行行SQL语语句句PreparedStatement此接口用于此接口用于执执行行预编译预编译的的 SQL 语语句句 ResultSet此接口表示此接口表示查询查询出来的数据出来的数据库库数据数据结结果集果集SQLException此接口用于此接口用于检检索数据索数据库库提供的提供的错误错误消息和消息和错误错误代代码码使用JDBC API进行数据库操作步骤操作步骤1.导入JDBC API:首先利用import语句导入jav
10、a.sql包。2.装载驱动程序:针对不同DBMS,使用Class类的forName方法加载驱动程序类的支持。3.建立数据库连接:使用DriverManager类的getConnection方法,指明数据库或数据源的url,以及登录DBMS的用户名及口令,创建数据库连接对象(Connection接口对象)。4.创建JDBC Statements对象:使用已有的Connection数据库连接对象创建一个Statement对象,利用该对象把SQL语句执行适当的方法发送到DBMS。5.执行语句:对SELECT语句来说,使用executeQuery方法执行,返回结果是ResultSet类型的结果集:对I
11、NSERT、UPDATE、DELETE语句来说,使用executeUpdate方法执行,返回结果是影响的行数。6.处理结果:对返回的结果集或影响行数进行处理,可以进行显示、判断等操作。7.关闭资源:与各种对象创建的顺序相反,依次关闭ResultSet、Statement、Connection对象。访问数据库 配置ODBC数据源1.在控制面板中,打开管理工具数据源(ODBC),弹出“ODBC数据源管理器”对话框,点击“系统DSN”选项卡,如图所示。该对话框中列出若干已经配置好的针对不同DBMS的系统数据源。访问数据库配置ODBC数据源2.单击“添加”按钮,添加新的数据源,在打开的“创建新数据源”
12、对话框中,根据使用的DBMS类型选择要安装数据源的驱动程序,这里选择“SQL Server”,如图所示。访问数据库配置ODBC数据源3.单击“完成”按钮,打开“创建到SQL Server的新数据源”对话框,在数据源名称文本框中填写“data”,在服务器下拉框中选择要连接的数据库服务器名,这里选择“(local)”(表示连接本机的数据库),如图所示。访问数据库配置ODBC数据源4.单击“下一步”,默认选择“使用网络登录ID的Windows NT验证”,如图所示。继续“下一步”,选中“更改默认的数据库”复选框,然后在激活的下拉框中选择“pubs”数据库,如图所示。访问数据库配置ODBC数据源5.继
13、续“下一步”,单击“完成”按钮,弹出“ODBC Microsoft SQL Server安装”信息对话框,如图,可以单击“测试数据源”按钮进行连接测试,确认无误后,点击“确定”,即完成数据源的设置。21.3.3 通过数据源建立数据库连接 通过数据源StuDSN与学生库Studb建立连接:Connection con=DriverManager.getConnection(jdbc:odbc:StuDSN);DriverManager类建立连接的常用方法:(1)static Connection getConnection(String url):试图建立与URL形式的数据库连接。url串的语法
14、形式:jdbc:子协议:子名称其中,jdbc是协议名,子协议有odbc或mysql等,子名称有数据源名称等。(2)static Connection getConnection(String url,String user,String password):多了用户名和密码。21.3.4 Connection连接 Connection是接口类型,连接对象只能通过DriverManager类的getConnection方法建立。连接接口Connection的常用方法:(1)Statement createStatement():创建语句对象。(2)Statement createStatemen
15、t(int resultSetType,int resultSetConcurrency):创建语句对象,该对象将生成具有给定类型和并发性的ResultSet(结果集)对象。参数resultSetType是结果集类型,取自下面3个ResultSet静态常量:ResultSet.TYPE_FORWARD_ONLYResultSet.TYPE_SCROLL_INSENSITIVEResultSet.TYPE_SCROLL_SENSITIVE(3)PreparedStatement prepareStatement(String sql):创建预编译语句(对象)。(4)PreparedStateme
16、nt prepareStatement(String sql,int resultSetType,int resultSetConcurrency)。(5)void close():关闭连接,释放资源。(6)void setAutoCommit(boolean autoCommit):设置连接对象是否自动提交。(6)void commit():提交事务,实现数据更改。(7)void rollback():回滚事务。注:默认连接对象自动提交,执行每个语句都会自动提交更改。如果禁用自动提交,那么要提交更改就必须显式调用commit方法。21.4 访问数据库(1)建立数据库。(2)创建数据源。(3)
17、加载JDBC-ODBC桥驱动程序。(4)建立数据库连接。涉及DriverManager和Connection。(5)由连接创建语句对象。涉及Connection、Statement和PreparedStatement。(6)通过语句对象执行SQL语句。涉及Statement、PreparedStatement和ResultSet。(7)处理结果集。涉及ResultSet。(8)关闭结果集、语句和连接对象。涉及ResultSet、Statement、PreparedStatement和Connection。(9)捕获、处理异常。涉及SQLException等。21.4.1 数据库编程步骤【例21
18、-2】编写读取学生数据库Studb所有记录的Java程序。import java.sql.*;public class Example2 public static void main()try Class.forName(sun.jdbc.odbc.JdbcOdbcDriver);Connection conn=DriverManager.getConnection(jdbc:odbc:StuDSN);Statement stmt=conn.createStatement();/创建语句 ResultSet rs=stmt.executeQuery(select*from Stus);Sys
19、tem.out.println(=学号=姓名=性别=专业=年级=);while(rs.next()/循环输出结果集各行内容System.out.print(rs.getString(1)+t);/从1开始System.out.print(rs.getString(2)+t);System.out.print(rs.getString(3)+t);System.out.print(rs.getString(4)+t);System.out.println(rs.getInt(5);rs.close();catch(Exception e)21.4.2 Statement语句 Statement是
20、接口类型,只能通过连接对象createStatement方法创建语句对象。语句对象执行静态SQL语句,返回结果集或int等数据。Statement常用方法:(1)ResultSet executeQuery(String sql)。例如:Statement stmt=conn.createStatement();ResultSet rs=stmt.executeQuery(select*from Stus);(2)int executeUpdate(String sql):执行给定SQL更新语句。SQL更新语句一般是INSERT、UPDATE或DELETE等,返回更新的行数。(3)boolea
21、n execute(String sql)(4)void close():关闭语句。21.4.3 PreparedStatement预编译SQL语句 继承自Statement,也是接口类型。优点:预编译语句允许带参数,可以“动态”执行SQL语句。只需预先编译SQL语句一次,就可多次执行,效率高。PreparedStatement常用方法:(1)ResultSet executeQuery():预编译语句执行SQL查询,返回结果集。(2)int executeUpdate():执行SQL更新语句。(3)boolean execute():执行SQL语句。(4)void setString(int
22、 parameterIndex,String x):将SQL语句中指定索引处的参数设置为String类型的x值。SQL语句参数用“?”表示,索引从1开始。如带4个?参数:sql=update Stus set Name=?,Sex=?,Year=?where Num=?;prpstmt=conn.prepareStatement(sql);/创建预编译语句 prpstmt.setString(1,郑丽);/设置第1个参数值 prpstmt.setString(2,女);prpstmt.setInt(3,2011);prpstmt.setString(4,11010001);prpstmt.ex
23、ecuteUpdate();(5)void setInt(int parameterIndex,int x):索引处参数设为int值。(6)void setDouble(int parameterIndex,double x):索引处参数设置为double值。(7)void clearParameters():清除当前参数值。21.4.4 ResultSet结果集 ResultSet也是接口类型,只能通过执行语句或预编译语句的executeQuery等方法创建结果集对象。结果集与数据库表对应,由行(记录)、列(字段)组成。结果集自带行光标(游标)。最初,光标置于第一行之前。执行next方法光标
24、下移一行。没有下一行时返回false,于是可使用while语句循环读各行数据。结果集提供从当前行获取列值的方法,如getString(1)、getInt(5)或getString(Num)、getInt(Year),注:方法getXxx的列名参数不区分大小写,SQL语句也不区分大小写,但Java代码本身是严格区分大小写的。默认结果集对象不可更新,仅有一个向前移光标。创建语句对象时,可以给定参数,使之生成可滚动、可更新的结果集。ResultSet常用方法(1)boolean next():结果集光标下移一行。(2)boolean previous():结果集光标上移一行。(3)boolean f
25、irst():光标移到结果集第一行。(4)boolean last():光标移到结果集最后一行。(5)void afterLast():光标移动结果集最后一行之后。(6)void beforeFirst():光标移动到结果集第一行之前。(7)boolean absolute(int row):光标移到指定行号处。(8)String getString(int columnIndex):获取集当前行指定列索引的字符串型列值。列索引从1开始。例如:System.out.print(rs.getString(1)+t);(9)String getString(String columnLabel):
26、获取指定列名的字符串型列值。如:System.out.print(rs.getString(Num)+t);(10)int getInt(int columnIndex):获取当前行指定列索引的int值。(11)int getInt(String columnLabel):获取指定列名的int值。(12)double getDouble(int columnIndex)(13)double getDouble(String columnLabel)(14)boolean getBoolean(int columnIndex)(15)boolean getBoolean(String colum
27、nLabel)(16)void close():关闭结果集。(17)int getRow():获取当前行编号。行号从1开始。(18)boolean wasNull():判断最后读取的列值是否为Null(空)。【例21-3】编写插入、修改、删除学生记录的程序。public class Example3 public static void main()Connection conn=null;Statement stmt=null;Statement stmt2=null;PreparedStatement prpstmt=null;ResultSet rs=null;try Class.for
28、Name(sun.jdbc.odbc.JdbcOdbcDriver);conn=DriverManager.getConnection(jdbc:odbc:StuDSN);stmt=conn.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_UPDATABLE);rs=stmt.executeQuery(select*from Stus);System.out.println(数据库原来的内容:);System.out.println(=学号=姓名=性别=专业=年级=);while(rs.next()/循环输出结果
29、集各行内容 System.out.print(rs.getString(1)+t);/字段(列)号从1开始 System.out.print(rs.getString(2)+t);System.out.print(rs.getString(3)+t);System.out.print(rs.getString(4)+t);System.out.println(rs.getInt(5);/插入一条记录:String sql=insert into Stus(num,name,sex,specialty)+values(11010001,张三,男,网络技术);stmt2=conn.createSt
30、atement();/连接创建语句2stmt2.executeUpdate(sql);/语句2执行插入操作/更改记录:sql=update Stus set Name=?,Sex=?,Year=?where Num=?;prpstmt=conn.prepareStatement(sql);/创建预编译语句prpstmt.setString(1,郑丽);prpstmt.setString(2,女);prpstmt.setInt(3,2011);prpstmt.setString(4,11010001);prpstmt.executeUpdate();/更新记录/删除记录:sql=delete f
31、rom Stus where Num=?;prpstmt=conn.prepareStatement(sql);/创建预编译语句prpstmt.setString(1,12010004);prpstmt.executeUpdate();/执行预编译语句删除记录System.out.println(n更新后的内容:);System.out.println(=学号=姓名=性别=专业=年级=);rs.beforeFirst();while(rs.next()/循环输出结果集各行内容 System.out.print(rs.getString(1)+t);catch(Exception e)Syste
32、m.err.println(异常:+e);finally try if(rs!=null)rs.close();/关闭结果集 if(stmt!=null)stmt.close();/关闭语句 if(stmt2!=null)stmt2.close();/关闭语句2 if(prpstmt!=null)prpstmt.close();/关闭预编译语句 if(conn!=null)conn.close();/关闭连接 catch(SQLException se)JOptionPane.showMessageDialog();注:连接、语句、结果集关闭顺序和创建顺序刚好相反。三者之间的关系:结果集依赖语
33、句,而语句又依赖连接。因为:连接创建语句,语句再创建结果集。21.5 三层结构应用程序概述 逻辑上把应用程序代码分成若干个层次,例如二层、三层等。各层之间相对独立,要求下层提供方法给上层调用,不能跨层操作。通常,下层模块执行简单任务,上层模块通过调用多个下层模块,实现较为复杂的功能。3层:表示层、业务逻辑层、数据层。无论哪一层,对于Java程序,都是由类和接口组成。开发应用程序时,一般从底层开始。21.6 三层结构学生信息管理程序本节运用三层结构编写学生信息管理程序,访问21.2节建立的学生数据库。对象/关系映射(O/R映射):将面向对象程序设计语言中的对象实体及实体之间的关系映射到关系数据库
34、中的表及表之间的关系。相对地,把关系数据库的数据模型映射到Java对象模型。映射到数据库表或视图的类就是“实体类”。实体类的对象映射为一条数据记录,实体类的各个属性映射为记录的各个字段。学生数据库只有一个数据表,只需编写一个映射实体类。21.6.1 对象/关系映射21.6.2 实体类与JavaBean【例21-4】编写映射到学生数据库表(记录)的实体类。public class Stu implements Comparable /也是JavaBeanprivate String num;/学号private String name;/姓名private char sex;/性别private
35、 String specialty;/专业private int year;/年级/public Stu()/默认构造方法public String getNum()return num;public void setNum(String num)throws Exceptionif(num.matches(d8)this.num=num;else throw new Exception(学号必须为8位数字!);public String getName()return name;public void setName(String name)throws Exception public c
36、har getSex()return sex;public void setSex(char sex)throws Exception public String getSpecialty()return specialty;public void setSpecialty(String specialty)public int getYear()return year;public void setYear(int year)throws Exception public int compareTo(Stu otherStu)/比较顺序方法return pareTo(otherStu.num
37、);public String toString()/对象输出方法return num+,+name+,+sex+,+specialty+,+year;实体类是业务逻辑层代码,Java的实体类属于JavaBean。JavaBean是完成特定功能的组件,主要提供给别的代码共享调用,本身不能独立运行。是代码片段。JavaBean的特征有4个:(1)JavaBean是一个或多个Java类。(2)类中业务方法都是public的,对外提供调用。(3)需提供无参数的构造方法。如果用于网络传输,还要实现Serializable接口。(4)字段一般是private,要编写对字段读写的public方法。字段读写
38、方法的基本结构如下:public Type getXxx()return xxx;public void setXxx(Type xxx)this.xxx=xxx;21.6.3 数据层 是3层最底层,直接与数据库关联。【例21-5】编写学生信息管理程序 的数据层。import java.sql.*;import java.util.Vector;import javax.swing.JOptionPane;public class StuDataAccess /数据层类private static String driver=sun.jdbc.odbc.JdbcOdbcDriver;priva
39、te static String url=jdbc:odbc:StuDSN;private static Connection conn;private Statement stmt;private PreparedStatement prpstmt;private ResultSet rs;private static Connection createConnection()/建立连接方法tryif(conn=null|conn.isClosed()Class.forName(driver);/加载驱动程序conn=DriverManager.getConnection(url);/建立连
40、接 catch(Exception e)System.err.println(建立连接异常:+e);return conn;private static void closeConnection()/关闭连接方法try if(conn!=null&!conn.isClosed()conn.close();catch(SQLException se)JOptionPane.showMessageDialog(private void closeResultSet()/关闭结果集方法tryif(rs!=null)rs.close();catch(SQLException se)JOptionPan
41、e.showMessageDialog(.);private void closeStatement()/关闭语句方法try if(stmt!=null)stmt.close();if(prpstmt!=null)prpstmt.close();catch(SQLException se)JOptionPane.showMessageDialog();public Vector getAllRecords()/获取所有记录方法Vector stus=new Vector();/学生记录集String sql=select*from Stus;try createConnection();stm
42、t=conn.createStatement();rs=stmt.executeQuery(sql);while(rs.next()Stu stu=new Stu();stu.setNum(rs.getString(Num);stu.setName();stu.setSex(rs.getString(Sex).charAt(0);stu.setSpecialty();stu.setYear(rs.getInt(Year);stus.add(stu);catch(Exception e)JOptionPane.showMessageDialog();finally this.closeResul
43、tSet();this.closeStatement();closeConnection();return stus;/按学号查找学生记录方法:找到,返回Stu对象,否则,返回null public Stu searchRecord(String num)/查找学生记录方法Stu stu=null;String sql=select*from Stus where Num=?;try createConnection();prpstmt=conn.prepareStatement(sql);prpstmt.setString(1,num);rs=prpstmt.executeQuery();i
44、f(rs.next()/如果查找到记录 stu=new Stu();/构建学生对象 stu.setNum(rs.getString(Num);catch(Exception e)finallycloseStatement();closeConnection();return stu;/添加一条学生记录方法:成功,返回1;不成功,返回0。public int addRecord(Stu stu)/添加学生记录方法String sql=insert into Stus(Num,Name,Sex,Specialty,Year)values(?,?,?,?,?);int recCount=0;tryc
45、reateConnection();prpstmt=conn.prepareStatement(sql);prpstmt.setString(1,stu.getNum();recCount=prpstmt.executeUpdate();/执行更新catch(SQLException se)finally closeStatement();closeConnection();return recCount;/修改一条学生记录:成功,返回1;不成功,返回0。public int updateRecord(Stu stu)/修改学生记录方法String sql=update Stus set Na
46、me=?,Sex=?,Specialty=?,Year=?where Num=?;int recCount=0;trycreateConnection();prpstmt=conn.prepareStatement(sql);prpstmt.setString(1,stu.getName();recCount=prpstmt.executeUpdate();/执行更新 catch(SQLException se)finally closeStatement();closeConnection();return recCount;/删除一条学生记录:成功,返回1(更新语句数目);不成功,返回0。
47、public int deleteRecord(Stu stu)/删除学生记录方法String sql=delete from Stus where Num=?;int recCount=0;trycreateConnection();prpstmt=conn.prepareStatement(sql);prpstmt.setString(1,stu.getNum();recCount=prpstmt.executeUpdate();/执行更新 catch(SQLException se)finally closeStatement();closeConnection();return rec
48、Count;21.6.4 业务逻辑层【例21-5】继续编写学生管理程序的业务逻辑层代码。public class StuBusinessLogic private static StuDataAccess dataAccess=new StuDataAccess();/与数据层关联 private static Vector stus=new Vector();/学生集 private static int total;/元素总数 private static int stusIndex;/索引 public StuBusinessLogic()stus.clear();stus=dataAc
49、cess.getAllRecords();/调用数据层方法 total=stus.size();stusIndex=0;public static Vector getStus()/获取所有学生记录if(stus.isEmpty()stus.clear();stus=dataAccess.getAllRecords();/调用数据层方法total=stus.size();return stus;public static Vector reGetDBAllRecords()/重获库记录stus.clear();stus=dataAccess.getAllRecords();/调用数据层方法to
50、tal=stus.size();return stus;public static int getTotal()return total;/获取记录总数 public Stu getFirstStu()/获取学生集首记录if(stus.size()0)stusIndex=0;return stus.get(stusIndex);return null;public Stu getPreviousStu()/获取学生集上一记录if(stus.size()0)stusIndex-;if(stusIndex=-1)stusIndex=total-1;return stus.get(stusIndex