CS架构应用

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

实验三C/S架构应用
1、实验目的
1、理解C/S架构相关概念。

2、掌握C/S架构下数据库基本应用程序的实现。

2、实验性质
验证性实验
3、实验导读
3.1、数据库应用系统架构
数据库应用系统伴随计算机硬软件技术的发展,从集中式架构发展到分层式架构,分层式架构又分为两层C/S架构、三层C/S架构和多层C/S架构。

三层C/S架构中以B/S架构最为流行。

3.1.1、集中式结构
3.1.2、分层架构
(1)两层C/S架构
(2)三层C/S架构
B/S架构:
(3)多层C/S架构
3.2、JDBC介绍
JDBC (Java Database Connectivity) 是Sun公司给出的一个Java语言访问关系数据库的Java接口标准,这个标准基于X/Open SQL Call Level Interface ,并与SQL 92 入门级标准兼容。

3.2.1、JDBC驱动程序
(1)JDBC体系结构
图JDBC体系结构
由上图:数据库厂商依据SUN公司发布的JDBC API接口,实现自己的JDBC驱动程序(有可能没有与完全实现JDBC标准API)。

除非用户要用到开发商驱动程序某些特有的功能,一般情况下,开发者的JA V A代码应依据标准JDBC API来编写。

(2)JDBC驱动程序类型
四种JDBC驱动程序:
①JDBC-ODBC桥驱动程序+ODBC驱动程序。

其中桥驱动程序在JDK中提供,使用这种驱动程序还要求用户安装ODBC驱动程序和配置ODBC数据源。

②本地API部分JA V A驱动程序。

使用这种驱动程序要求用户安装特定数据库厂商的驱动程序
③JDBC-NET纯java驱动程序;
④本地协议纯java驱动程序。

(3)Oracle JDBC驱动程序
ORACLE提供基于类型2和类型4的JDBC驱动程序。

两类驱动均可以运行于客户端和服务器端。

图ORACLE驱动架构
第四类驱动称为Thin驱动;第二类驱动称为OCI驱动。

(4)JDBC URL与Oracle JDBC URL
JDBC用JDBC URL来标识数据库,格式为“jdbc:<子协议>:<子名称>”,其中子协议、子名称均由数据库厂商自己规定。

基于数据源的JDBC URL为jdbc:odbc:<数据资源名称>[;<属性名>=<属性值>],如:jdbc:odbc:qeor7
jdbc:Lodbc:wombat; CacheSize=20; ExtensionCase=LOWER
jdbc:odbc:qeora; UID=kgh; PWD=fodey
ORACLE的OJDBC14.JAR规定Thin驱动的JDBC URL为:
jdbc:oracle:thin:[user/password]@[host][:port]:SID 或
jdbc:oracle:thin:[user/password]@//[host][:port]/SID
其中port缺省为1521,Oracle 10g Express版本的SID为XE。

3.2.2、JDBC驱动使用步骤
(1)引入相应的包
import java.sql.*;
(2)创建连接对象(Connection)
如果使用DriverManager创建:
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
//定义JDBC URL
String url = "jdbc:odbc:JDBCDemo";
//得到与数据库的连接
Connection con = DriverManager.getConnection(url);
推荐使用ORACLE的数据源创建(这里要用到特定于ORACLE的特性,所以还要引入相应的包):
OracleDataSource ods = new OracleDataSource();
String URL = "jdbc:oracle:thin:scott/tiger@//myhost:1521/orcl");
ods.setURL(URL);
Connection conn = ods.getConnection();
(3)创建语句对象(Statement)
Statement stmt = conn.createStatement(int resultSetType, int resultSetConcurrency);
(4)使用语句对象执行SQL语句
ResultSet executeQuery(String sql) throws SQLException :执行一个SQL语句,返回一个ResultSet对象,sql为通常为一个静态的SQL SELECT语句。

