第10章 数据库应用
- 格式:doc
- 大小:287.50 KB
- 文档页数:19
第十章一、填空题1.92. e3.@,变量名4.REPEAT5.DELIMITER二、判断题1.错2.错3.对4.对5.对三、选择题1. A2. D3. D4. C5. B四、简答题1.请简述存储过程和函数的区别。
答:(1)语法中实现的标识符不同,存储过程使用PROCEDURE,函数为FUNCTION。
(2)存储过程在创建时没有返回值,而函数在定义时必须设置返回值。
(3)存储过程没有返回值类型,且不能将结果直接赋值给变量;而函数定义时需要设置返回值类型,且在调用时除在SELECT中,必须将返回值赋给变量。
(4)存储过程必须通过CALL进行调用,不能使用SELECT调用;而函数则可在SELECT语句中直接使用。
2.请说一说触发器以及其作用。
答:概念:触发器可以看作是一种特殊类型的存储过程,在预先定义好的事件(如INSERT、DELETE等操作)发生时,才会被MySQL自动调用。
作用:①触发器可以通过数据库中的相关表实现级联无痕更改操作。
②保证数据安全,进行安全校验五、实训题11. 请在shop数据库中创建一个存储过程,以订单编号为参数,输出该订单的商品信息。
mysql> DELIMITER $$mysql> CREATE PROCEDURE shop.order_proc(IN order_id INT )-> BEGIN-> SELECT g.id, FROM sh_goods g-> LEFT JOIN sh_order_goods og ON g.id = og.goods_id-> WHERE og.order_id = order_id;-> END-> $$Query OK, 0 rows affected (0.01 sec)mysql> DELIMITER ;2. shop.sh_order_goods表上创建一个触发器,当添加订单-商品信息时,修改sh_goods表中对应商品的库存量。
第10章怎样管理和利用数据1、数据库系统是信息社会中重要的系统,其基本构成如下图示意。
仔细理解数据库、数据库系统和数据库管理系统等概念,回答下列问题。
图10-1(1)关于为什么要用“数据库”,下列说法正确的是_____。
(A)因为数据库可以使不同地点的人员实时地共享数据,一个地点的人员对数据库中数据进行了修改,另一个地点的人员可以马上了解这种修改,这种实时共享数据是纸面数据、非数据库数据所达不到的;(B)因为数据库是聚集数据的一种有效手段,数据库管理系统可以帮助我们对数据进行若干的管理和控制,而只有聚集了大量数据,才能发挥聚集数据的效益;(C)因为数据库可以有效实现“数据产生的分散化”和“数据应用的共享化”;(D)因为数据库可以便利用户对数据的操控,用户可以用简单的一条语句便可实现诸如“统计每个学生平均成绩”这样具有大量计算的工作;(E)上述原因都是要用“数据库”的理由,但还有其他理由。
答案:E解释:本题目考查数据库系统与数据库管理系统的相关概念。
选择(E),(A)(B)(C)(D)均正确,但单独每一项均不够全面,简单举例,数据库可以将数据电子化克服了大量纸面保存的数据占用空间不方便查询等缺点。
具体内容请参考课堂视频“数据为什么要管理”和第十章课件。
(2)关于数据库,下列说法不正确的是_____。
(A)数据库是一个特定组织所拥有的相互有关联关系的数据的集合;(B)数据库是以统一的数据结构组织数据并存放于存储介质上的数据集合;(C)数据库可以为各类人员通过应用程序所共享使用;(D)数据库是管理大规模数据集合的一种软件;答案:D解释:本题目考查数据库系统与数据库管理系统的相关概念。
选择(D),数据库并不等同于数据库管理系统。
具体内容请参考课堂视频“什么是数据库与数据库系统”和第十章课件。
(3)有以下一些要素:(I)数据库;(II)数据库管理系统;(III)数据库应用;(IV)数据库管理员;(V)计算机基本系统及网络,则一个数据库系统是由_____组成的一个系统。
第10章JDBC数据库访问接口教学目标: 学生通过本章学习应掌握SQL指令操作数据库及SQL函数的应用.重点与难点: JDBC访问数据库访问的4种基本形式,事务处理,分页显示,JavaBean操作SQL Server数据库。
一、教具: 可进行广播的教学或多媒体计算机局域网,投影仪及相关的软硬件.二、教学方法: 理论与实训相结合。
三、教学时数: 第13-16周16小时(实训8学时)四、作业及上机练习: P.236-- 1.3.4.5.6.10.1 数据库应用开发简介1.什么是关系型数据库?关系型数据库是以关系(表)来表示数据与数据之间的联系,数据的逻辑关系是一张二维表,如表7-1.常用的关系型数据库如Microsoft SQL Server、Access、Oracle、DB2和SyBase等.2.关系型数据库对象------表7-1 用户情况表(1)表: 表是关系型数据库中数据存储的主要对象,也是其基本元素.表是一个二维结构,以行/列方式组织数据且行与列的顺序不影响表的内容.(2)记录: 记录是指表中的一行. 如: ”唐明、男、25….”是表中的一条记录.(3)字段: 字段是指表中的一列. 如: 姓名、性别、年龄、工资……等. 字段有一定的数据类型和取值范围,具体内容在创建表时指定. 每个表中都有一个惟一标识一个记录的字段即为关键字段,利用它可快速查询到所需记录.(4)索引: 索引是建立在表上的单独的物理数据库结构,是从表中查出的一个或多个字段的组合. 基于索引的查询将使数据的获取更为快捷. 如索引出工资大于1400的用户,经索引后将返回结果: 唐明、李利.(5)关系: 关系是从数学中而来的概念,在关系代数中, 关系即二维表,表不仅可用来表示数据,也可用来表示数据间的关系.在数据库中关系是建立在两个表之间的连接,以表的形式表现其间的联系,使得数据的处理和表达有更大的灵活性.关系概念简单但很重要,可分为一对一关系、一对多关系、多对多关系3种.10.1.2 ODBC数据访问接口(Open Database Connectivity----开放式数据库互连)---是Microsoft公司开发的一套访问数据库的应用程序接口(API)支持应用程序以标准的ODBC函数和SQL语句操作各种不同类型的数据库,负责将应用程序发送来的标准SQL语句传递给各种数据库驱动程序处理,再将处理结构送回应用程序处理.其原理图如图7-1应用程序发送来的标准SQL语句通过ODBC接口传递给各种数据库驱动程序,操作数据库.10.1.3 JDBC数据库访问接口Java数据库互连接口技术(Java DataBase Connectivity)工作原理与ODBC相似,也是起到应用程序与不同数据库的连接桥梁作用.支持基本的SQL语句, 将应用程序发送来的标准SQL语句传递给各种数据库驱动程序处理,再将处理结构送回应用程序处理。
Java.sql包提供了多种JDBC API, 这些类和接口可提供构造SQL 语句,连接关系型数据库,执行SQL语句并获得查询结果等功能.10.2 SQL语言SQL (Structured Query Language----结构化查询语句)是1974年由Boyce和Chanberlin提出的,专门用于查询和操作关系型数据库.1986年国际化标准组织(ISO)将SQL定为国际标准.即任何一种数据库都是用SQL作为数据存取的标准语言.SOL语句包括查询、操作、定义、及控制4个方面的功能,其本身的语法、功能比较繁多.涉及Web数据库和JSP技术有查询、操作两个常用功能,现结合创建的person.mdb中的grade表介绍使用方法. SQL语句两大特点:(1)类似英文,容易理解书写(2)SQL语言是非过程化语言(第4代语言).SQL集DDL(Data Definition Language---数据定义语言),DML(Data Manipulation Language--数据操纵语言)和DCL(Data Control Language--数据控制语言)于一体,实现数据库生命周期的全部活动. SQL语句分5类如表10-1步骤1. 创建Access数据库你在新建数据库----可选(1) 空Access数据库. (2) Access数据库向导数据页和项目.(3) 打开已有文件.我们选(1) 空Access数据库,单击”确定”按钮. 设定数据库名称为person.mdb, 按”创建”按钮存储到ROOT/下. → 创建表可选(1)使用设计器创建表. (2)使用向导创建表. (3)通过输入数据创建表.我们选(1)使用设计器创建表.→在表中输入字段名及数据类型(ID-自动编号,学号-数字,性别-文本,姓名-文本,语文-数字,数学-数字,英语数字-)及字段长度,存储表名为grade保存成绩信息.步骤2. 建立系统DSN→(Windows XP)控制面板→管理工具→数据源(ODBC)→系统DSN→添加→Microsoft Access Driver (* mdb)→数据源名DSN:grade. 数据库名称为C:\Tomcat 5.5\webapps\ROOT\07\database person.mdb.→确定.10.2.1 基本SOL语句---包括查询(Select)、插入(Insert)、更新(Update)、删除(Delete)4种基本操作。
一、查询语句Select语法格式查询---根据用户要求的条件,从数据库中检索出相应的记录并返回给用户.语法格式为:SELECT 字段名称1 , 字段名称2…. [AS 字段别名1,字段别名2…… ]FROM 数据表名称[WHERE 查询表达式][ORDER BY 字段名[DESC(降序)|ASC(升序)]][GROUP BY 分组字段名列表[HA VING 分组条件表达式]]● 注意: 字段名称---* 代表表中所有字段名通常用的查询语句Select实例如下:1.DQL--数据查询语言的3种基本格式:(1)基本语型一(基本查询)Select 字段列……From 目标数据表例1. 将grade表中的数据全部列出Select * From grade执行结果:http://localhost:8080/07/Sqltest.jsp例2. 字段列超1时,用逗号隔开.将学号,姓名字段从grade表中列出Select 学号,姓名From grade执行结果:http://localhost:8080/07/Sqltest.jsp例3. 有时数据表中设计的字段名在打印出不太合适,需对字段进行一些修改,可用as关键字来指定一个新的字段名作为打印输出,如:Select 学号,姓名,语文+数学+英语as 总成绩From grade执行结果:http://localhost:8080/07/Sqltest.jsp例4. 字段列可不按表中顺序排例,按语句中排序为准,如:Select 姓名,学号From grade执行结果:http://localhost:8080/07/Sqltest.jsp(2)基本语型二(条件查询)Select 字段列……From 目标数据表…..Where 条件表达式例1. 字段列超1时,用逗号隔开.将学号,姓名字段从grade表中列出Select * From grade where 数学>80执行结果:http://localhost:8080/07/Sqltest.jsp例2. Select * From grade where 数学=80 or 语文=90执行结果:http://localhost:8080/07/Sqltest.jsp使用通配符进行模糊查询如:当只知道欲查询数据的部分字符串时,可以用"Like关键字+通配符+已知的部分条件" 进行模糊查询(1)%:代表模糊匹配的一个未知字符串。
(2)- :代表模糊匹配的一个未知字符。
例3. Select * From grade where 姓名Like '小%'Select * From grade Where 姓名Like '_星_'执行结果:http://localhost:8080/07/Sqltest.jsp(3)基本语型三(排序查询)Select字段名..From 目标数据表…..Where 条件表达式….Order By 字段名例1.如: 按数学分数排序Select * From grade Order By 数学例2.按数学,语文分数排序(从低到高)Select * From grade Order By 数学, 语文例3.按数学分数DESC(降序—从高到低)排序Select * From grade Order By 数学desc执行结果:http://localhost:8080/07/Sqltest.jsp例4.从grade表中取出前5条记录(从查询视图中查询- 查询1)Select top 5 * From grade2.数据操纵语言(DML)的基本格式(1) DELETE指令:删除记录删除数据的SQL语法格式为:DELETE * FROM 数据表名WHERE 条件表达式如: 按学号删除数据执行结果: http://localhost:8080/07/SQLDel.jsp(2) UPDA TE指令:更新记录更新记录的SQL语法格式为:UPDA TE 数据表SET 字段名=新值WHERE 条件表达式如: 按学号更新语文分数String strUpd = "UPDA TE grade SET 语文= " + Chinese + " WHERE 学号= '" +SID + "'";执行结果: http://localhost:8080/07/SQLUpd.jsp(3) INSERT INTO指令:添加记录添加记录的SQL语法格式为:INSERT INTO数据表Values (字段值) 如:INSERT INTO数据表[(字段名1, 字段名2….)] Values (字段值1, 字段值2….) 如:如: 按学号更新语文分数strSQL = "INSERT INTO grade(学号, 姓名, 语文, 数学, " + "英语) Values ('31'," + "'赵微', '80'," + "'75',90) "; 执行结果: http://localhost:8080/07/SQLIns.jsp10.2.2.聚合函数10.2.3 分组查询分组查询包括GROUP BY 和HA VING两个关键字. 如计算男女生的语文平均分,可用分组查询完成.: 如计算男生的语文平均分有两种方法: 用SQL视图执行.(1) SELECT 性别, A VG(语文) as 平均分FROM grade GROUP BY性别HA VING性别='男' (查询2)(2) SELECT 性别, A VG(语文) as 平均分FROM grade WHERE 性别='男' GROUP BY 性别(查询3)10.3 JDBC 类型JDBC 驱动程序分4种类型(1)JDBC-ODBC桥结构---利用ODBC驱动程序提供JDBC访问.需在服务器上安装ODBC驱动程序.(2)本地API: 这种类型的驱动程序把客户机API上的JDBC调用转换为不同数据库的调用,如Oracle,rmix,DB2等.(3)JDBC网络纯java驱动程序.(4)本地协仪纯java驱动程序.首选(3),(4).(1)(2)为过度.10.3.2 数据驱动程序常见的有Oracle驱动程序---classes12.jar. DB2驱动程序--- db2java.jar. SQL驱动程序---mssqlserver.java. MySql 驱动程序---mysql.jar如加载Oracle和SQL Server的JDBC驱动程序的语句为:Class.forName("oracle.jdbc.driver.OracleDriver")Class.forName("com.microsoft.jdbc.sqlserver.SQLServerDriver").newInstance();如没有JDBC驱动程序可使用Sun的JDBC-ODBC桥驱动程序,如Access数据库.Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");10.3.3 Connection 对象创建一个Connection 对象实例建立数据库的连接,也可使用DriverManager类的getConnection()方法建立数据库的连接,语法为:public static Connection getConnection(String url,String user, String password) throws SQLException.程序最后应关闭Connection对象: public void close() throws SQLException.10.3.4 Statement 对象Statement 对象用来将SQL语句发送到数据库中.有3种Statement 对象(1)Statement 对象(2)PreparedStatement (从Statement 对象继承而来,对象表示预编译SQL语句)(3)CallableStatement(从PreparedStatement 对象继承而来,对象为数据库提供一种调用存储过程的方法)(4)建立数据库的连接后,就可发送SQL语句操作数据库表. Statement 对象用Connection的createStatement()方法创建, Statement接口提供两种执行SQL语句的方法.(1)public ResultSet executeQuery(String sql) throws SQLException.用于产生单个ResultSet的语句,如SELECT语句(2)public int executeUpdate(String sql) throws SQLException.用于执行INSERT,UPDATE或DELETE语句及SQL的DDL语句,如: Create Table和DROP TABLE语句.该方法返回一个int型整数,指示受影响的记录数.10.3.5 ResultSet对象ResultSet对象包含符合SQL语句执行结果的所有行,并通过一套get方法访问数据表中的数据.常用get方法如下:●int getInt(int columnIndex): 取得当前行中第columnIndex列的索引整数值●int getInt(String columnName): 取得当前行中列名为columnName的整数值●Date getDate(int columnIndex): 取得当前行中第columnIndex列的日期值●Date getDate(String columnName): 取得当前行中列名为columnName的日期值●public String getString(int columnIndex): 取得当前行中第columnIndex列的字符串值●public String getString(String columnName): 取得当前行中列名为columnName的字符串值. 其它get方法参考java文档.ResultSet维护指向当前数据行的光标. 光标下移一行的方法为:public Boolean next() throws SQLException.关闭ResultSet对象的方法为:public void close() throws SQLException.DbTest1.javaDbTest2.java10.3.6 PreparedStatement对象PreparedStatement对象表示预编译SQL语句. SQL语句经预编译后存储在PreparedStatement对象中,可高效地多次执行. PreparedStatement对象用Connection的PreparedStatement()方法创建:public PreparedStatement preparedStatement(String sql) throws SQLException.在PreparedStatement对象的字符串中可以用?代表一个可变参数,在随后的程序中用循环语句生成一系列SQL语句,如:public void setInt(int parameterIndex, int x) throws SQLException.可以将第parameterIndex个参数赋值为x ,parameterIndex代表表中的索引字段. 随后可以用PreparedStatement对象的public void addBatch() throws SQLException.方法将其加如到一个批作业.最后用PreparedStatement对象的public int[] executeBatch() throws SQLException.方法一次执行所有加入的批次作业,然后关闭PreparedStatement对象,方法为:public void close() throws SQLException.10.3.7 CallableStatement对象CallableStatement对象为数据库提供一种调用存储过程的方法. 存储过程---是由存储在数据库管理系统中的一段SQL语句组成的一个过程.因为存储过程是保存在数据库服务器中并经过预编译的,所以可以大大提高程序的执行速度和减少网络数据传输量.CallableStatement对象有两种形式:一种形式带结果参数,另一种形式不带结果参数,问号做参数的占位符. CallableStatement对象由Connection对象的prepareCall()方法创建:public CallableStatement prepareCall(String sql) throws SQLException.创建CallableStatement的实例,其中含有对存储过程getpassword的调用,该过程有两个变量,但不含结果参数. CallableStatement cstmt=con. prepareCall("{call getpassword(?,?)}");其中"?"占位符是输入还是输出,取决于存储过程getpassword.OUT参数使用registerOutParameter()方法进行注册,语法为:public void registerOutParameter(int parameterIndex,intsqlType) throws SQLException其中,整型为java.sql.Types.INTEGER,字符型为java.sql.Types.CHAR.IN参数使用setXXX()方法设置实际值,如设置字符串参数为:public void setString(int parameterIndex, String x) throws SQLException准备就绪后, 使用CallableStatement对象的execute()方法执行该存储过程.public boolean execute() throws SQLExceptionOUT参数使用getXXX()方法取得返回值,如取得字符串的方法为:public String getString(int parameterIndex) throws SQLException最后关闭PreparedStatement对象: public void close() throws SQLException10.4 JDBC的数据4个访问格式:格式1: 执行基本SQL语句(如7-01.jsp,7-02.jsp)基本格式的功能是执行不带参数Select语句和INSERT语句,涉及3个对象的使用: Connection , Statement, ResultSet对象格式2: 实现分页在JDBC.1.0中,结果集只能利用next方法没次向前移动记录指针. 在JDBC.2.0中,增加了可前后滚动结果集,其使用方法为:createStatement()方法接受两个参数: 结果集类型和结果集并法性. 结果集类型(TYPE)决定这个Statement对象创建的ResultSet对象是否可以滚动,还可以指定结果集是否对数据库的修改敏感.使用ResultSet类中的int常量来表示结果集类型, 结果集类型有3种.(1)ResultSet.TYPE_FORWORD_ONLY: 指定ResultSet对象记录指针是不可滚动,仅能前移,默认值(2)ResultSet.TYPE_SCROLL_INSENSITIVE: 指定ResultSet对象记录指针是可滚动,对数据库修改不敏感(3)ResultSet.TYPE_SCROLL_SENSITIVE: 指定ResultSet对象记录指针是可滚动,对数据库修改敏感对列值修改有两个源(1)内部修改—更新结果集合值的修改(2)外部修改—其他程序修改了结果集原来读取的行.内,外部修改对结果集的影响见表7-2说明了结果集默认的可见性.可使用ResultSet对象的refreshRow()方法刷新结果集的当前行,可覆盖默认的可见性,将表中的所有否变为是. refreshRow()方法用于可更新, 可滚动的敏感和不敏感的结果集.结果集的并法性(Concurrency)决定ResultSet对象是否可修改数据库的行.可以使用ResultSet类中定义的int 常量来指定结果集的并法性.(1)ResultSet.CONCUR_READ_ONLY: 指定ResultSet对象不能修改数据库, 默认.(2)ResultSet.CONCUR_UPDA TABLE: 指定ResultSet对象可以修改数据库.可以滚动结果集中有多个方法,灵活的方式在行中移动,常用方法如下:(1)next()方法: 移动到结果集的下一行,如果结果集没有下一行,返回false,否则返回true.(2)previous()方法: 移到前一行, 如果没有前一行返回false,否则返回true.(3)first()方法: 移到第一行, 如果没有行返回false,否则返回true.(4)last()方法: 移到最后一行, 如果没有行返回false,否则返回true.(5)beforeFirst()方法: 移到第一行前面的位置, 如果没有行调用该方法没任何作用(6)afterLast()方法: 移到最后一行后面的位置, 如果没有行调用该方法没任何作用(7)absolute(int rowNumber)方法: 移到rowNumber指定的行, 如果rowNumber为负值,就从最后一行向前移动. 结果集中第一行的行号是1.(8)Relative(int relativeRowNumber)方法: 从当前行移到某一行,当relativeRowNumber为正数时指向前移,负值为向后移动.在滚动结果集时,可用如下方法知道记录指针位置(1)getRow()方法: 返回当前行号(int值), 如果没有当前行, 返回0.(2)isFirst()方法: 是否是第一行,是返回true.,否则返回false.(3)isLast()方法: 是否是最后一行,是返回true.,否则返回false.(4)isbeforeFirst()方法: 如果当前位置在第一行之前,返回true.,否则返回false.(5)isafterLast ()方法: 如果当前位置在最后一行之面,返回true.,否则返回false.在使用可更新结果集时,可修改对ResultSet对象本身进行添加,删除,修改.使用updateString方法更新字符串列, 使用updateDate方法更新日期型列, 使用updateInt方法更新数字列.update方法接受两个参数:(1)要更新的列,使用代表位置的数字或列名(2)新值例如: rs.absolute(3); //定为到第3行rs. updateInt("数学",100); //更新数学字段rs. updateRow(); //更新信息发送到数据库使用deleteRow()方法可删除结果集的当前行,如删除表中第5行rs.absolute(5);deleteRow()对可更新的结果集添加新行使用moveToInsertRow()方法,然后用update()方法设置新行的值,最后用insertRow()方法将新行插入到数据库表中去,如:rs. moveToInsertRow();rs. updateInt ("学号",101);rs. updateString ("姓名","张三");rs. insertRow(); //更新信息发送到数据库格式3: 执行带参数的SQL语句(使用PreparedStatement对象执行带参数的SQL语句)格式4: 执行存储过程(Access不支持存储过程)使用CallableStatement执行数据库存储过程DbTest3.java10.5.1格式1: 7-04.jsp读取Excel数据(建立DSN--Excel数据源C:\Tomcat 5.5\webapps\ROOT\07\ database \person.xls)DbTest4.javaDbTest5.javaDbTest6.javaDbTest7.javaDbTest8.java【例11.3】连接指定数据库并获得数据库属性信息(连接MySQL和Access数据库)在JCreator中JDK Profiles 中添加mysql-connector-java-5.0.0 jar 或在MyEclipse Project菜单Properties属性窗口中Java Build Path 中为该项目添加mysql-connector-java-5.0.0 jar文件即可编辑源程序【例11.4】执行插入和删除数据的SQL语句【例11.5】使用JTable显示数据查询的结果集本章小节:本章主要介绍了JDBC的结构及常用对象的使用.需掌握DQL,DML,聚合函数,分组函数等SQL语句的使用.重点掌握5大对象的使用方法, 掌握4种基本格式的使用和使用JavaBean 访问数据库.。