内工大web程序设计第6章 JSP中使用数据库(第2版)_第1页
内工大web程序设计第6章 JSP中使用数据库(第2版)_第2页
内工大web程序设计第6章 JSP中使用数据库(第2版)_第3页
内工大web程序设计第6章 JSP中使用数据库(第2版)_第4页
内工大web程序设计第6章 JSP中使用数据库(第2版)_第5页
已阅读5页,还剩76页未读 继续免费阅读

下载本文档

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

文档简介

第6章

JSP中使用数据库

2主要内容

MySQL数据库管理系统

JDBC

连接MySQL数据库查询/更新/删除记录用结果集更新数据库预处理事务常见数据库连接难点用结果集更新数据库预处理事务第6章导读3

本章讲解如何在JSP中使用JDBC提供的API和数据库进行交互信息。4§6.1.MySQL数据库管理系统MySQL数据库管理系统,简称MySQL,是世界上最流行的开源数据库管理系统,其社区版(MySQLCommunityEdition)是世界上最流行的免费下载的开源数据库管理系统。56.1.1下载、安装与启动MySQL下载

登录选择导航条上的products,在出现的页面的左侧选择“MySQLCommunityEdition”或在出现的页面的右侧选择“下载MySQL社区版”。6

安装

将下载的mysql-5.6.16-win32.zip解压缩到本地计算机即可,比如解压缩到D:\。本教材将下载的mysql-5.6.16-win32.zip解压缩到D:\,形成的安装目录结构如图6.3。7

启动为了启动MySQL数据库服务器,需要执行MySQL安装目录的bin子目录中的mysqld.exe文件。需要打开MS-DOS命令行窗口,并使用MS-DOS命令进入到bin目录中,例如:

cdD:\mysql-5.6.16-win32\bin然后在命令行键入:mysqld

或mysqld-nt启动MySQL数据库服务器。86.1.2建立数据库1.使用MySQL管理工具启动MySQL数据库服务器后,就可以建立数据库,并在数据库中创建表。本教材使用的是Navicat

MySQL管理工具,读者可以登录http:///download下载试用版或购买商业版。下载navicat9_mysql_cs.exe后,安装即可。91)建立连接

启动navicatforMySQL出现如图6.5所示界面,单击图6.5所示界面上的连接,出现如图6.6所示意的界面。在图6.6所示的界面输入如下信息:1.主机名2.端口:3.用户名与密码:102)建立数据库113)创建表启动navicatforMySQL管理器,用鼠标单击曾建立的gengxiangyi连接打开该连接。创建表的步骤如下:①打开数据库②建立表③管理表122.使用MySQL监视器MySQL提供的监视器(MySQLmonitor),允许用户使用命令行方式管理数据库。为了启动MySQL监视器,需要执行MySQL安装目录的bin子目录中的mysql.exe文件,执行格式为:mysql-u用户名密码或mysql-hlocalhost-uroot-p然后按要求输入密码即可。需要再打开一个MS-DOS命令行窗口,并使用MS-DOS命令进入到bin目录中,然后使用默认的root用户启动MySQL监视器。命令如下:mysql–uroot成功启动MySQL监视器后,MS-DOS窗口出现“mysql>”字样效果,如图6.10所示。如果想关闭MySQL监视器,键入exit即可。131)建立数据库在MS-DOS命令行窗口输入SQL语句需要用“;”号结束,在编辑SQL语句的过程中可以使用\c终止当前SQL语句的编辑。下面使用MySQLl监视器创建一个名字为Book的数据库,在当前MySQL监视器占用的命令行窗口输入创建数据库的SQL语句(如图6.11所示):createdatabaseBook;142)为数据库建表CREATETABLEbookList(ISBNvarchar(100)notnull,namevarchar(100)CHARACTERSETgb2312,pricefloat,PRIMARYKEY(ISBN));◆进入数据库“user数据库名;”或“user数据库名”。例:useBook

