版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第8章JSP中使用数据库主要内容MySQL数据库管理系统连接MySQL数据库
查询记录更新、添加与删除记录用结果集操作数据库中的表预处理语句事务分页显示记录连接SQLServer与Access数据库使用连接池标准化考试训练难点分页显示记录使用连接池标准化考试训练关键实践小星星广告网8.1MySQL数据库管理系统MySQL数据库管理系统,简称MySQL,是目前流行的开源数据库管理系统,其社区版(MySQLCommunityEdition)是可免费下载的开源数据库管理系统。MySQL最初由瑞典MySQLAB公司开发,目前由Oracle公司负责源代码的维护和升级。Oracle将MySQL分为社区版和商业版,并保留MySQL开放源码这一特点。目前许多Web开发项目都选用社区版MySQL,其主要原因是社区版MySQL的性能卓越,满足许多Web应用已经绰绰有余,而且社区版MySQL是开源数据库管理系统,可以降低软件的开发和使用成本。8.1MySQL数据库管理系统8.1.1下载、安装MySQL1.下载/downloads/mysql/选择Windows(x86,64-bit),ZIPArchive8.0.18(272.3M)这里我们下载的是mysql-8.0.18-winx64.zip(适合64位机器的Windows版)。2.安装将下载的mysql-8.0.18-winx64.zip解压缩到本地计算机,比如解压缩到D:\。本教材将下载的mysql-8.0.18-winx64.zip解压缩到D:\8.1MySQL数据库管理系统8.1.2启动MySQL数据库服务器1.启动■(安全初始化)首次启动之前必须进行安全初始化(以管理员身份启动命令行窗口).使用命令行进入MySQL安装目录的bin子目录,键入mysqld--initialize-insecure命令,回车确认.D:\mysql-8.0.18-winx64\bin>mysqld--initialize-insecure初始化后,必须用管理员身份(在cmd.exe上单击鼠标右键,选择以管理员身份运行cmd)启动命令行窗口,然后进入MySQL安装目录的bin子目录下键入mysqld或mysqld-nt,回车确认启动MySQL数据库服务器(以后再启动MySQL就不要再初始化了,以免引起系统混乱),MySQL服务器占用的端口是3306(3306是MySQL服务器默认使用的端口号)。启动成功后(无任何提示信息),MySQL数据库服务器将占用当前MS-DOS窗口8.1MySQL数据库管理系统8.1.2启动MySQL数据库服务器2.root用户MySQL8.0版本必须对root用户进行身份确认,否则将导致MySQL8.0自带的mysql客户端程序,以及其他的客户端程序,如NavicatforMySQL等无法访问MySQL8.0数据库服务器。再用管理员身份打开另一个命令行窗口(在cmd.exe上单击鼠标右键,选择以管理员身份运行cmd)D:\mysql-8.0.18-winx64\bin>mysqladmin-uroot-ppassword回车确认后,将提示输入root的当前密码(无密码就直接回车确认,初始是无密码),如果输入正确,将继续提示输入root的新密码(如果新密码仍然保持是无密码,就直接回车确认),以及确认新密码。本教材始终让root用户的密码是无密码(默认是无密码)8.1MySQL数据库管理系统8.1.3MySQL客户端管理工具所谓MySQL客户端管理工具,就是专门让客户端在MySQL服务器上建立数据库的软件。可以下载图形用户界面(GUI)的MySQL管理工具,并使用该工具在MySQL服务器上进行创建数据库、在数据库中创建表等操作,MySQL管理工具有免费的也有需要购买的。例如NavicatforMySQL,登录:/download下载试用版或购买商业版,例如下载navicat121_mysql_cs_x64.exe,安装即可。1.命令行客户端打开一个新的命令行窗口(不必管理员身份),进入MySQL安装目录下的bin子目录。运行mysql:mysql-hip-uroot-p对于本机调试(即客户端和数据库服务器同机),执行格式为:mysql-uroot-p然后按要求输入密码即可(如果密码是空,可以不输入密码)。8.1MySQL数据库管理系统8.1.3MySQL客户端管理工具启动命令行客户端后就可以使用SQL语句进行创建数据库、建表等操作。在MS-DOS命令行窗口输入SQL语句需要用“;”号结束,在编辑SQL语句的过程中可以使用\c终止当前SQL语句的编辑。需要提醒的是,可以把一个完整的SQL语句命令分成几行来输入,最后用分号作结束标志即可。2.创建数据库创建一个名字为bookDatabase的数据库删除已有数据库:dropdatabasebookDatabase;createdatabasebookDatabase;8.1MySQL数据库管理系统8.1.3MySQL客户端管理工具3.建表为了在数据库中创建表,必须首先进入该数据库(即使用数据库),命令格式是:“user数据库名;”或“user数据库名”。在当前命令行客户端管理工具占用的命令行窗口输入:usebookDatabase回车确认(进入数据库也可以没有分号)进入数据库bookDatabase创建bookList表:createtablebookList(ISBNvarchar(100)notnull,namevarchar(100)charactersetgb2312,pricefloat,publishDatedate,primarykey(ISBN));8.1MySQL数据库管理系统8.1.3MySQL客户端管理工具3.建表创建bookList表之后就可以使用SQL语句对bookList表进行添加、更新和查询等操作(如果已经退出数据库,需要再次进入数据库)。在当前命令行客户端占用的窗口键入插入记录的SQL语句(如图8.10所示。),记录之间用逗号分隔:insertintobookListvalues('7302014655','高等数学',28.67,'2020-12-10'),('7352014658','大学英语',58.5,'1999-9-10'),('7987302464259','Java2实用教程第5版',59.5,'2017-5-1');8.1MySQL数据库管理系统8.1.3MySQL客户端管理工具4.导入.sql文件中的SQL语句在使用命令行客户端时,如果觉得在命令行输入SQL语句不方便,那么可以事先将需要的SQL语句保存在一个扩展名是.sql的文本文件中,然后在命令行客户端占用的命令行窗口使用source命令导入.sql文件中的SQL语句。a.sql如下:a.sqlinsertintobookListvalues('8302084658','月亮湾',38.67,'2021-12-10'),('9352914657','雨后',78,'1998-5-19'),('9787302198048','Java设计模式',29,'1999-5-16'),('97873902488644','Java课程设计第3版',32,'2018-1-10');select*frombookList;在当前命令行客户端占用的窗口键入如下命令:sourceD:/myFile/a.sql回车确认,导入sql文件中的SQL语句。如果a.sql文件中存在错误的SQL语句,将提示错误信息,否则将成功执行这些SQL语句8.1MySQL数据库管理系统8.1.3MySQL客户端管理工具5.删除数据库或表删除数据库的命令:dropdatabase<数据库名>,例如:删除名为tiger的数据库:dropdatabasetiger;删除表的命令:droptable<表名>,例如,使用bookDatabase数据库后,执行:droptablebooklist;将删除bookDatabase数据库中的bookList表。6.使用NavicatforMySQL登录:/download下载试用版或购买商业版,例如下载试用版navicat121_mysql_cs_x64.exe8.2连接MySQL数据库1.下载JDBC-MySQL数据库连接器表为了使Java编写的程序不依赖于具体的数据库,Java提供了专门用于操作数据库的API,即JDBC(JavaDataBaseConnectivity)。JDBC操作不同的数据库仅仅是加载的数据库连接器不同以及和数据库建立连接的方式不同而已,使用JDBC的应用程序和数据库建立连接之后,就可以使用JDBC提供的API操作数据库。/downloads/connector/j/下载的是mysql-connector-j-9.7.0.zip(linux系统可下载tar.gz格式文件),将该zip文件解压至硬盘,在解压目录下的mysql-connector-j-9.7.0.jar文件就是连接MySQL数据库的JDBC-MySQL数据库连接器(作者也将该文件放在了教学资源的源代码文件夹中)。■将MySQL数据库的JDBC-MySQL数据库连接器mysql-connector-j-9.7.0.jar保存到Tomcat安装目录下的lib文件夹中(例如D:\apache-tomcat-11.0.22\lib)★重新启动Tomcat服务器。8.2连接MySQL数据库2.加载JDBC-MySQL数据库连接器try{Class.forName("com.mysql.cj.jdbc.Driver");}catch(Exceptione){}MySQL数据库驱动是mysql-connector-java-8.0.18.jar文件中的Driver类,该类的包名是com.mysql.cj.jdbc.Driver(包名和以前的版本:com.mysql.jdbc.Driver不同)。Driver类不是Java运行环境类库中的类,是连接器mysql-connector-java-8.0.18.jar中的类JDBC操作不同的数据库仅仅是加载的数据库连接器不同以及和数据库建立连接的方式不同而已,使用JDBC的应用程序和数据库建立连接之后,就可以使用JDBC提供的API操作数据库.8.2连接MySQL数据库3.连接数据库Connectioncon;Stringurl="jdbc:mysql://:3306/bookDatabase?useSSL=false&serverTimezone=GMT";Stringuser="root";Stringpassword="";try{con=DriverManager.getConnection(url,user,password);//连接代码}catch(SQLExceptione){System.out.println(e);}4.注意汉字问题需要特别注意的是,如果数据库的表中的记录有汉字,那么在建立连接时需要额外多传递一个参数characterEncoding,并取值gb2312或utf-8Stringurl="jdbc:mysql://localhost/bookDatabase?"+"useSSL=false&serverTimezone=GMT&characterEncoding=utf-8";con=DriverManager.getConnection(url,"root","");8.2连接MySQL数据库5.时区设置Connectioncon;Stringurl="jdbc:mysql://:3306/bookDatabase?useSSL=false&serverTimezone=Asia/Shanghai";Stringuser="root";Stringpassword="";try{con=DriverManager.getConnection(url,user,password);//连接代码}catch(SQLExceptione){System.out.println(e);}对于MySQL8.0和后续版本,必须要设置serverTimezone参数的值(值可以是MySQL8.0支持的时区之一即可,例如EST,CST,GMT等)。对于中国标准时间,可以把serverTimezone的取值设置为
Asia/Shanghai8.2连接MySQL数据库例子8_1是一个简单的JSP页面,该页面中的Java程序片代码负责加载JDBC-驱动程序,并连接到数据库bookDatabase,查询bookList表中的全部记录(见8.1.3节曾建立的bookDatabase数据库)。例子8_1example8_1.jsp8.3查询记录和数据库建立连接后,就可以使用JDBC提供的API与数据库交互信息,比如查询、修改和更新数据库中的表等。JDBC与数据库表进行交互的主要方式是使用SQL语句(其他方式见8.5节)。JDBC提供的API可以将标准的SQL语句发送给数据库,实现和数据库的交互。8.3.1结果集与查询对一个数据库中的表进行查询,然后将查询结果返回到一个ResultSet对象中,习惯称ResultSet对象为结果集对象。SQL查询语句与结果集连接对象con调用方法createStatement()返回SQL语句对象,代码如下:try{Statementsql=con.createStatement();}catch(SQLExceptione){System.out.println(e);}8.3查询记录8.3.1结果集与查询■结果集sql对象就可以调用相应的方法查询数据库中的表,并将查询结果存放在一个ResultSet结果集中。ResultSet结果集由以列(也称字段)为结构的数据行组成。例如,对于ResultSetrs=sql.executeQuery("SELECT*FROMbookList");内存中的结果集对象rs的列数是4列,刚好和bookList表的列数相同,第1列至第4列分别是ISBN、name、price和publishDate列;而对于ResultSetrs=sql.executeQuery("SELECTname,priceFROMbookList");结果集对象rs只有两列,第1列是name列,第2列是price列。■ResultSet结果集一次只能看到一个数据行,使用next()方法可走到下一数据行。获得一行数据后,ResultSet结果集可以使用getXxx(intcolumnIndex)或getXxx(StringcolumnName)方法获得字段值(列值)无论列(字段)是何种属性,总可以使用getString(intcolumnIndex)或getString(StringcolumnName)方法返回列(字段)值的串表示。8.3查询记录8.3.2随机查询默认的ResultSet结果集使用next()方法顺序地查询记录,但有时候需要在结果集中前后移动、显示结果集指定的一条(一行)记录或随机显示若干条记录等。这时,必须返回一个可滚动的结果集(结果集的游标可以上下移动)。
Statementstmt=con.createStatement(inttype,intconcurrency);ResultSetre=stmt.executeQuery(SQL语句);type:
ResultSet.TYPE_FORWORD_ONLYResultSet.TYPE_SCROLL_INSENSITIVE:结果集的游标可以上下移动,当数据库变化时,当前结果集不变。ResultSet.TYPE_SCROLL_SENSITIVE:结果集的游标可以上下移动,当数据库变化时,当前结果集同步改变。Concurrency:
ResultSet.CONCUR_READ_ONLY:不能用结果集更新数据库中的表。
ResultSet.CONCUR_UPDATABLE:能用结果集更新数据库中的表。8.3查询记录8.3.2随机查询例子8_2随机查询bookDatabase数据库中bookList表的3条记录.例子中首先将游标移动到最后一行,然后再获取最后一行的行号,以便获得bookList表中的记录数目。例子中的int[]getRandomNumber(intmax,intamount)方法返回1至max之间的amount个不同的随机数。例子8_2example8_2.jsp8.3查询记录8.3.3条件查询一般格式:select字段from表名where条件(1)字段值和固定值比较,例如:selectname,pricefrombookListwherename='高等数学'(2)字段值在某个区间范围,例如:select*frombookListwhereprice>28.68andprice<=87.7select*frombookListwhereprice>56andname!='月亮湾'使用某些特殊的日期函数,如year,month,day:select*frombookListwhereyear(publishDay)<1980select*frombookListwhereyear(publishDay)between2015and2020(3)用操作符like进行模式般配,使用%代替0个或多个字符,用一个下划线_代替一个字符。例如查询name含有“程序”二字的记录:
select*frombookLidtwherenamelike'%程序%'1.where子语句8.3查询记录8.3.3条件查询用orderby子语句对记录排序,select*from表名orderby字段名(列名)select*from表名where条件orderby字段名(列名)例如:select*frombookListorderbypriceselect*frombookListwherenamelike'%编程%'orderbyname将例子8_1中的查询bookList表中SQL语句:StringSQL="SELECT*FROMbookList";替换成:StringSQL="select*frombookList"+"whereyear(publishDate)between1999and2021andprice>=30"+"orderbypublishDate";2.排序8.4更新、添加与删除记录update表set字段=新值where<条件子句>updatebookListsetpublishDate='2019-12-26'wherename='大学英语'例如:sql.executeUpdate("updatebookListsetpublishDate='2019-12-26'wherename='大学英语'");1.更新
publicintexecuteUpdate(StringsqlStatement);通过参数sqlStatement指定的方式实现对数据库表中记录的更新、添加和删除操作2.添加insertinto表(字段列表)values(对应的具体的记录)或insertinto表values(对应的具体的记录)insertintobookListvalues('2306084657','春天',35.8,'2020-3-20'),('5777564629','冬日',29.9,'2019-12-23')8.4更新、添加与删除记录8.4更新、添加与删除记录deletefrom表名where<条件子句>deletefrombookListwhereISBN='9352914657'3.删除例子8_3将bookList表中name值为“大学英语”的记录的publishDate字段的值更新为'2019-12-26',向bookList表中添加2条新的记录:('2306084657','春天',35.8,'2020-3-20')和('5777564629','冬日',29.9,'2019-12-23'),删除了ISBN字段值为9352914657的记录.例子8_3example8_3.jsp8.5用结果集操作数据库中的表■更新记录(1)游标移动到第n行:rs.absolute(n);(2)结果集rs将第n行的column列的列值更新。rs.updateDate(intcolumn,Datex);(3)更新数据库中的表。最后,结果集rs调用updateRow()方法用结果集中的第n行更新数据库表中的第n行记录。rs.updateRow();例如:rs.absolute(3);rs.updateString(2,"操作系统");rs.updateRow();步骤:8.5用结果集操作数据库中的表■插入记录(1)将结果集rs的游标移动到插入行。rs.moveToInsertRow();(2)更新插入行的列值。设置插入行的列值:rs.updateString(1,"7307014659");rs.updateString(2,"数据结构");rs.updateFloat(3,58);rs.updateDate(4,'2020-08-10');(3)最后,结果集调用insertRow()方法用结果集中的插入行向数据库表中插入一行新记录:rs.insertRow()步骤:8.5用结果集操作数据库中的表例子8_4将bookList表中ISBN值为8302084658的price的值更新为56,向bookList表中添加2条新的记录:('8306084656','四月天',39.2,'2020-5-20')和('6777564622','Java面向对象程序设计第3版(微课版)',59.9,'2020-1-23')。例子8_4example8_4.jsp8.6预处理语句Java提供了更高效率的数据库操作机制,就是PreparedStatement对象。8.6.1预处理语句优点减轻数据库的负担,也提高了访问数据库的速度。■步骤1.Connection连接对象con调用prepareStatement(Stringsql)方法:
PreparedStatementpre=con.prepareStatement(Stringsql);对参数sql指定的SQL语句进行预编译处理,生成该数据库底层的内部命令,并将该命令封装在PreparedStatement对象pre中。2.pre对象调用下列方法都可以使得该底层内部命令被数据库执行:ResultSetexecuteQuery()booleanexecute()(执行成功返回false)intexecuteUpdate()(执行成功返回1)只要编译好了PreparedStatement对象pre,那么pre可以随时执行上述方法,显然提高了访问数据库的速度。8.6预处理语句8.6.1预处理语句优点例子8_5使用预处理语句来查询bookDatabase数据库中bookList表的全部记录(有关bookList表见8.1.3小节),请比较例子8_5和例子8_1的不同之处。例子8_5example8_5.jsp8.6.2使用通配符在对SQL进行预处理时可以使用通配符?(英文问号)来代替字段的值,只要在预处理语句执行之前再设置通配符所表示的具体值即可。例如:pre=con.prepareStatement("SELECT*FROMbookListWHEREprice<?");在sql对象执行之前,必须调用相应的方法设置通配符?代表的具体值,比如:pre.setFloat(1,65);指定上述预处理语句pre中通配符?代表的值是65。通配符按照它们在预处理的“SQL语句”中从左至右依次出现的顺序分别被称作第1个、第2个……第m个通配符。8.6预处理语句8.6.2使用通配符例子8_6使用预处理语句(注意通配符?的用法)将bookList表中name值为“大学英语”和“高等数学”的publishDate的值分别更新为2021-2-10和2021-6-20,向bookList表中添加2条新的记录:(92306084659','数据库原理',56.9,'2019-2-10')和('82306884758','计算机组成原理',66.7,'2020-8-10')。例子8_6example8_6.jsp8.7事务事务由一组SQL语句组成。所谓“事务处理”是指应用程序保证事务中的SQL语句要么全部都执行,要么一个都不执行。1.事务2.事务处理事务处理是保证数据库中数据完整性与一致性的重要机制。应用程序和数据库建立连接之后,可能使用多条SQL语句操作数据库中的一个表或多个表。一个管理资金转账的应用程序为了完成一个简单的转账业务可能需要两条SQL语句,比如,有户geng给另一个用户zhang转帐50元,那么需要一条SQL语句完成将用户geng的userMoney的值由原来的100更改为50(减去50的操作),另一条SQL语句完成将zhang的用户的userMoney的值由原来的20更新为70(增加50的操作)。应用程序必须保证这两条SQL语句要么全都执行,要么全都不执行。8.7事务3.事务处理步骤1)用setAutoCommit(booeanb)方法关闭自动提交模式
con.setAutoCommit(false);2)用commit()方法处理事务mit();
Statement对象(PreparedStatement对象)提交多个SQL语句,这些SQL语句就是一个事务。事务中的SQL语句不会立刻生效,直到连接con调用commit()方法。3)用rollback()方法处理事务失败con.rollback();连接con调用commit()方法进行事务处理时,只要事务中任何一个SQL语句没有生效,就抛出SQLException异常。在处理SQLException异常时,必须让con调用rollback()方法,其作用是:撤消事务中成功执行过的SQL语句对数据库数据所做的更新、插入或删除操作,即撤消引起数据发生变化的SQL语句操作,将数据库中的数据恢复到commit()方法执行之前的状态。8.7事务为了例子8_7的需要,创建bank数据库,并在bank数据库中创建了user表(有关建数据库和表的操作见8.1.3节),user表的字段及属性如下:(idchar(20),namevarchar(100),userMonydouble),将bank.sql文件,保存在D:/myfile目录中。
createdatabasebank;usebank;createtableuser(idchar(20),namevarchar(100),userMoneydouble,primarykey(id));insertintouservalues('0001','geng',950),('0002','zhang',1000);select*fromuser;启动命令行客户端(见8.1.3),执行:sourced:/myfile/bank.sql;完成创建数据bank以及在数据库bank中创建user表的操作。8.7事务例子8_7使用了事务处理,将user表中name字段是geng的userMoney的值减少50,并将减少的50增加到name字段是zhang的userMoney属性值上。
例子8_7example8_7.jsp8.8分页显示记录可以使用二维数组table存放表的记录,即用二维数组table中的行(一维数组table[i])存放一条记录。如果一个表中有许多记录,那么二维数组table就有多行。为避免长时间占用数据库的连接,应当将全部记录存放到二维数组中,然后关闭数据库连接。假设table存放了m行记录,准备每页显示n行,那么,总页数的计算公式是:●如果m除以n的余数大于0,总页数等于m除以n的商加1;●如果m除以n的余数等于0,总页数等于m除以n的商。即总页数=(m%n)==0?(m/n):(m/n+1);如果准备显示第p页的内容,应当从table第(p-1)*n行开始,连续输出n行(最后一页可能不足n行)。8.8分页显示记录本节例子8_8使用MVC模式(有关知识见第7章)用分页的方式显示记录。1.bean(模型)bean的id是recordList,是sessionbean,用于存储从数据库的表中查询到的记录。用命令行进入save\data的父目录classes,编译Record_Bean.java(见本章开始的约定):classes>javacsave\data\BookList_Bean.java例子8_8Record_Bean.java(负责创建sessionbean)8.8分页显示记录例子8_82.JSP页面(视图)视图部分由两个JSP页面构成,其中example8_8_input.jsp页面负责提供输入数据的视图,即用户可以在该页面输入数据库的名、表名、密码等信息,然后提交给名字是query的servlet。query负责查询数据库,并将结果存储到id为recordBean的sessionbean中,然后请求视图中的example8_8_show.jsp页面显示recordBean的数据(分页显示)。example8_8_input.jspexample8_8_show.jsp8.8分页显示记录例子8_83.servlet(控制器)Query_Sevlet负责创建名字是query的servlet。query查询数据库表中的全部记录,将结果存放到id是recordBeant的sessionbean中,然后请求example8_8_show.jsp显示recordBean中的数据。用命令行进入handle\data的父目录classes,编译Query_Servlet.java(本章开始的约定):classes>javac-cp.;servlet-api.jarhandle/data/Query_Servlet.java注意“.;”和“servlet-api.jar”之间不要有空格,“.;”的作用是保证Java源文件能使用import语句引入当前classes目录中其他自定义包中的类,比如save.data包中的bean类(.;是javac默认具有的功能,在使用-cp参数时,尽量保留这一功能)。Query_Servlet.java4.web.xml(部署文件)向ch8\WEB\INF\下的部署文件web.xml添加如下的servlet和servlet-mapping标记(知识点见6.1.2),部署的servlet的名字是query,访问servlet的url-pattern是/query。web.xml8.9连接SQLServer与Access8.9.1连接MicrosoftSQLServer数据库1.登录下载MicrosoftJDBCDriver6.0forSQLServer,即下载sqljdbc_6.0.8112.200_chs.tar.gz。在解压目录的sqljdbc_6.0\chs\jre8子目录中可以找到JDBC-SQLServer连接器:sqljdbc42.jar。将SQLServer数据库的JDBC-SQLServer数据库连接器sqljdbc42.jar保存到Tomcat安装目录下的lib文件夹中(例如D:\apache-tomcat-9.0.26\lib),并重新启动Tomcat服务器。应用程序加载JDBC-SQLServer数据库连接器的代码如下:try{Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");}catch(Exceptione){}2.建立连接try{Stringurl="jdbc:sqlserver://:1433;DatabaseName=warehouse";Stringuser="sa";Stringpassword="dog123456";con=DriverManager.getConnection(url,user,password);}catch(SQLExceptione){}8.9连接SQLServer与Access8.9.2连接MicrosoftAccess数据库1.登录:/access.zip下载JDBC-Access连接器。解压下载得access.zip,在解压目录下\lib子目录中的Access_JDBC30.jar就是JDBC-Access连接器,将Access_JDBC30.jar保存到Tomcat安装目录下的lib文件夹中,并重新启动Tomcat服务器。2.建立连接加载Access数据库连接器程序的代码是:Class.forName("com.hxtt.sql.access.AccessDriver");将bookDatabase.accdb数据库保存在启动Tomcat服务器的当前目录下,即Tomcat安装目录的bin中。Stringpath="./bookDatabase.accdb";StringloginName="";Stringpassword="";con=DriverManager.getConnection("jdbc:Access://"+path,loginName,password);8.9连接SQLServer与Access8.9.2连接MicrosoftAccess数据库例8_9和例子8_1类似,仅仅是把MySQL数据库更换了成Access数据库。例子8_9example8_9.jsp8.10使用连接池8.10.1连接池简介连接池的思想是,■由一个管理者,比如Tomcat服务器,事先建立好若干个连接放在一起(存放在一个实现DataSource接口的对象中),称作一个连接池。■当Web应用程序需要连接数据库时,只需到连接池中获得一个Connection对象即可。■当Web应用程序不再需要Connection对象时,就让Connection对象调用close()方法,这样就可以把这个Connection对象再返回到连接池中,以便其他Web应用程序使用这个Connection对象。■需要注意的是,Tomcat服务器提供的连接池中的Connection对象调用close()方法不会关闭和数据库的TCP连接,其作用仅仅是把Connection对象返回到连接池(这一点和Web应用程序自己创建的Connection对象不同,其原理不必深究)。简单地说,连接池可以让Web应用程序方便地使用Connection对象(用完务必放回),再用再取,节省了创建Connection的时间,提高了Web应用程序访问数据库的效率。。8.10使用连接池8.10.2建立连接池1.连接池配置文件为了让Tomcat服务器创建连接池,必须编写一个xml文件,Tomcat服务器通过读取该文件创建连接池。xml文件的名字必须是context.xml。■连接池配置文件context.xml文件保存在Web服务目录的META-INF子目录中(不必重新启动Tomcat服务器)。context.xml<?xmlversion="1.0"encoding="utf-8"?><Context><Resourcename="gxy"type="javax.sql.DataSource"driverClassName="com.mysql.cj.jdbc.Driver"url="jdbc:mysql://:3306/bookDatabase?useSSL=false&serverTimezone=CST&characterEncoding=utf-8"username="root"password=""maxActive="15"maxIdle="15"minIdle="1"maxWait="1000"/></Context>8.10使用连接池8.10.2建立连接池1.连接池配置文件context.xmlname:设置连接池的名字(命名一个喜欢的名字即可),例如gxy,该名字是连接池的id,context.xml文件中,如果有多个Resource标记(一个Resource标记对应一个连接池),必须保证这些Resource标记中的name互不相同,即context.xml文件可以给出多个不同连接池的配置信息。type:设置连接池的类型,这里必须是javax.sql.DataSourcedriverClassName:设置数据库连接器,即数据库驱动的类。url:设置连接数据库的URL,注意url要小写。需要注意的是对于url中的&字符要写成“&”,这是XML文件对特殊字符的一个特殊规定。username:给出可以访问数据库的用户名,例如root。password:给出访问数据库的密码,比如,root用户的默认密码是无密码。maxActive:设置连接池的大小,即连接池中处于活动状态Connection对象的数目。maxIdle:设置连接池中可处于空闲状态的Connection对象的最大数目。maxWait:设置连接池中没有空闲状态Connection对象可用时,用户请求获得连接池中Connection对象需要等待的最长时间(单位是毫秒)。8.10使用连接池8.10.2建立连接池2.使用连接池步骤如下:(1)Context接口首先创建一个实现Context(上下文)接口的对象:Contextcontext=newInitialContext();然后让context去寻找Tomcat服务器曾绑定在运行环境中的另一个Context对象:ContextcontextNeeded=(Context)context.lookup("java:comp/env");■其中的java:comp/env是Tomcat服务器绑定这个Context对象时使用的资源标志符(不可以写错)。(2)得到连接池连接池绑定在Context对象contextNeeded中。绑定用的资源标志符是连接池配置文件context.xml中name给的值,比如gxy。
DataSourceds=(DataSource)contextNeeded.lookup("gxy");(3)从连接池中获得连接
Connectioncon=ds.getConnnection();(4)将连接返回连接池con.close();8.10使用连接池例子8_10和例子8_1类似,仅仅的不同是例子8_10使用了连接池。例子8_10是一个简单的JSP页面,该页面中的Java程序片代码使用连接池中的Connection对象连接数据库bookDatabase,查询bookList表中的全部记录(见8.1.3节曾建立的bookDatabase数据库)。例子8_10example8_10.jspcontext.xml8.11标准化考试训练8.11.1功能概述1.Web应用程序-标准化考试训练有2个JSP页面,example8_11_start.jsp和example8_11_exm.jsp。用户首先访问example8_11_start.jsp页面,在该页面输入训练题目的数量,单击提交键请求名字是givePaper的servlet。givePaperservlet将一套试题存放在名字是paperBean的sessionbean中,然后将用户定向到example8_11_exam.jsp页面。2.example8_11_exam.jsp页面显示paperBean中的数据,用户根据显示的内容开始答题。用户给出一道题目的回答,即给出用户的答案,单击“确认”提交键,请求名字是handleMess的servlet,handleMessservlet负责将用户的给出答案存储到paperBean中,并将用户再定向到example8_11_exam.jsp页面。用户单击“下一题”或“上一题”提交键,请求名字是handleMess的servlet,handleMessservlet负责将下一题或上一题的题目内容存储到paperBean中,并将用户再定向到example8_11_exam.jsp页面。用户单击该页面上“交卷”的提交键,请求名字是giveScore的servlet,giveScoreservlet负责计算用户的得分并显示得分。8.11标准化考试训练8.11.2数据库设计使用mysql命令行启动客户端:mysql-uroot-p按要求输入密码后,执行操作sourceD:/myFile/createDatabase.sql;导入该sql文件中的SQL语句,完成数据库、表的创建。如果某个题目不需要图像,那么插入记录时让pic字段的值为''(只输入一对单引号),即长度为0的字符序列,answer字段的值用大写英文字母A,B,C或D(有关创建数据库和表的细节见8.1.3)。sql文件createDatabase.sql,保存在D:\myFile目录中createDatabase.sql1.数据库与表8.11标准化考试训练8.11.2数据库设计2.数据库连接池标准化考试训练系统准备使用连接池连接数据库。打开ch8\META-INF下的连接池配置文件context.xml,增加名字是examinationConn的连接池。context.xml<?xmlversion="1.0"encoding="utf-8"?><Context><!--以下是新增加的内容(连接池)--><Resourcename="examinationConn"type="javax.sql.DataSource"driverClassName="com.mysql.cj.jdbc.Driver"url="jdbc:mysql://:3306/Examination?useSSL=false&a
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 食品储存与流通安全管理指南
- 2026公安联考面试题目及答案
- 合作伙伴停止合作终止函(8篇范文)
- 市场调研数据反馈报告信函(6篇)范文
- 防灾减灾守护生命-防灾减灾主题班会课件1
- 电力电网自动化技术应用手册
- 2026云南曲靖市沾益区教育体育局所属事业单位招聘学科教师5人模拟试卷往年题考附答案详解
- 重视网络安全警钟长鸣二年级主题班会课件
- ZnIn2S4基复合材料制备及其光催化降解四环素性能研究
- 基于红外与可见光融合的行人检测研究
- 2026年甘肃日报招聘考试试题及答案
- 2026年保密教育线上培训考试答案汇-总
- 成都安置房购买合同
- 2026学年八年级物理上册第二单元名校密卷单元测评含答案及解析
- Q∕320116 BL001-2025 BL螺锁式预应力混凝土实心异型方桩
- 消防报警系统调试优化方案
- 2026年市场监管取证方法练习题
- 非标自动化电气设计流程及规范
- 2024年家庭照护赛项竞赛样题及评分标准、设施设备物品清单
- 加油站防雷责任制度
- 2025年山西电子科技学院马克思主义基本原理概论期末考试模拟题含答案解析(必刷)
评论
0/150
提交评论