一个Statement对象仅能得到一个ResultSet对象,要得到另一个ResultSet对象需要重新创建Statement。

int executeUpdate(String sql)throws SQLException :执行一个SQL INSERT、UPDA TE 或DELETE语句,返回值为INSERT,UPDA TE或DELETE语句操作成功的记录数。

boolean execute(String sql) throws SQLException :执行一个可能会返回多个结果的SQL 语句sql。

如果结果为一个ResultSet,返回值为true。

(5)处理执行结果
对于executeUpdate(),使用返回的整数来判断处理情况;对于executeQuery()返回为结果集,这时需要用一个循环一次获取每一行数据。

ResultSet rs = sm.executeQuery("select empno,empName from emp");
while (rs.next()) {
System.out.println("用户ID:"+rs.getInt(1));
System.out.println("用户ID:"+rs.getString(“empName”));
}
(6)释放JDBC相关的对象
rs.close();
stmt.close();
conn.close();
3.2.3、PreparedStatement对象
PreparedStatement对象包含已编译的SQL语句,该语句可具有一个或多个IN参数,每个IN参数保留一个问号(“?”)作为占位符。

IN参数的值在SQL语句创建时未被指定,每个问号的值必须在该语句执行之前,通过适当的setXXX方法来提供。

PreparedStatemen t pstmt=con.prepareStatemnet(“UPDA TE EMPLOYEES SET SALARY=? WHERE ID=? “);
......
pstmt.setBigDecimal(1,153833.00) //设置第一个“?”,既SALARY= 153833.00
pstmt.setInt(2,110592) //设置第一个“?”既ID=110592
Statement接口中的三种方法execute,executeQuery和executeUpdate已被更改,不再需要参数。

下面就是execute方法的原型。

boolean execute() throws SQLException
所有的setXXX方法的原型如下,其中XXX是与该参数相应的类型。

例如,如果参数具有Java类型long,则使用的方法就是setLong。

setXXX方法的第一个参数parameterIndex 为要设置的参数的序数位置,第一个参数是设置给该参数的值,length为流中字节数。

void setNull(int parameterIndex, int sqlType) throws SQLException
void setBoolean(int parameterIndex,boolean x) throws SQLException
void setByte(int parameterIndex,byte x) throws SQLException
void setShort(int parameterIndex,short x) throws SQLException
void setInt(int parameterIndex,int x) throws SQLException
void setLong(int parameterIndex,int x) throws SQlException
void setFloat(int parameterIndex,fload x) throws SQLException
void setDouble(int parameterIndex,double x) throws SQLException
void setBigDecimal(int parameterIndex.BigDecimal x) throws SQLException
void setString(int parameterIndex,String x) throws SQLException
void setBytes(int parameterIndex,byte x[]) throws SQLException
void setDate(int parameterIndex,java.sql.Date x) throws SQLException
void setTime(int parameterIndex,javat.sql.Time x) throws SQLException
void setTimestamp(int parameterIndex,java.sql.Timestamp x)throws SQLException
void setAseiiStram(int parameterIndex, java.io.InputStream x,int length)throws SQLException
void setUnicodeStream(int parameterIndex,java.io.InputStream x,int length) throws SQLException
void setBinaryStream(int parameterIndex, java.io.InputStream x,int length) throws SQLException
void setRef(int parameterIndex, Ref x) throws SQLException
void setBlob(int parameterIndex,Blob x) throws SQLException
void setcolb(int parameterIndex,Clob x) throws SQLException
void setArray(int parameterIndex, Array x) throws SQLException
3.2.4、Callablestatement对象与存储过程调用
// 调用无参数存储过程
CallableStatement cs1 = con.prepareCall("CALL Abc()");
// 调用有参出处过程
CallableStatement cs2 = con.prepareCall("CALL Abc(v1, v2, ...)");
//调用存储函数
CallableStatement cs4 = con.prepareCall("? = CALL Abc(v1, v2, ?, ?, ...)");
3.2.5、JDBC事务处理与设置隔离级别
3.2.6、JDBC关于数据库和结果集的元数据
Connection对象的getMetaData()方法返回数据库元数据对象DatabaseMetaData,通过该对象可返回地秤数据源的一般信息、数据源支持的特性、数据源的限制、数据库对象信息、事务支持特性等。