图6.12所示.◆在数据库Book建立一个名字为bookForm表,该表的字段为ISBN(varchar)name(varchar)price(float)创建bookForm表的SQL语句,如图6.13所示.152)为数据库建表◆添加、更新和查询操作。插入记录的SQL语句:如图6.14(a)所示。insertintobookListvalues('7-302-01465-5','高等数学',28.67);insertintobooklistvalues('7-352-01465-8','大学英语',58.5);◆查询记录的SQL语句select*frombookList;如图6.14(b)所示。163)导入.sql文件中的SQL语句当前MySQL监视器占用的命令行窗口键入如下命令:

sourced:/1000/group.sql导入SQL语句。可以先将需要的SQL语句保存在一个扩展名是.sql的文本文件中,然后使用在MySQL监视器占用的命令行窗口使用source命令导入.sql的文本文件中的SQL语句。group.sql文本文件的内容:173)导入.sql文件中的SQL语句droptablecarList;createtablecarList(numberchar(60)CHARACTERSETgb2312notnull,namechar(50)CHARACTERSETgb2312,pricefloat,yeardate,PRIMARYKEY(number));insertintocarListvalues('加A89CQ8','奔驰','820000','2015-12-26');insertintocarListvalues('洲C12456','宝马','620000','2015-10-10');select*fromcarList;184)删除数据库或表删除数据库的命令:dropdatabase<数据库名>,例如:删除名为tiger的数据库:

dropdatabasetiger;删除表的命令:droptable<表名>,例如,使用book数据库后,执行

droptablebooklist;将删除book数据库中的bookList表19§6.2JDBC

JDBC(JavaDataBaseConnectivity)提供了访问数据库的API,即由一些Java类和接口组成,是Java运行平台的核心类库中的一部分。

我们经常使用JDBC进行如下的操作:与一个数据库建立连接。向已连接的数据库发送SQL语句。处理SQL语句返回的结果。20§6.3连接MySQL数据库

应用程序为了能和数据库交互信息,必须首先和数据库建立连接。目前在开发中常用的连接数据库的方式是加载JDBC-数据库驱动程序。用Java语言编写的数据库驱动程序称作JDBC-数据库驱动程序。JDBC可以调用本地的JDBC-数据库驱动程序和相应的数据库建立连接,如图6.16所示。21§6.3连接MySQL数据库

使用JDBC-数据库驱动程序方式和数据库建立连接需要经过2个步骤加载JDBC-数据库驱动程序和指定的数据库建立连接226.3.1加载JDBC-数据库驱动程序使用JDBC-数据库驱动程序访问数据库时,必须要保证连接数据库的应用程序所驻留的计算机上安装有相应JDBC-数据库驱动程序。登录MySQL的官方网站下载JDBC-数据库驱动程序(JDBCDriverforMySQL)。应用程序加载MySQL的JDBC-数据库驱动程序代码如下:

try{Class.forName("com.mysql.jdbc.Driver");}catch(Exceptione){}236.3.2建立连接_1Java.sql包中的DriverManager类有两个用于建立连接的类方法:ConnectiongetConnection(java.lang.String,java.lang.String,java.lang.String)ConnectiongetConnection(java.lang.String)数据库服务器占用的端口是3306,假设MySQL数据库服务器所驻留的计算机的IP地址是。应用程序要和warehouse建立连接,用户的id和密码分别是root、99。24

那么使用ConnectiongetConnection(java.lang.String,java.lang.String,java.lang.String)方法建立连接的代码如下:try{Stringuri="jdbc:mysql://:3306/warehouse";Stringuser="root";Stringpassword="99";con=DriverManager.getConnection(uri,user,password);}catch(SQLExceptione){System.out.println(e);}6.3.2建立连接_1256.3.2建立连接_2◆使用ConnectiongetConnection(java.lang.String)

方法建立连接的代码如下:try{Stringuri="jdbc:mysql://:3306/warehouse?user=root&password=99";con=DriverManager.getConnection(uri);}catch(SQLExceptione){

System.out.println(e);}交互信息,比如查询、修改、更新表中的记录。266.3.2建立连接_2在某些Web程序中需要避免操作数据库出现中文乱码,那么需要使用ConnectiongetConnection(java.lang.String)方法建立连接,连接中的代码是(假设用户是root,其密码是99):Stringuri="jdbc:mysql:///warehouse?"+"user=root&password=99&characterEncoding=gb2312";con=DriverManager.getConnection(uri);

