Java-Web应用开发实用教程-龚永罡-第6章-JSP数据库应用开发新课件.ppt
在线教务辅导网:在线教务辅导网:http:/ 更多课程配套课件资源请访问在线教务辅导网更多课程配套课件资源请访问在线教务辅导网2023/2/81第第6章章 JSP数据库应用开发数据库应用开发2023/2/82l数据库是一般Web应用必不可少的部分,Web应用的数据都需要保存在数据库里。l常见的大型数据库系统主要包括Oracle,SQL Server2000/2005,MySQL等。2023/2/83第6章 JSP数据库应用开发6.1安装和配置MySQL数据库6.2用JDBC访问MySQL数据库 6.3数据源(DataSource)6.4 JSP数据库应用示例2023/2/846.1安装和配置MySQL数据库6.1.1 MySQL数据库基础MySQL 是一个真正的多用户、多线程SQL数据库服务器 MySQL具有小巧、功能齐全、查询迅捷等优点 MySQL 对于一般中小型,甚至大型应用都能够胜任。2023/2/85和数据库相关的几个基本概念 1.数据类型和数据表 用于保存数据记录的结构被称为数据表。而每一条数据记录则是由更小的数据对象,即数据类型组成。Database Table Record Datatype 2023/2/86(1)MySQL 数据类型 MySQL 数据库提供了多种数据类型,其中较为常用的几种如下:CHAR(M)CHAR数据类型用于表示固定长度的字符串,可以包含最多达255个字符。其中M代表字符串的长度。2023/2/87(1)MySQL 数据类型VARCHAR(M)VARCHAR是一种比CHAR更加灵活的数据类型,同样用于表示字符数据,但是VARCHAR可以保存可变长度的字符串。其中M代表该数据类型所允许保存的字符串的最大长度2023/2/88(1)MySQL 数据类型INT(M)Unsigned INT数据类型用于保存从-2147483647 到2147483648范围之内的任意整数数据。如果用户使用Unsigned选项,则有效数据范围调整为0-4294967295。2023/2/89(1)MySQL 数据类型FLOAT(M,D)FLOAT数据类型用于表示数值较小的浮点数据,可以提供更加准确的数据精度。其中,M代表浮点数据的长度(即小数点左右数据长度的总和),D表示浮点数据位于小数点右边的数值位数。DATE DATE数据类型用于保存日期数据,默认格式为YYYY-MM-DD。2023/2/810(1)MySQL 数据类型TEXT/BLOB TEXT和BLOB数据类型可以用来保存255 到65535个字符,如果用户需要把大段文本保存到数据库内的话,可以选用TEXT或BLOB数据类型。TEXT和BLOB这两种数据类型基本相同,唯一的区别在于TEXT不区分大小写,而BLOB对字符的大小写敏感。2023/2/811(1)MySQL 数据类型SET SET数据类型是多个数据值的组合例如:transport SET(truck,wagon)NOT NULL;ENUM ENUM数据类型和SET基本相同,唯一的区别在于ENUM只允许选择一个有效数据值。2023/2/812(2)数据记录 一组经过声明的数据类型就可以组成一条记录。多条记录组合在一起就构成了数据表的基本结构。2023/2/813(3)数据表 在MySQL数据库中创建新的数据表:mysql CREATE TABLE test(name VARCHAR(15),email VARCHAR(25),phone_number INT,ID INT NOT NULL AUTO_INCREMENT,PRIMARY KEY(ID);2023/2/814主要的参数选项 Primary Key 具有Primary Key限制条件的字段用于区分同一个数据表中的不同记录。Auto_Increment 具有Auto_Increment限制条件的字段值从1开始,每增加一条新记录,值就会相应地增加1。NOT NULL NOT NULL限制条件规定用户不得在该字段中插入空值。2023/2/815以数据表作为操作对象的命令 显示数据表命令mysql show tables;该命令将会列出当前数据库下的所有数据表。显示字段命令 mysql show columns from tablename;该命令将会返回指定数据表的所有字段和字段相关信息。2023/2/816(4)数据操作 对MySQL数据库中数据的操作可以划分为四种不同的类型,分别是添加添加、删除删除、修改修改和查询查询添加记录 使用INSERT命令向数据库中添加新的记录 mysql INSERT INTO test VALUES(John,5554321,NULL);2023/2/817(4)数据操作查询数据使用SELECT命令进行数据的查询。例如:mysql SELECT*FROM test WHERE(name=John);删除数据 使用DELETE命令。例如:mysql DELETE FROM test WHERE(name=);2023/2/818(4)数据操作修改数据使用UPDATE命令。例如:mysql UPDATE test SET name=Mary WHERE name=John;2023/2/8196.1.2 安装MySQL数据库MySQL数据库安装程序可以在MySQL的官方(http:/)网站下载2023/2/8202023/2/821下载后的程序为一个压缩文件mysql-5.0.67-win32.zip,解压缩该文件,然后双击其中的Setup.exe文件,启动MySQL安装向导按照向导指示就可以完成安装了2023/2/8226.1.3 配置MySQL数据库安装完成后,可以选择Configure the MySQL Server now来启动MySQL的设置向导 一般选择Standard Configuration(标准配置模式)。2023/2/8232023/2/824单击Next后弹出图6.11所示的对话框,选择Install As Windows Service选项,Service Name可以自己选择和设置,选中Launch the MySQL Server automatically(自动启动MySQL服务)。在图6.11所示的对话框中单击Next按钮后,弹出图6.12所示的对话框,可进行root用户密码的设置,此处设为123,设置完成后单击Next按钮,然后单击Execute即可开始MySQL的配置。2023/2/825图6.12设置root用户的密码图6.11 作为Windows服务安装2023/2/8266.1.4 测试开始-所有程序-MySQL-MySQL Server-MySQL Command Line Client来启动MySQL的命令行管理工具。输入配置阶段设置的密码后进入命令行管理工具界面 2023/2/8271.新建数据库及数据表测试 可以用create database语句建立一个新的数据库MyData,具体语句如下:mysqlcreate database MyData;可以通过use语句选择其为默认数据库:mysqluse MyData2023/2/828用createtable语句建立新的数据表,具体语句如下:mysqlcreate table user-(name char(20),-password char(20),-email char(100),-user_id char(20),-primary key(user_id);可以用“desc user;”命令查看数据表结构2023/2/8292023/2/8302.增加数据用insert into语句在表中增加数据。代码如下:insert into user(name,password,email,user_id)values(Mary,123,M,0001);如果插入的记录为所有字段都赋值,则可以省略字段名,简写成如下语句:insert into user values(Mary,123,M,0001);2023/2/8312023/2/8323.修改数据用update语句修改数据表中的数据,具体代码如下:update user set password=1234656 where user_id=0001;可以用select*from user语句查看user表中的所有数据。2023/2/8332023/2/8344.删除数据用delete语句修改数据表中的数据,具体代码如下:delete from user where user_id=0001;此外可以用不带条件的delete语句或truncate table语句删除表中的所有数据,即:delete from user;或:truncate table user;2023/2/8352023/2/8366.2用JDBC访问MySQL数据库JDBC是一种Java数据库连接API,它为Java程序员提供了一种在Java代码中访问关系数据库的标准方法。JDBC可以为多种关系数据库提供统一统一访问,它由一组用Java语言编写的类和接口组成。2023/2/837一个Java程序要访问数据库,需通过以下几步来完成:第一,打开数据库连接;第二,建立语句对象;第三,通过该语句对象将SQL语句传送给数据库,进行数据库操作;第四,获取结果及有关结果集的信息。2023/2/8386.2.2 JDBC.ODBC桥JDBC.ODBC桥是一个JDBC驱动程序,它通过将JDBC操作转换为ODBC操作来实现。对ODBC,它像是通常的应用程序,桥为所有对ODBC可用的数据库实现JDBC。由于ODBC被广泛地使用,该桥的优点是让JDBC能够访问几乎所有的数据库。桥作为包sun.jdbc.odbc与JDK一起自动安装,无需特殊配置。2023/2/839建立连接前,必须将桥驱动程序类sun.jdbc.odbc.jdbcodbcdriver添加到名为jdbc.drivers的java.lang.system属性中,或用java类加载器将其显式地加载。可以用以下语句进行桥的显式加载:class.forname(sun.jdbc.odbc.jdbcodbcdriver);加载时,ODBC驱动程序将创建它自己的实例,同时在JDBC驱动程序管理器进行注册。2023/2/840桥驱动程序使用ODBC子协议。该子协议的URL为以下的形式:jdbc:odbc:=*例如:jdbc:odbc:sybase jdbc:odbc:mydb;uid=me;pwd=secret jdbc:odbc:ora123;cachesize=3002023/2/8416.2.3 JDBC建立数据库连接示例使用JDBC连接MySQL数据库需要首先在http:/ driverName=com.mysql.jdbc.Driver;/数据库用户名String userName=root;/密码String userPwd=123;/数据库名String dbName=MyData;/表名String tableName=user;/连接字符串String url=jdbc:mysql:/localhost/+dbName+?user=+userName+&password=+userPwd;Class.forName(com.mysql.jdbc.Driver).newInstance();java.sql.Connection conn=DriverManager.getConnection(url);out.print(数据库连接成功!);out.print();java.sql.Statement statement=conn.createStatement();String sql=SELECT*FROM +tableName;java.sql.ResultSet rs=statement.executeQuery(sql);2023/2/845/输出每一个数据值out.print(编号 );out.print(|);out.print(用户名);out.print(|);out.print(Email);out.print();while(rs.next()out.print(rs.getString(4)+);out.print(|);out.print(rs.getString(1)+);out.print(|);out.print(rs.getString(3);out.print();out.print();out.print(数据库操作成功!);rs.close();statement.close();conn.close();%2023/2/8466.2.4 JDBC建立数据库连接方法详解JDBC由一组Java类库和接口库组成,涉及到的Java标准包包括java.sql.*和javax.sql.*。一般的数据库厂商如Oracle,Microsoft,MySQL等一般会提供专用的JDBC数据库驱动程序,以简化开发。各种JDBC驱动程序可到数据库厂商的网站下载。2023/2/847JDBC主要的接口和核心类包括:Driver接口DriverManager类Connection类Statement类PreparedStatement类ResultSet类2023/2/8481.Driver接口在使用Driver接口前,Java和JSP程序必须使用import语句导入java.sql.*包。如果使用JDBC驱动程序,可以这样加载:Class.forName(jdbcdriver_classname).newInstance();如,对MySQL数据库,加载语句如下:Class.forName(com.mysql.jdbc.Driver).newInstance();如果使用JDBC/ODBC桥驱动程序,可以这样加载:Class.forName(sun.jdbc.odbc.JdbcOdbcDriver).newInstance();2023/2/8492.DriverManager类DriverManager类是驱动程序管理类,负责管理JDBC驱动程序。DriverManager类提供的getConnection函数所返回的Connection接口类十分重要如上例中的代码:Stringurl=jdbc:mysql:/localhost/+dbName+?user=+userName+&password=+userPwd;Connectionconn=DriverManager.getConnection(url);2023/2/8502.DriverManager类(续)调用Connection函数可返回一个数据库连接。该函数有3种不同的函数重载形式 static Connection getConnection(String url):和一个通过url指定的数据库建立连接。static Connection getConnection(String url,Properties info):和一个通过url指定的数据库建立连接。info提供了一些属性,这些属性里包括了user和password等属性。static Connection getConnection(String url,String user,String password):传入参数用户名为user,密码为password,和一通过url指定的数据库建立连接。2023/2/8513.Connection类 负责维护JSP/Java应用程序和数据库之间的联机。Connection类经常使用的函数如下:voidcommit():执行对数据库新增、删除或修改记录的操作。voidclose():关闭到数据库的连接booleanisClosed():测试是否已经关闭Connection类对象对数据库的联机。voidrollback():取消执行对数据库新增、删除或修改记录的操作。2023/2/852StatementcreateStatement():建立一个Statement类实例,用来执行SQL操作。StatementcreateStatement(intresultSetType,intresultSetConcurrency):建立一个Statement类实例,并产生指定类型的结果集ResultSetDatabaseMetaDatagetMetaData():建立DatabaseMetaData类对象PreparedStatementprepareStatement(Stringsql):建立PreparedStatement类对象booleangetAutoCommit():返回Connection类对象的AutoCommit状态voidsetAutoCommit(booleanautoCommit):设定Connection类对象的AutoCommit状态2023/2/8534.Statement类 通过Statement类所提供的方法,可以利用标准的SQL命令,对数据库直接新增、删除或修改操作。使用Connection接口类 的createStatement()函数就可以得到Statement的实例。Statement类提供了很多函数,常用的如下:ResultSet executeQuery(String sql):使用SELECT命令对数据库进行查询并返回ResultSet结果集。int executeUpdate(String sql):使用INSERTDELETEUPDATE对数据库进行新增、删除和修改操作。void close():结束Statement类对象对数据库的联机2023/2/8545.PreparedStatement类 和Statement类的不同之处在于PreparedStatement类对象会将传入的SQL命令事先编好等待使用,当有单一的SQL指令多次执行时,用PreparedStatement类会比Statement类有效率。常用方法如下:ResultSetexecuteQuery():使用SELECT命令对数据库进行查询并返回ResultSet结果集。intexecuteUpdate():使用INSERTDELETEUPDATE对数据库进行新增、删除和修改操作。ResultSetMetaDatagetMetaData():取得ResultSet类对象有关字段的相关信息2023/2/855voidsetInt(intparameterIndex,intx):设定整数类型数值给PreparedStatement类对象的IN参数voidsetFloat(intparameterIndex,floatx):设定浮点数类型数值给PreparedStatement类对象的IN参数voidsetNull(intparameterIndex,intsqlType):设定NULL类型数值给PreparedStatement类对象的IN参数voidsetString(intparameterIndex,Stringx):设定字符串类型数值给PreparedStatement类对象的IN参数voidsetDate(intparameterIndex,Datex):设定日期类型数值给PreparedStatement类对象的IN参数voidsetTime(intparameterIndex,Timex):设定时间类型数值给PreparedStatement类对象的IN参数2023/2/8566.ResultSet类负责存储查询数据库的结果。提供一系列方法对数据库进行新增、删除和修改操作。也负责维护一个记录指针(Cursor),记录指针指向数据表中的某个记录,通过适当的移动记录指针,可以随心所欲的存取数据库,加强程序的效率。常用方法如下:booleanabsolute(int row):移动记录指针到指定的记录voidbeforeFirst():移动记录指针到第一笔记录之前voidafterLast():移动记录指针到最后一笔记录之后2023/2/857booleanfirst():移动记录指针到第一笔记录booleanlast():移动记录指针到最后一笔记录booleannext():移动记录指针到下一笔记录booleanprevious():移动记录指针到上一笔记录voiddeleteRow():删除记录指针指向的记录voidmoveToInsertRow():移动记录指针以新增一笔记录voidmoveToCurrentRow():移动记录指针到被记忆的记录voidinsertRow():新增一笔记录到数据库中voidupdateRow():修改数据库中的一笔记录voidupdate类型类型(intcolumnIndex,类型x):修改指定字段的值intget类型类型(intcolumnIndex):取得指定字段的值ResultSetMetaDatagetMetaData():取得ResultSetMetaData类对象2023/2/8587.ResultSetMetaData类 保存了所有ResultSet类对象中关于字段的信息,并提供许多方法来取得这些信息。主要方法如下:intgetColumnCount():取得ResultSet类对象的字段个数intgetColumnDisplaySize():取得ResultSet类对象的字段长度StringgetColumnName(intcolumn):取得ResultSet类对象的字段名称StringgetColumnTypeName(intcolumn):取得ResultSet类对象的字段类型名称StringgetTableName(intcolumn):取得ResultSet类对象的字段所属数据表的名称booleanisCaseSensitive(intcolumn):测试ResultSet类对象的字段是否区分大小写booleanisReadOnly(intcolumn):测试ResultSet类对象的字段是否为只读2023/2/8598.DatabaseMetaData类 DatabaseMetaData类保存了数据库的所有特性,并且提供许多方法来取得这些信息。主要方法如下:StringgetDatabaseProductName():取得数据库名称StringgetDatabaseProductVersion():取得数据库版本代号StringgetDriverName():取得JDBC驱动程序的名称StringgetDriverVersion():取得JDBC驱动程序的版本代号StringgetURL():取得连接数据库的JDBCURLStringgetUserName():取得登录数据库的使用者帐号2023/2/8609.利用JDBC进行数据库操作的步骤前提是导入java.sql.*。连接MySQL数据库主要分为以下几步:(1)加载驱动程序,代码如下:Class.forName(com.mysql.jdbc.Driver).newInstance();(2)建立连接(通过驱动管理器)String url=jdbc:mysql:/localhost/+dbName+?user=+userName+&password=+userPwd;java.sql.Connection conn=DriverManager.getConnection(url);2023/2/861(3)建立Statementjava.sql.Statementst=con.createStatement();(4)执行sql语句例如:st.executeUpdate(sql语句)(5)关闭连接con.close();9.利用JDBC进行数据库操作的步骤(续)2023/2/8626.3数据源(DataSource)6.3.1数据源简介数据源定义的是连接到实际数据库的一条路径,数据源中并无真正的数据,它仅仅记录连接到哪个数据库,以及如何连接的。也就是说数据源仅仅是数据库的连接名称,一个数据库可以有多个数据源连接。2023/2/8636.3.2配置数据源1.通过修改文件添加数据源数据源的配置涉及修改server.xml和web.xml(1)在server.xml中加入元素元素用来定义JNDIResource,一般添加到server.xml文件的结束标志之前。2023/2/8642023/2/865(2)在元素中加入 元素元素用来指定各种参数值2023/2/mons.dbcp.BasicDataSourceFactorymaxActive1002023/2/867(3)在web.xml中加入元素DBConnectionjdbc/MyDatajavax.sql.DataSourceContainer2023/2/8682.通过Tomcat控制台添加数据源(1)启动Tomcat,打开浏览器,在地址栏中输入:http:/localhost:8080/admin/,输入用户名和密码后进入Tomcat系统管理界面。2023/2/869(2)单击左侧的Data Sources,选择Create New Data Source,在弹出对话框的输入框中输入以下数据:JNDI Name输入框中输入jdbc/mysqlData Source URL输入框中输入jdbc:mysql:/localhost:3306/MyDataJDBC Driver Class输入框中输入com.mysql.jdbc.DriverUser Name输入框中输入用户名rootPassword输入框中输入密码123其他可安装默认值。2023/2/870(3)单击Save按钮,然后单击界面上部的Commit Changes按钮。(4)将数据库的JDBC驱动放入TOMCAT_HOME/common/lib下 2023/2/8716.3.3程序中访问数据源javax.naming.Context提供了查找JNDIResource的接口,可以通过三个步骤来使用数据源对象:1.获得对数据源的引用:Contextctx=newInitalContext();DataSourceds=(DataSource)ctx.lookup(java:comp/env/jdbc/mysql);2.获得数据库连接对象:Connectioncon=ds.getConnection();3.返回数据库连接到连接池:con.close();2023/2/872注意:发布使用数据库的Web应用程序时,如果直接用JDBC访问数据库,可以把JDBC驱动程序拷贝到Web应用的WEB-INF/lib目录或者Tomcat安装目录下的common/lib目录下。如果通过数据源访问数据库,由于数据源由Servlet容器创建并维护,所以必须把JDBC驱动程序拷贝到Tomcat安装目录下的common/lib目录下,确保Servlet容器能够访问驱动程序。2023/2/8736.4 JSP数据库应用示例【例6.2】使用数据源访问数据库。dataSource.jsp源代码如下:MySQL 数据源测试%out.print(MySQL 数据源测试开始.+);DataSource ds=null;try InitialContext ctx=new InitialContext();ds=(DataSource)ctx.lookup(java:comp/env/jdbc/mysql);Connection conn=ds.getConnection();conn.close();out.print(MySQL 数据源测试成功!);catch(Exception ex)out.print(出现意外,信息是:+ex.getMessage();ex.printStackTrace();%2023/2/874因为没有配置,所以会出现出错信息。图6.26没有配置会出现出错信息2023/2/875需要修改WEB-INF目录下的web.xml文件(如果没有该文件,则需要创建该文件),配置好的web.xml文件代码如下:mysqlDBConnectionjdbc/mysqljavax.sql.DataSourceContainer2023/2/876此外,要在应用程序根目录下的META-INF目录下新建一个context.xml文件(如果没有META-INF目录,则需要新建),在其中输入以下的配置代码:2023/2/877图6.27使用数据源访问数据库2023/2/8786.5小结 数据库是几乎所有的Web应用程序必不可少的部分,本章介绍了MySQL数据库的安装与配置,包括数据库的基础知识。此外还介绍了前台程序代码访问后台数据库的两种方法,一种是通过JDBC来访问,另一种是通过数据源来访问。2023/2/8796.6习题 1.单选题(1)创建数据表应该用以下()指令。A.INSERT B.CREATE C.SELECT D.UPDATE(2)创建数据表时如果要指定某一个字段为主键,应该用()参数。B.NOT NULL B.Auto_Increment C.Primary Key D.Key(3)要删除数据表中的一条记录应该用以下的()命令。C.INSERT B.DELETE C.SELECT D.UPDATE2023/2/8802.上机练习(1)启动MySQL的命令行管理工具,用MySQL的建库语句建立一个名为company的数据库。(2)在company库中建立雇员表emp,表的数据项及数据类型如下所示:empno int(4)not null primary key,ename varchar(10),job varchar(10),2023/2/8812023/2/8822023/2/8832023/2/8842023/2/8852023/2/886馋死2023/2/8872023/2/8882023/2/8892023/2/8902023/2/8912023/2/8922023/2/8932023/2/8942023/2/8952023/2/8962023/2/8972023/2/8982023/2/899P P T研 究 院PO W E R PO I N T A C A D E M Y2023/2/81002023/2/81012023/2/8102