ResultSet对象的getMetaData()方法返回结果集元数据对象ResultsetMetaData,通过该对象可以获取结果集的相关信息:列的数目(getColumnCount())、列的名称(getColumnName(i))、列的数据类型名(getColumnTypeName(i))等。

3.3、基于C/S架构的数据库应用
逻辑上:整个系统分为两层:服务器层接受客户访问、提供数据源;客户端层实现与用户的交互、从服务器存取数据,实现系统的业务功能。

物理上:两层可以处于一台计算机上,也可以让客户端层处于另一个计算机中。

实现上:客户端曾可以是命令行界面,也可以是Windows窗口界面。

实验要求使用JSwing实现Windows窗口界面。

实现步骤:
(1)依次设计主控窗口,以及各个子窗口。

(2)依次实现各个子窗口。

每个子窗口用Jpanel或JDialog或JOptionPane实现;子窗口实现涉及子窗口的布局管理器设置、子窗口上各个组件的实现(包括组件定义、设置组件属性(字体、颜色、Border)、注册监听器)等。

注意JTable控件的使用方法,这是一个实现信息浏览的最佳控件。

注意JDialog和JOptionPane的用法,利用它们很任意实现对话框功能。

文件操作要用到FileDialog。

(3)实现主控窗口,把各个子窗口整合。

主窗口用JFrame实现。

主窗口实现涉及菜单系统设置、菜单功能切换等。

一般在JFrame 上设置JMenBar,把系统菜单放置到JMenuBar中。

菜单运行窗口置于菜单下方。

切换菜单
时,同步切换菜单下方运行窗口的内容。

只要在事件监听代码中灵活应用如下代码即可实现窗口切换。

OldJPanel.setVisibale(false);
OldJPanel.setEnable(false)
Jf.getContentPane().remove(OldJPanel) ;
Jf.getContentPane().removeAll();
NewJPanel.setV isibale(true);
NewJPanel.setEnable(true);
Jf.getContentPane().add(NewJPanel);
(4)在类的组织上,按表示层(界面类)、业务逻辑层(领域对象、实体对象)、数据存取层(DAO接口、DAO实现)、辅助工具层(JDBC调用)分包组织。

4、实验内容
(1)、阅读有关资料,理解C/S架构的概念。

(2)、编写一个存储过程,该存储过程向SC追加一条选课记录,如果该记录的成绩grade 字段非空,则更新Student表的savggrade字段。

要求两个操作组成一个事务,然后编写JA V A 程序,用JDBC调用该存储过程。

如果上述两个操作直接封装在java的JDBC调用中,并用JDBC实现事务处理,相应JA V A代码又应该
(3)、编写存储过程,向Student表追加一条学生信息(信息不包括savggrade字段,但包含SPicture字段)
(4)在学生-课程数据库上实现一个简单的基于C/S架构的“学生成绩管理系统”,该系统包括课程信息管理、学生信息管理和选课信息管理三个功能模块,每个功能模块提供对相应信息的浏览、查询、增、删、改等操作。

通过实验,以加深对C/S架构的认识,初步掌握C/S架构应用系统的开发过程。

要求如下:
①用户交互界面为图形窗口。

②学生信息管理模块必做,其它两个模块选做。

③对数据库的访问通过存储过程调用实现。

④相关类分层组织成合适的包的形式。

5、实验作业
(1)、总结C/S架构数据库应用程序的优点与缺点。

(2)、查阅资料,总结Java应用程序调用存储过程的步骤和特点。

相关文档
最新文档