应用程序一旦和某个数据库建立连接,就可以通过SQL语句和该数据库中的表交互信息,比如查询、修改、更新表中的记录。276.3.3MySQL乱码解决方案

用JSP页面访问MySQL数据库时(更新和插入记录)可能出现“中文乱码”问题。1.数据库和表使用支持中文的字符编码

如果使用MySQL监视器创建数据库,可以在创建数据库时指定数据库使用的字符编码:

create数据库名CHARACTERSET字符编码例如,创建名字是people的数据库

createpeopleCHARACTERSETgb2312281.数据库和表使用支持中文的字符编码创建表时,可以指定某个字段使用的字符编码(否则是默认的字符编码,不支持中文):

字段名类型CHARACTERSET字符编码例如,建立名字是myList的表,并让其中的name字段使用gb2312编码:createtablemyList(id`intNOTNULLauto_increment,namevarchar(100)CHARACTERSETgb2312,PRIMARYKEY(id));292.连接数据库支持中文编码JSP中连接MySQL数据库时,需要使用

ConnectiongetConnection(java.lang.String)方法建立连接,向方法参数传递的字符串的基本格式为:"jdbc:mysql://地址/数据库?user=用户&password=密码&characterEncoding=gb2312";

例如,假设数据名是book,用户是root,密码为99。那么连接方式是:Connectioncon;Stringuri="jdbc:mysql:///book?user=root&password=99&characterEncoding=gb2312";con=DriverManager.getConnection(uri);30例子1

例子1是一个简单的JSP页面,该页面中的Java程序片代码负责加载JDBC-驱动程序,并连接到数据库warehouse,查询product表中price字段值大于3000的全部记录(见6.1节曾建立的warehouse数据库),页面运行效果如图6.17。31§6.4查询记录

JDBC和数据库表进行交互的主要方式是使用SQL语句(其他方式见6.8节),JDBC提供的API可以将标准的SQL语句发送给数据库,实现和数据库的交互。对一个数据库中表进行查询操作的具体步骤如下:1.向数据库发送SQL查询语句

Statement声明一个SQL语句对象,然后让已创建的连接对象con调用方法createStatement()创建这个SQL语句对象。try{Statementsql=con.createStatement();}catch(SQLExceptione){System.out.println(e);

}32§6.4查询记录2.处理查询结果

有了SQL语句对象后,这个对象就可以调用相应的方法查询数据库中表,并将查询结果存放在一个ResultSet对象中。ResultSetrs=sql.executeQuery("SELECT*FROMproduct");ResultSetrs=sql.executeQuery("SELECTname,priceFROMproduct");33表6.1ResultSet类的若干方法346.4.1顺序查询

如何知道一个表中有哪些字段?1.与数据库建立的连接对象con调方法getMetaData返回一个DatabaseMetaData对象.

DatabaseMetaDatametadata=con.getMetaData();2.Metadata对象再调用getColumns()方法可以将表的字段信息以行列的形式存储在一个ResultSet对象中。ResultSettableMessage=metadata.getColumns(null,null,"product",null);表的字段信息以行列的形式存储在tableMessage对象中.如果product表有n个字段,tableMessage就刚好有n行、每行4列。每行分别含有和相应字段有关的信息,信息的次序为:“数据库名”、“数据库扩展名”、“表名”,“字段名”。356.4.1顺序查询

3.

tableMessage对象调用next方法使游标向下移动一行,然后tableMessage调用getXXX方法可以查看该行中列的信息,其中最重要的信息是第4列,该列上的信息为字段的名字。36例子2example6_2.jsp提交数据源和表名inquire.jsp调用tag查询数据库QueryTag.tag

查询数据库并返回结果

376.4.2随机查询

为了在结果集中可以前后移动,随机显示若干记录,必须要返回一个可滚动的结果集。

Statementstmt=con.createStatement(inttype,intconcurrency);ResultSetre=stmt.executeQuery(SQL语句);

inttype,intconcurrency取值情况及ResultSet常用方法如下:type的取值决定滚动方式,取值可以是:◆ResultSet.TYPE_FORWORD_ONLY:结果集的游标只能向下滚动。386.4.2随机查询◆ResultSet.TYPE_SCROLL_INSENSITIVE:结果集的游标可以上下移动,当数据库变化时,当前结果集不变。Concurrency取值决定是否可以用结果集更新数据库,Concurrency取值:◆ResultSet.CONCUR_READ_ONLY不能用结果集更新数据库中的表。◆ResultSet.CONCUR_UPDATABLE能用结果集更新数据库中的表。39例子3406.4.3条件查询

在JSP页面中输入查询条件,Tag文件可以根据JSP提交的条件进行查询。例子4416.4.4排序查询

可以在SQL语句中使用ORDERBY子语句,对记录排序。在JSP页面中输入排序方式,Tag文件可以根据JSP提交的数据进行排序查询。

例如,按price排序查询的SQL语句:

SELECT*FROMproductORDERBYprice。42例子5436.4.5模糊查询

可以用SQL语句操作符LIKE进行模式般配,使用“%”表示零个或多个字符,用一个下划线“_”表示任意一个字符。比如,下述语句查询产品名称中含有“戴”的记录:rs=sql.executeQuery(“SELECT*FROMproductWHEREnameLIKE

‘%戴%'");44例子6为了避免出现中文乱码(比较字段值中可能有中文),例子中数据库的连接方式采用(见6.3.3):"jdbc:mysql://地址/数据库?user=用户&password=密码&characterEncoding=gb2312";§6.5更新记录45

可以使用SQL语句更新记录中字段的值。

Statement对象调用方法:

publicintexecuteUpdate(StringsqlStatement);

通过参数sqlStatement指定的方式实现对数据库表中记录的字段值更新。例如:executeUpdate("UPDATEproductSETprice=6866WHEREname='海尔电视机'");46

例子7(example6_7.jsp)更新数据库warehouse中的product表。例子7根据number字段,更新product表中记录的name、madeTime、price字段的值。为了避免出现中文乱码,例子中数据库的连接方式采用:"jdbc:mysql://地址/数据库?user=用户&password=密码&characterEncoding=gb2312";

47§6.6添加记录

可以使用SQL语句添加新的记录。

Statement对象调用方法:

publicintexecuteUpdate(StringsqlStatement);

通过参数sqlStatement指定的方式实现向数据库表中添加新的记录。例如:executeUpdate("INSERTINTOstudentsVALUES('012','神通手机’,'2010-2-26',2687)");48例子8(example6_8.jsp)向数据库warehouse中的product表添加新的记录(见6.1.2创建的数据库)。example6_8.jsp页面提交新的记录到newDatabase.jsp页面,该页面调用Tag文件AddRecord.tag添加新记录到product表。为了避免出现中文乱码,例子中数据库的连接方式采用(见6.3.3):"jdbc:mysql://地址/数据库?user=用户&password=密码&characterEncoding=gb2312";49§6.7删除记录

可以使用SQL语句删除记录。

Statement对象调用方法:

publicintexecuteUpdate(StringsqlStatement);

删除数据库表中的记录。例如:executeUpdate("DELETEFROMproductWHEREnumber='888'");50例子9(example6_9.jsp)删除数据库warehouse中的product表的某项记录(见6.1.2创建的数据库)。example6_9.jsp页面提交被删除的记录的number字段的值到delete.jsp页面,delete.jsp页面调用Tag文件DelRecord.tag删除相应的记录。51§6.8用结果集操作数据库中的表

尽管可以用SQL语句对数据库中表进行更新、插入操作,但也可以使用内存中ResultSet对象对底层数据库表进行更新和插入操作,优点是不必熟悉有关更新、插入的SQL语句,而且方便编写代码,缺点是,必须要事先返回结果集。为了避免出现中文乱码,数据库的连接方式采用:

"jdbc:mysql://地址/数据库?user=用户&password=密码&characterEncoding=gb2312“;52§6.8用结果集操作数据库中的表首先,必须得到一个可滚动的ResultSet对象,例如:Stringuri="jdbc:mysql:///warehouse?"+"user=root&password=&characterEncoding=gb2312";con=DriverManager.getConnection(uri);Statementsql=con.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_UPDATABLE);ResultSetrs=sql.executeQuery("SELECT*FROMproduct");536.8.1更新记录中的列值

使用结果集更新数据库表中第n行记录中某列的值的步骤是:1.结果集rs的游标移动到第n行让结果集调用absolute()方法将游标移到第n行:rs.absolute(n);2.结果集将第n行的p列的列值更新

结果集可以使用下列方法更新列值(部分):updateInt(StringcolumnName,intx),updateInt(intcolumnIndexintx)updateLong(StringcolumnName,longx),updateLong(intcolumnIndex,longx)546.8.1更新记录中的列值3.更新数据库中的表最后,结果集调用updateRow()方法,用结果集中的第n行更新数据库表中的第n行记录。以下代码片段更新product表中的第3行记录的name列(字段)的值。

rs.absolute(3);

rs.updateString(2,"IBMPC");//也可以写成rs.updateString("name","IBMPC");

s.updateRow();556.8.2插入记录使用结果集向数据库表中插入一行记录步骤是:1.结果集rs的游标移动到插入行结果集中有一个特殊区域,用作构建要插入的行的暂存区域(stagingarea),习惯上将该区域位置称做结果集的插入行。为了向数据库表中插入一行新的记录,必须首先将结果集的游标移动到插入行,代码如下:

rs.moveToInsertRow();566.8.2插入记录2.更新插入行的列值结果集可以用updateXXX()方法更新插入行的列值,例如:rs.updateString(1,"c002");rs.updateString(2,"IBMiPad");rs.updateDate(3,Date());rs.updateDouble(4,5356);3.插入记录最后,结果集调用insertRow()方法用结果集中的插入行向数据库表中插入一行新记录。57

例子10(

example6_10.jsp)向数据库warehouse中的product表插入记录(见6.1.2创建的数据库)。example6_10.jsp提交新的记录到newRecord.jsp页面,该页面调用Tag文件InsertRecord.tag插入新记录到product表。58§6.9预处理语句

Java提供了更高效率的数据库操作机制,就是PreparedStatement对象,该对象被习惯地称作预处理语句对象。本节学习怎样使用预处理语句对象操作数据库中的表。596.9.1预处理语句优点

当向数据库发送一个SQL语句,如“Select*Fromproduct”,数据库库中的SQL解释器负责将把SQL语句生成底层的内部命令,然后执行该命令,完成有关的数据操作。如果不断地向数据库提交SQL语句势必增加数据库中SQL解释器的负担,影响执行的速度。如果应用程序能针对连接的数据库,事先就将SQL语句解释为数据库底层的内部命令,然后直接让数据库去执行这个命令,显然不仅减轻了数据库的负担,而且也提高了访问数据库的速度。60Connection连接对象con调用prepareStatement(Stringsql)方法:PreparedStatementpre=con.prepareStatement(Stringsql);对参数sql指定的SQL语句进行预编译处理,生成该数据库底层的内部命令,并将该命令封装在PreparedStatement对象pre中,那么该对象调用下列方法都可以使得该底层内部命令被数据库执行:ResultSetexecuteQuery()booleanexecute()intexecuteUpdate()

只要编译好了PreparedStatement对象pre,那么pre可以随时地执行上述方法,显然提高了访问数据库的速度。61例子11

例子11使用预处理语句来查询warehouse数据库中product表的全部记录。626.9.2使用统配符

在对SQL进行预处理时可以使用统配符“?”来代替字段的值,只要在预处理语句执行之前再设置统配符所表示的具体值即可。例如:prepareStatementpre=con.prepareStatement("SELECT*FROMproductWHEREprice<?");那么在sql对象执行之前,必须调用相应的方法设置统配符“?”代表的具体值。比如:pre.setDouble(1,6565);指定上述预处理语句pre中统配符“?”代表的值是6565。63通配符按着它们在预处理的“SQL语句”中从左至右依次出现的顺序分别被称做第1个、第2个…第m个统配符。如方法voidsetDouble(intparameterIndex,intx);用来设置通配符的值,其中参数parameterIndex用来表示SQL语句中从左到右的第parameterIndex个统配符号,x是该统配符所代表的具体值。64尽管pre=con.prepareStatement("SELECT*FROMproductWHEREprice<?");pre.setDouble(1,6565);的功能等同于pre=con.prepareStatement("SELECT*FROMmessageWHEREprice<6565");但是,使用统配符可以使得应用程序更容易动态地改变SQL语句中关于字段值的条件。预处理语句设置统配符“?”的值的常用方法有:voidsetDate(intparameterIndex,Datex)等。65例子12

例子12中,example6_12.jsp提交新的记录到insertRecord.jsp页面,该页面调用Tag文件PrepareInsert.tag添加新记录到product表(有关product表见6.1.2节)。另外例子12中还用到了例子11中的PrepareTag.tag文件,该文件负责查询product表中的记录。66§6.10事务

事务由一组SQL语句组成,所谓“事务处理”是指:应用程序保证事务中的SQL语句要么全部都执行,要么一个都不执行。事务是保证数据库中数据完整性与一致性的重要机制。JDBC事务处理步骤如下:1setAutoCommit(booleanautoCommit)方法

为了能进行事务处理,必须关闭连接对象

con的默认设置。

con.setAutoCommit(false);67§6.10事务

2.commit()方法

连接对象con调用commit()方法就是让事务中的SQL语句全部生效。

mit();3.rollback()方法

连接对象con调用rollback()方法,撤消事务中成功执行过的SQL语句对数据库数据所做的更新、插入或删除操作,即撤消引起数据发生变化的SQL语句操作,将数据库中的数据恢复到commi()方法执行之前的状态。

con.rollback();68例子1369§6.11常见数据库连接6.11.1连接MicrosoftSQLServer数据库登录/zh-cn/download/default.aspx(微软的下载中心),然后在热门下载里选择选项:服务器,然后选择下在MicrosoftSQLServer2012Express以及相应的管理工具:MicrosoftSQLServer2008ManagementStudioExpress或MicrosoftSQLServerManagementStudioExpress。1.MicrosoftSQLServer2012702.建立数据库

打开SSMS提供的“对象资源管理器”,将出现相应的操作界面,如图6.29所示界面。

图6.29所示的界面上的“数据库”目录下是已有的数据库的名称,在“数据库”目录上单击鼠标右键可以建立新的数据库,比如建立名称是warehouse的数据库。创建好数据库后,就可以在该中建立若干个表。如果准备在warehouse数据库中创建名字为product的表,那么可以用鼠标单击“数据库”下的warehouse数据库,在warehouse管理的“表”的选项上单击右键,选择“新建表”,将出现相应的建表界面。713.加载针对SQLServer的JDBC数据库驱动程序

登录下载MicrosoftJDBCDriver4.0forSQLServer即下载sqljdbc_1.1.1501.101_enu.exe。应用程序加载SQLServer驱动程序代码如下:try{Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");}catch(Exceptione){}724.建立连接建立连接的代码如下:try{Stringuri="jdbc:sqlserver://:1433;DatabaseName=warehouse";Stringuser="sa";Stringpassword="dog123456“;con=DriverManager.getConnection(uri,user,password);}catch(SQLExceptione){System.out.println(e);}736.11.2连接Oracle数据库1.加载驱动程序

Class.forName("oracle.jdbc.driver.OracleDriver").newInstance();2.建立连接Connectioncon=DriverManager.getConnection("jdbc:oracle:thin:@主机:端口号:数据库名","用户名","密码");例如:Stringuser="scott";Stringpassword="tiger";con=DriverManager.getConnection(“jdbc:o

温馨提示

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

评论

0/150

提交评论