对数据库的操作_第1页
对数据库的操作_第2页
对数据库的操作_第3页
对数据库的操作_第4页
对数据库的操作_第5页
已阅读5页,还剩52页未读 继续免费阅读

下载本文档

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

文档简介

对数据库的操作第一页,共五十七页,2022年,8月28日7.1数据源java应用程序与数据库的连接方式有四种,本书中采用JDBC-ODBC方式连接数据库.这种连接方式分三个步骤:首先,创建一个数据源,其次,加载JDBC-ODBC驱动程序,第三步,建立一个到数据库的连接。数据源是对数据库的一种映射。我们可以把数据源理解为数据库本身,一个数据源对应一个数据库。第二页,共五十七页,2022年,8月28日本书以MicrosoftAccess数据库为例。假设已创建了数据库db.mdb(保存在E:\db.mdb目录下)。假设采用的是windows2000操作系统,我们为该数据库创建数据源的步骤如下:第三页,共五十七页,2022年,8月28日1.在"管理工具"中选择"ODBC数据源",如图7-1所示。图7-1数据源ODBC第四页,共五十七页,2022年,8月28日2.双击"ODBC数据源"图标,出现如图7-2所示界面。该图显示了"UserDSN"选项卡中的已有数据源的名称。图7-2显示已有user数据源第五页,共五十七页,2022年,8月28日3.选择"SystemDSN"选项卡,单击"Add"按钮,增加新的数据源,如图7-3所示。此对话框,为新增加的数据源选择驱动程序。图7-3选择驱动程序第六页,共五十七页,2022年,8月28日4.因为要访问MicrosoftAccess数据库,选择"MicosoftAccessDriver(*.mdb)"选项,单击"完成"按钮(为数据源选择了驱动程序),出现了设置数据源具体项目的对话框,如图7-4所示。图7-4配置数据源第七页,共五十七页,2022年,8月28日5.在"数据源名(N)"后的文本框中为数据源起一个名字,这里起的名字是grade(可以起别的名字),点击"选择(S)…"按钮,为数据源grade选择数据库,这里选择的数据库是E:\db.mdb。配置情况如图7-5所示。图7-5配置情况第八页,共五十七页,2022年,8月28日6.最后点击"确定"按钮,完成了数据源的配置,出现对话框如图7-6所示。在该对话框中,点击"确定"按钮,完成数据源grade的配置。图7-6配置完成第九页,共五十七页,2022年,8月28日7.2JDBC-ODBC桥接器JDBC-ODBC桥接器就是把应用程序与数据源连接起来的驱动程序。因此,创建了数据源以后,还要加载JDBC-ODBC桥接器,即加载驱动程序。第十页,共五十七页,2022年,8月28日下面是加载驱动程序的方式:try{Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");}chatch(ClassNotFoundExceptione){}

通过Class类的静态方法forName(Stringdriver)加载JDBC-ODBC桥接器。第十一页,共五十七页,2022年,8月28日7.3数据库连接创建了数据源,加载了驱动程序,应用程序还是不能连接到数据库。应用程序要访问数据库,还必须创建一个到数据库的连接。即创建一个连接对象。下面是创建连接对象的静态方法:publicstaticConnectiongetConnection(Stringurl,Stringuser,Stringpassword)throwsSQLException第十二页,共五十七页,2022年,8月28日假设数据源名是“grade”,用户登录系统的帐号是user/password。下面是获得连接对象的方法:

Connectionconn=DriverManager.getConnection(“jdbc:odbc:grade”,user,password);或者Connectionconn=DriverManager.getConnection(“jdbc:odbc:grade”);

getConnection()方法是DriverManager类的一个静态方法。对于Access数据库连接,可以不要帐号参数就能建立连接对象。第十三页,共五十七页,2022年,8月28日7.4数据库事务处理一般来说,数据库事务处理分两种:一种是数据查询,第二种是数据更新。数据更新包括数据插入、修改和删除。第十四页,共五十七页,2022年,8月28日假设已经连接到某数据库,创建的连接对象是conn。则数据查询和数据更新步骤如下。1.数据查询通过以下两个步骤,获得查询结果集rs。(1)创建语句对象Statementstmt=conn.createStatement(inttype,intconcurrency);

(2)获得查询结果集Stringsql="select*fromtablenamewhereexpression";//SQL查询字符串ResultSetrs=stmt.executeQuery(sql);//获得结果集rs第十五页,共五十七页,2022年,8月28日2.数据更新通过以下两个步骤,实现数据更新。(1).创建语句对象Statementstmt=conn.createStatement(inttype,intconcurrency);

(2).执行更新Stringsql="sqlStatement";//插入或修改或删除SQL字符串

intnumber=stmt.executeUpdate(sql);//执行更新操作第十六页,共五十七页,2022年,8月28日说明:在数据查询、数据更新事务中,一般采用无参的createStatement()方法创建语句对象。如果事务是随机查询、游动查询和用结果集更新数据库,则应采用createStatement(inttype,intconcurrency)方法创建语句对象。下面是对该方法参数的说明。第十七页,共五十七页,2022年,8月28日

type的取值决定滚动方式,即结果集中的游标是否能上下滚动。取值如下:

ResultSet.TYPE_FORWORD_ONLY结果集的游标只能向下滚动。

ResultSet.TYPE_SCROLL_INSENSITIVE结果集的游标可以上下移动,当数据库变化时,当前结果集不变。

ResultSet.TYPE_SCROLL_SENSITIVE返回可滚动的结果集。当数据库变化时,当前结果集同步改变。

concurrency的取值决定是否能用结果集更新数据库。concurrency取值:

ResultSet.CONCUR_READ_ONLY不能用结果集更新数据库中的表。

ResultSet.CONCUR_UPDATABLE能用结果集更新数据库中的表。第十八页,共五十七页,2022年,8月28日我们可以使用同一个Statement对象来执行查询和更新操作(修改/添加/删除),但是,需要注意,用Statement对象获取结果集的操作,必须在用Statement对象执行更新的操作之前,否则,执行更新的操作会破坏Statement对象获取的结果集。第十九页,共五十七页,2022年,8月28日7.5数据查询按照查询的方式不同,将查询分为顺序查询、游动查询、随机查询、参数查询、排序查询、使用通配符查询。第二十页,共五十七页,2022年,8月28日7.5.1顺序查询这种查询中,获得的结果集(ResultSet对象)中的游标只能一行行地向下移动。既不能向上移动游标,

也不能跳行移动游标。

ResultSet对象由若干行组成。ResultSet对象一次只能看到一个数据行,使用next()方法,使游标移到下一行记录。

ResultSet对象可以用字段索引(第一列是1,第二列是2等等)为参数,获得对应的字段值(记录中的数据项),如方法getXxx(intcolumnIndex);也可以用字段名为参数,获得对应的字段值(记录中的数据项),如方法getXxx(StringcolumnName)。ResultSet对象的常用方法如表7-1所示。第二十一页,共五十七页,2022年,8月28日表7-1ResultSet类的常用方法返回类型方法名称booleannext()bytegetByte(intcolumnIndex)DategetDate(intcolumnIndex)DoublegetDouble(intcolumnIndex)FloatgetFloat(intcolumnIndex)intgetInt(intcolumnIndex)LonggetLong(intcolumnIndex)StringgetString(intcolumnIndex)第二十二页,共五十七页,2022年,8月28日bytegetByte(StringcolumnName)DategetDate(StringcolumnName)DoublegetDouble(StringcolumnName)FloatgetFloat(StringcolumnName)intgetInt(StringcolumnName)LonggetLong(StringcolumnName)StringgetString(StringcolumnName)第二十三页,共五十七页,2022年,8月28日

[例子7.1]查询英语成绩及格的学生。学生成绩保存在表(students)中,表结构为sudents(number,name,math,english,phics)。在db.mdb库中创建表students。程序结构:程序名:ex7_1.jsp程序算法:

1.分别声明连接类型,语句类型,结果集类型的变量:con/sql/rs。

2.加载驱动程序"sun.jdbc.odbc.JdbcOdbcDriver"。

3.获取连接对象:con4.获取语句对象:sql5.获取结果集对象:rs6.输出表头

7.输出结果集(rs)中的所有记录第二十四页,共五十七页,2022年,8月28日7.5.2游动查询有时,我们需要在结果集中前后移动游标,以便获取某条记录。这时,我们必须返回一个可滚动的结果集。为了获取可滚动的结果集,我们必须使用下述方法先获得一个Statement对象:

Statementstmt=conn.createStatement(inttype,intconcurrency);

通过上述Statement对象获得的结果集是可滚动结果集。可滚动结果集(ResultSet)还可用到的方法如下:

第二十五页,共五十七页,2022年,8月28日publicbooleanprevious()将游标向上移动,该方法返回boolean型数据,当移动结果集第一行之前时返回false。publicvoidbeforeFirst()将游标移到结果集的初始位置,即在第一行之前。publicvoidafterLast()将游标移到结果集最后一行之后publicvoidfirst()将游标移到结果集的第一行。publicvoidlast()将游标移到结果集的最后一行。publicbooleanisAfterLast()判断游标是否在最后一行之后。publicbooleanisBeforeFirst()判断游标是否在第一行之前。第二十六页,共五十七页,2022年,8月28日publicbooleanisFirst()判断游标是否指向结果集的第一行。publicbooleanisLast()判断游标是否指向结果集的最后一行。publicintgetRow()得到当前游标所指向的行号。行号从1开始,如果结果集没有行,返回0。publicbooleanabsolute(introw)将游标移到参数row指定的行号。说明:如果row取负值,就是倒数的行数。asolute(-1)表示移到最后一行,asolute(-2)表示移到倒数第二行。当移到第一行前面或最后一行的后面时,该方法返回false。第二十七页,共五十七页,2022年,8月28日[例子7.2]从表(students)的最后一行开始,以逆序方式输出记录。然后单独输出物理表中的第5条记录。问题分析:从题目要求可知,结果集中的游标必须能上下游动,因此,必须用带参数的createStatement(inttype,intconcurrency)方法创建Statement类型的对象。程序结构:程序名:ex7_2.jsp第二十八页,共五十七页,2022年,8月28日程序算法:1.分别声明连接类型,语句类型,结果集类型的变量:con/sql/rs。2.加载驱动程序"sun.jdbc.odbc.JdbcOdbcDriver"。3.获取连接对象:con4.获取语句对象:sql5.获取结果集对象:rs6.游标移到最后一行7.获取最后一行的行号8.输出记录数9.输出表头10.将游标移动到最后一行之后11.逆序输出输出结果集(rs)中的所有记录(从表的最后一行开始输出记录)12.将游标移到第5条记录13.输出第5条记录。第二十九页,共五十七页,2022年,8月28日7.5.3随机查询[例子7.3]从学生表(students)中随机抽取4条记录,并计算4条记录的数学成绩的平均值。问题分析:产生1到num之间的随机数计算公式如下:inti=(int)(Math.random()*num+1);i的值是1到num之间的随机数。在程序中,根据该随机数,把游标移到相应的行,并输出该行。程序结构:程序名:ex7_3.jsp第三十页,共五十七页,2022年,8月28日程序算法:

1.分别声明连接类型,语句类型,结果集类型的变量:con/sql/rs。2.加载驱动程序"sun.jdbc.odbc.JdbcOdbcDriver"。3.获取连接对象:con4.获取语句对象:sql5.获取结果集对象:rs6.游标移到最后一行7.获取表中记录总数:number8.向vector中添加number个Integer型对象(该对象保存了表的行号)。9.输出表头10.从vector中抽取四个数字对象,以每个数字对象为行号,输出该行号对应的记录。11.求出4条记录数学成绩的平均值,并输出平均值。第三十一页,共五十七页,2022年,8月28日参数查询

[例子7.4]对学生表(students)分别按姓名查询和按成绩查询。问题分析:由三个页面完成此功能。一个页面提供查询输入界面;一个页面按姓名查询数据;一个页面按成绩查询数据。程序结构:

ex7_4.jsp页面提供查询条件输入窗口,按姓名查询时,其姓名参数被提交给byname.jsp页面,按成绩查询时,其成绩参数被提交给byscore.jsp页面。byname.jsp页面查询出指定姓名的学生;byscore.jsp页面查询出指定成绩的学生。三个页面的交互关系如图7-7所示。第三十二页,共五十七页,2022年,8月28日ex7_4.jsp页面byname.jsp页面byscore.jsp页面按姓名查询按分数查询图7-7页面交互关系程序算法:

ex7_4.jsp:1.创建一个表单,该表单包含一个文本框,文 本框用于录入姓名。2.创建一个表单,该表单包含四个文本框,四

个文本框用于录入英语成绩和3.数学成绩的查询范围。第三十三页,共五十七页,2022年,8月28日byname.jsp:1.获取表单中的姓名参数:name2.分别声明连接类型,语句类型,结果集类型的变量:con/sql/rs。3.加载驱动程序"sun.jdbc.odbc.JdbcOdbcDriver"。4.获取连接对象:con5.获取语句对象:sql6.构造SQL语句字符串:condition7.获取结果集对象:rs8.输出表头9.输出结果集(rs)中的所有记录第三十四页,共五十七页,2022年,8月28日byscore.jsp:

1.获取表单中的英语和数学成绩范围:englishmax/englishmin;mathmax/mathmin2.分别声明连接类型,语句类型,结果集类型的变量:con/sql/rs。3.加载驱动程序"sun.jdbc.odbc.JdbcOdbcDriver"。4.获取连接对象:con5.获取语句对象:sql6.构造SQL语句字符串:condition7.获取结果集对象:rs8.输出表头9.输出结果集(rs)中的所有记录第三十五页,共五十七页,2022年,8月28日排序查询可以在SQL语句中使用orderby子句对查询记录进行排序。[例子7.5]对学生表(students)分别按姓名、英语成绩、总成绩进行排序,输出成绩。程序结构:

ex7_5.jsp页面将排序方式提交给byorder.jsp页面;byorder.jsp页面根据排序方式,查询数据并输出。程序算法:

ex7_5.jsp:

创建一个表单,包含三个单选按钮,每个单选按钮代表一种排序方式。

第三十六页,共五十七页,2022年,8月28日byorder.jsp:1.从表单中获取排序方式,保存到变量name中。2.分别声明连接类型,语句类型,结果集类型的变量:con/sql/rs。3.加载驱动程序"sun.jdbc.odbc.JdbcOdbcDriver"。4.获取连接对象:con5.获取语句对象:sql6.构造SQL语句字符串(condition),该串指定了记录的排序方式。7.获取结果集对象:rs8.输出表头9.输出结果集(rs)中的所有记录第三十七页,共五十七页,2022年,8月28日7.5.6使用通配符查询可以用SQL语句操作符"like"进行模式匹配。用"%"代替一个或者多个字符,用一个下划线"_"代替一个字符。例如,下面的SQL语句查询姓氏为"王"的记录。Select*fromstudentswherenamelike‘王%’第三十八页,共五十七页,2022年,8月28日[例子7.6]按姓氏查询表(students)。程序结构:

ex7_6.jsp页面将姓氏参数提交给byname2.jsp页面;byname2.jsp页面按姓氏通配符查询数据。两页面的交互关系如图7-8所示。ex7_6.jsp页面byname2.jsp页面查询图7-8页面交互关系程序算法:

ex7_6.jsp:

创建一个表单,该表单包含一个文本框,可在此文本框中录入姓氏参数。第三十九页,共五十七页,2022年,8月28日byname2.jsp1.获取姓名参数:name2.创建查询通配字符串:name="%"+name+"%"3.分别声明连接类型,语句类型,结果集类型的变量:con/sql/rs。4.加载驱动程序"sun.jdbc.odbc.JdbcOdbcDriver"。5.获取连接对象:con6.获取语句对象:sql7.构造SQL语句字符串:condition8.获取结果集对象:rs9.输出表头10.输出结果集(rs)中的所有记录

第四十页,共五十七页,2022年,8月28日7.6数据更新数据更新操作包括修改数据、添加数据、删除数据。7.6.1修改数据修改数据是根据表中某一关键字,修改满足某些条件的记录。[例子7.7]以姓名为关键字,修改表(students)中的某些数据。程序结构:

ex7_7.jsp页面将要修改的数据提交给newResult.jsp页面;newResult.jsp页面执行数据修改,并将修改后的表数据显示出来。两页面的交互关系如图7-9所示。第四十一页,共五十七页,2022年,8月28日程序算法:ex7_7.jsp1.创建表单,该表单包含4个文本框,分别用于录入关键字姓名(name),数学成绩(math),英语成绩(english),物理成绩(physics)。2.输出修改前表中的数据。ex7_7.jsp页面newResult.jsp页面执行修改图7-9页面交互关系第四十二页,共五十七页,2022年,8月28日

newResult.jsp:1.从表单中获取关键字姓名:name2.从表单中获取修改后的成绩:(newMath/newEnglish/newPhysics)3.分别声明连接类型,语句类型,结果集类型的变量:con/sql/rs。4.加载驱动程序"sun.jdbc.odbc.JdbcOdbcDriver"。5.获取连接对象:con6.获取语句对象:sql7.构造三个SQL语句字符串:condition1/condition2/condition38.执行修改操作9.显示修改后的表的记录。第四十三页,共五十七页,2022年,8月28日添加数据[例子7.8]向表(students)中添加记录。程序结构:

ex7_8.jsp页面将录入的数据提交给newDatabase.jsp页面;newDatabase.jsp页将数据添加到表(students)中,并显示添加数据后表中的记录。两个页面的交互关系如图7-10所示。ex7_8.jsp页面newDatabase.jsp页面添加记录图7-10页面交互关系第四十四页,共五十七页,2022年,8月28日程序算法:ex7_8.jsp:1.创建一个表单,包含5个文本框,分别用于录入学号(number),姓名(name),数学(math),英语(english),物理(physics)成绩。

2.输出添加记录前表(students)中的记录。newDatabase.jsp:1.从表单中获取录入的数据分别保存到以下变量中:number/name/m/e/p。

2.分别声明连接类型,语句类型,结果集类型的变量:con/sql/rs。3.加载驱动程序"sun.jdbc.odbc.JdbcOdbcDriver"。4.获取连接对象:con5.获取语句对象:sql6.构造SQL插入语句字符串:condition。7.执行添加操作8.输出添加记录后的表中全部数据。第四十五页,共五十七页,2022年,8月28日删除数据[例子7.9]以学号为关键字,删除表(students)中的某些数据。程序结构:

ex7_9.jsp页面将要删除的关键字值提交给delete.jsp页面;delete.jsp页面根据关键字的值,删除表中的相应记录。两个页面的交互关系如图7-11所示。ex7_8.jsp页面delete.jsp页面删除记录图7-11页面交互关系第四十六页,共五十七页,2022年,8月28日程序算法:ex7_9.jsp:1.创建一个表单,该表单包含一个文本框(接受学号关键字值的录入)。2.输出删除数据前表的数据。delete.jsp:1.从表单获取关键字段学号的值:number。2.分别声明连接类型,语句类型,结果集类型的变量:con/sql/rs。3.加载驱动程序"sun.jdbc.odbc.JdbcOdbcDriver"。4.获取连接对象:con。5.获取语句对象:sql。6.构造SQL删除语句字符串:deleteALL。7.执行删除操作。8.输出删除记录后的表数据。第四十七页,共五十七页,2022年,8月28日7.7分页显示记录当要显示的数据记录太多时,必须采用分页技术。这里对数据库表中的记录进行分页显示。第四十八页,共五十七页,2022年,8月28日[例子7.10]分页显示表(students)中的数据。问题分析:假设要显示的总记录数为num,每页显示记录数为pageSize,则总页数(pageCount)的计算公式如下:如果num除以pageSize的余数大于0,则总页数等于num除以pageSize的商加1。如果num除以pageSize的余数等于0,则总页数等于num除以pageSize的商。即pageCount=(num%pageSize)==0?(num/pageSize):(num/pageSize+1)如果准备显示第k页的内容,应当把游标移到第(k-1)*pageSize+1条记录处。第四十九页,共五十七页,2022年,8月28日程序结构:程序名:ex7_10.jsp

程序算法:1.设置页面大小:pageSize=8(表示每页8条记录)。2.创建一个表单,该表单包含一文本框,在此框中输入客户想显示的记录的页码号。3.计算表中记录总数:numRow。4.计算分页后总页数:pageCount。5.从表单中获取要显示记录的页码号:showPage。6.计算showPage页的第一条记录在表中的行号:posion。7.使游标指向posion。8.从当前游标开始,输出pageSize条记录。

第五十页,共五十七页,2022年,8月28日7.8网上投票[例子7.11]创建一个网上投票系统。问题分析:首先要创建两个表。一个是ip表,该表用来存放投票人的ip地址,表的结构是ip(ip);一个是candidate表,该表用来存放候选人名单及候选人得票数,表的结构是candidate(name,count)。该系统由三个页面组成。一个页面展示投票界面;一个页面将客户投票选择保存到candidate表中,实现投票统计;一个页面显示投票结果。第五十一页,共五十七页,2022年,8月28日程序结构:

ex7_11.jsp页面将客户的投票选择提交给vote.jsp页面;vote.jsp页面将客户的投票选择保存到candidate表中,并将客户的ip地址保存到ip表中;showvote.jsp页面查看投票结果。三个页面的交互关系如图7-12所示。ex7_11.jsp页面vote.jsp页面showvote.jsp页面投票查看投票结果图7-12页面交互关系第五十二页,共五十七页,2022年,8月28日程序算法:ex7_11.jsp:1.构造一个StringBuffer类型的空对象:nameList2.分别声明连接类型,语句类型,结果集类型的变量:con/sql/rs。3.加载驱动程序"sun.jdbc.odbc.JdbcOdbcDriver"。4.获取连接对象:con5.获取语句对象:sql6.获取结果集对象:rs7.把构成表单的字符串加入nameList对象中8.把构成表格的字符串加入nameList对象中(在表单中加入一个表格)9.把构成表头的字符串加入nameList对象中(表格的表头)10.把rs中的name值和单选按钮分别以字符串的格式加入nameList对象中11.关闭连接对象:con12.将nameList对象中的字符串输出,即输出表单(以表格的方式显示表单数据),该表单为客户提供投票选择(从第1到12步,创建第1个表单)13.创建第2个表单,该表单查看投票情况第五十三页,共五十七页,2022年,8月28日vote.jsp:1.

温馨提示

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

评论

0/150

提交评论