1、2022-4-251在线教务辅导网:在线教务辅导网:http:/ 更多课程配套课件资源请访问在线教务辅导网更多课程配套课件资源请访问在线教务辅导网2022-4-252第第6 6章章 JSPJSP数据库应用开发数据库应用开发2022-4-253l数据库是一般Web应用必不可少的部分,Web应用的数据都需要保存在数据库里。l常见的大型数据库系统主要包括Oracle,SQL Server2000/2005,MySQL等。2022-4-254第6章 JSP数据库应用开发6.1安装和配置MySQL数据库6.2用JDBC访问MySQL数据库 6.3数据源(DataSource)6.4 JSP数据库应用示例
2、2022-4-2556.1安装和配置MySQL数据库6.1.1 MySQL数据库基础 MySQL 是一个真正的多用户、多线程SQL数据库服务器 MySQL具有小巧、功能齐全、查询迅捷等优点 MySQL 对于一般中小型,甚至大型应用都能够胜任。 2022-4-256和数据库相关的几个基本概念 1. 数据类型和数据表 用于保存数据记录的结构被称为数据表。 而每一条数据记录则是由更小的数据对象,即数据类型组成。 Database Table Record Datatype 2022-4-257(1)MySQL 数据类型 MySQL 数据库提供了多种数据类型,其中较为常用的几种如下: CHAR (M)
3、 CHAR数据类型用于表示固定长度的字符串,可以包含最多达255个字符。其中M代表字符串的长度。 2022-4-258(1)MySQL 数据类型VARCHAR (M) VARCHAR是一种比CHAR更加灵活的数据类型,同样用于表示字符数据,但是VARCHAR可以保存可变长度的字符串。 其中M代表该数据类型所允许保存的字符串的最大长度2022-4-259(1)MySQL 数据类型INT (M) Unsigned INT数据类型用于保存从- 2147483647 到2147483648范围之内的任意整数数据。如果用户使用Unsigned选项,则有效数据范围调整为0-4294967295。2022-
4、4-2510(1)MySQL 数据类型FLOAT (M,D) FLOAT数据类型用于表示数值较小的浮点数据,可以提供更加准确的数据精度。其中,M代表浮点数据的长度(即小数点左右数据长度的总和),D表示浮点数据位于小数点右边的数值位数。DATE DATE数据类型用于保存日期数据,默认格式为YYYY-MM-DD。2022-4-2511(1)MySQL 数据类型TEXT / BLOB TEXT和BLOB数据类型可以用来保存255 到65535个字符,如果用户需要把大段文本保存到数据库内的话,可以选用TEXT或BLOB数据类型。TEXT和BLOB这两种数据类型基本相同,唯一的区别在于TEXT不区分大小
5、写,而BLOB对字符的大小写敏感。 2022-4-2512(1)MySQL 数据类型SET SET数据类型是多个数据值的组合 例如:transport SET (truck, wagon) NOT NULL; ENUM ENUM数据类型和SET基本相同,唯一的区别在于ENUM只允许选择一个有效数据值。2022-4-2513(2)数据记录 一组经过声明的数据类型就可以组成一条记录。多条记录组合在一起就构成了数据表的基本结构。2022-4-2514(3)数据表 在MySQL数据库中创建新的数据表: mysql CREATE TABLE test (CREATE TABLE test ( name
6、VARCHAR (15),name VARCHAR (15), email VARCHAR (25),email VARCHAR (25), phone_numberphone_number INT, INT, ID INT NOT NULL AUTO_INCREMENT,ID INT NOT NULL AUTO_INCREMENT, PRIMARY KEY (ID);PRIMARY KEY (ID); 2022-4-2515主要的参数选项 Primary KeyPrimary Key 具有Primary Key限制条件的字段用于区分同一个数据表中的不同记录。 Auto_IncrementAu
7、to_Increment 具有Auto_Increment限制条件的字段值从1开始,每增加一条新记录,值就会相应地增加1。 NOT NULLNOT NULL NOT NULL限制条件规定用户不得在该字段中插入空值。 2022-4-2516以数据表作为操作对象的命令 显示数据表命令 mysql show tables;show tables; 该命令将会列出当前数据库下的所有数据表。显示字段命令 mysql show columns from show columns from tablenametablename; ; 该命令将会返回指定数据表的所有字段和字段相关信息。 2022-4-2517
8、(4)数据操作 对MySQL数据库中数据的操作可以划分为四种不同的类型,分别是添加添加、删除删除、修改修改和查查询询添加记录 使用INSERT命令向数据库中添加新的记录 mysql INSERT INTO test VALUES INSERT INTO test VALUES (John, ,5554321, (John, ,5554321, NULL); NULL); 2022-4-2518(4)数据操作查询数据 使用SELECT命令进行数据的查询。例如: mysql SELECT SELECT * * FROM test WHERE FROM test WHERE (name = John
9、);(name = John); 删除数据 使用DELETE命令。 例如: mysql DELETE FROM test WHERE (name DELETE FROM test WHERE (name = ); = ); 2022-4-2519(4)数据操作修改数据 使用UPDATE命令。 例如: mysql UPDATE test SET name = Mary UPDATE test SET name = Mary WHERE name = John; WHERE name = John; 2022-4-25206.1.2 安装MySQL数据库MySQL数据库安装程序可以在MySQL的官
10、方(http:/)网站下载2022-4-25212022-4-2522下载后的程序为一个压缩文件mysql-5.0.67-win32.zip,解压缩该文件,然后双击其中的Setup.exe文件,启动MySQL安装向导按照向导指示就可以完成安装了2022-4-25236.1.3 配置MySQL数据库安装完成后,可以选择Configure the MySQL Server now来启动MySQL的设置向导 一般选择Standard Configuration(标准配置模式)。 2022-4-2524 2022-4-2525单击Next后弹出图6.11所示的对话框,选择Install As Wind
11、ows Service选项,Service Name可以自己选择和设置,选中Launch the MySQL Server automatically(自动启动MySQL服务)。在图6.11所示的对话框中单击Next按钮后,弹出图6.12所示的对话框,可进行root用户密码的设置,此处设为123,设置完成后单击Next按钮,然后单击Execute即可开始MySQL的配置。 2022-4-2526 图6.12 设置root用户的密码图6.11 作为Windows服务安装2022-4-25276.1.4 测试开始-所有程序-MySQL-MySQL Server- MySQLMySQL Comman
12、d Line Command Line ClientClient来启动MySQL的命令行管理工具。输入配置阶段设置的密码后进入命令行管理工具界面 2022-4-25281. 新建数据库及数据表测试 可以用create database语句建立一个新的数据库MyData,具体语句如下: mysqlcreate database create database MyDataMyData; ;可以通过use语句选择其为默认数据库: mysqluse use MyDataMyData2022-4-2529用create table语句建立新的数据表,具体语句如下:mysqlcreate table u
13、ser-(name char(20),-password char(20),-email char(100),-user_id char(20),-primary key(user_id);可以用“desc user;”命令查看数据表结构2022-4-25302022-4-25312. 增加数据用insert into语句在表中增加数据。代码如下:insert into insert into user(name,password,email,user_iduser(name,password,email,user_id) )values(Mary,123,M,000values(Mary,1
14、23,M,0001);1);如果插入的记录为所有字段都赋值,则可以省略字段名,简写成如下语句:insert into user insert into user values(Mary,123,M,00values(Mary,123,M,0001);01);2022-4-25322022-4-25333. 修改数据用update语句修改数据表中的数据,具体代码如下:update user set password=1234656 where user_id=0001;可以用select * from user语句查看user表中的所有数据。2022-4-25342022-4-25354. 删除
15、数据用delete语句修改数据表中的数据,具体代码如下: delete from user where user_id=0001;此外可以用不带条件的delete语句或truncate table语句删除表中的所有数据,即:delete from user;或:truncate table user;2022-4-25362022-4-25376.2用JDBC访问MySQL数据库JDBC是一种Java数据库连接API,它为Java程序员提供了一种在Java代码中访问关系数据库的标准方法。JDBC可以为多种关系数据库提供统一统一访问,它由一组用Java语言编写的类和接口组成。 2022-4-25
16、38一个Java程序要访问数据库,需通过以下几步来完成: 第一,打开数据库连接; 第二,建立语句对象; 第三,通过该语句对象将SQL语句传送给数据库,进行数据库操作; 第四,获取结果及有关结果集的信息。2022-4-25396.2.2 JDBC.ODBC桥JDBC.ODBC桥是一个JDBC驱动程序,它通过将JDBC操作转换为ODBC操作来实现。对ODBC,它像是通常的应用程序,桥为所有对ODBC可用的数据库实现JDBC。 由于ODBC被广泛地使用,该桥的优点是让JDBC能够访问几乎所有的数据库。 桥作为包sun.jdbc.odbc与JDK一起自动安装,无需特殊配置。 2022-4-2540建立
17、连接前,必须将桥驱动程序类sun.jdbc.odbc.jdbcodbcdriver添加到名为jdbc.drivers的java.lang.system属性中,或用java类加载器将其显式地加载。可以用以下语句进行桥的显式加载: class.forname(sun.jdbc.odbc.jdbcodbcdriver);加载时,ODBC驱动程序将创建它自己的实例,同时在JDBC驱动程序管理器进行注册。 2022-4-2541桥驱动程序使用ODBC子协议。该子协议的URL为以下的形式: jdbc:odbc:=* 例如: jdbc:odbc:sybase jdbc:odbc:mydb;uid=me;pw
18、d=secret jdbc:odbc:ora123;cachesize=3002022-4-25426.2.3 JDBC建立数据库连接示例使用JDBC连接MySQL数据库需要首先在http:/ 图6.19 JDBC驱动下载页面2022-4-2543选择第二个即Connector/J,为针对Java应用的驱动。点击后进入图所示界面2022-4-2544下载后的文件为压缩文件mysql-connector-java-5.1.6.zip,双击解压该文件。将解压后的文件mysql-connector-java-5.1.6-bin.jar 拷贝到Web应用程序的WEB-INFlibWEB-INFlib目
19、录下 或者在CLASSPATH环境变量中加入mysql-connector-java-5.1.6-bin.jar文件这样JSP程序就可以通过JDBC接口访问MySQL数据库了, 2022-4-2545【例例6.16.1】 通过通过JDBCJDBC连接到连接到MySQLMySQL数据库数据库文件jdbcExample.jsp源代码如下:%/驱动程序名String driverName = com.mysql.jdbc.Driver;/数据库用户名String userName = root;/密码String userPwd = 123;/数据库名String dbName = MyData;/
20、表名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.cr
21、eateStatement();String sql = SELECT * FROM + tableName;java.sql.ResultSet rs = statement.executeQuery(sql);2022-4-2546/ 输出每一个数据值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) +
22、 );out.print(|);out.print(rs.getString(3);out.print();out.print();out.print(数据库操作成功!);rs.close();statement.close();conn.close();%2022-4-25476.2.4 JDBC建立数据库连接方法详解JDBC由一组Java类库和接口库组成,涉及到的Java标准包包括java.sql.*和javax.sql.*。一般的数据库厂商如Oracle,Microsoft,MySQL等一般会提供专用的JDBC数据库驱动程序,以简化开发。各种JDBC驱动程序可到数据库厂商的网站下载。 2
23、022-4-2548JDBC主要的接口和核心类包括: Driver接口 DriverManager类 Connection类 Statement类 PreparedStatement类 ResultSet类2022-4-25491. Driver接口在使用Driver接口前,Java和JSP程序必须使用import语句导入java.sql.*包。 如果使用JDBC驱动程序,可以这样加载: Class.forName(jdbcdriver_classname).newInstance(); 如,对MySQL数据库,加载语句如下: Class.forName(com.mysql.jdbc.Driv
24、er).newInstance();如果使用JDBC/ODBC桥驱动程序,可以这样加载: Class.forName(sun.jdbc.odbc.JdbcOdbcDriver).newInstance();2022-4-25502. DriverManager类 DriverManager类是驱动程序管理类,负责管理JDBC驱动程序。 DriverManager类提供的getConnection函数所返回的Connection接口类十分重要如上例中的代码: String url=jdbc:mysql:/localhost/+dbName+?user=+userName+&password=+u
25、serPwd; Connection conn=DriverManager.getConnection(url);2022-4-25512. DriverManager类(续)调用Connection函数可返回一个数据库连接。该函数有3种不同的函数重载形式 static Connection getConnection(String url):和一个通过url指定的数据库建立连接。 static Connection getConnection(String url,Properties info):和一个通过url指定的数据库建立连接。info提供了一些属性,这些属性里包括了user和pas
26、sword等属性。 static Connection getConnection(String url,String user,String password):传入参数用户名为user,密码为password,和一通过url指定的数据库建立连接。2022-4-25523. Connection类 负责维护JSP/Java应用程序和数据库之间的联机。Connection类经常使用的函数如下: void commit():执行对数据库新增、删除或修改记录的操作。 void close() :关闭到数据库的连接 boolean isClosed():测试是否已经关闭Connection类对象对数
27、据库的联机。 void rollback() :取消执行对数据库新增、删除或修改记录的操作。2022-4-2553Statement createStatement() :建立一个Statement类实例,用来执行SQL操作。Statement createStatement(int resultSetType,int resultSetConcurrency) :建立一个Statement类实例,并产生指定类型的结果集ResultSet DatabaseMetaData getMetaData() :建立DatabaseMetaData类对象 PreparedStatement prepar
28、eStatement(String sql) :建立PreparedStatement类对象 boolean getAutoCommit() :返回Connection类对象的AutoCommit状态 void setAutoCommit(boolean autoCommit) :设定Connection类对象的AutoCommit状态2022-4-25544. Statement类 通过Statement类所提供的方法,可以利用标准的SQL命令,对数据库直接新增、删除或修改操作。 使用Connection接口类 的createStatement()函数就可以得到Statement的实例。 S
29、tatement类提供了很多函数,常用的如下: ResultSet executeQuery(String sql):使用SELECT命令对数据库进行查询并返回ResultSet结果集。 int executeUpdate(String sql) :使用INSERTDELETEUPDATE对数据库进行新增、删除和修改操作。 void close() :结束Statement类对象对数据库的联机2022-4-25555. PreparedStatement类 和Statement类的不同之处在于PreparedStatement类对象会将传入的SQL命令事先编好等待使用,当有单一的SQL指令多次
30、执行时,用PreparedStatement类会比Statement类有效率。 常用方法如下: ResultSet executeQuery() :使用SELECT命令对数据库进行查询并返回ResultSet结果集。 int executeUpdate() :使用INSERTDELETEUPDATE对数据库进行新增、删除和修改操作。 ResultSetMetaData getMetaData() :取得ResultSet类对象有关字段的相关信息 2022-4-2556void setInt(int parameterIndex,int x):设定整数类型数值给PreparedStatement
31、类对象的IN参数 void setFloat(int parameterIndex,float x) :设定浮点数类型数值给PreparedStatement类对象的IN参数void setNull(int parameterIndex,int sqlType):设定NULL类型数值给PreparedStatement类对象的IN参数void setString(int parameterIndex,String x):设定字符串类型数值给PreparedStatement类对象的IN参数 void setDate(int parameterIndex,Date x):设定日期类型数值给Pre
32、paredStatement类对象的IN参数void setTime(int parameterIndex,Time x):设定时间类型数值给PreparedStatement类对象的IN参数2022-4-25576. ResultSet类负责存储查询数据库的结果。提供一系列方法对数据库进行新增、删除和修改操作。也负责维护一个记录指针(Cursor),记录指针指向数据表中的某个记录,通过适当的移动记录指针,可以随心所欲的存取数据库,加强程序的效率。常用方法如下: boolean absolute(int row) :移动记录指针到指定的记录 void beforeFirst():移动记录指针到
33、第一笔记录之前 void afterLast():移动记录指针到最后一笔记录之后 2022-4-2558boolean first():移动记录指针到第一笔记录 boolean last():移动记录指针到最后一笔记录 boolean next():移动记录指针到下一笔记录 boolean previous():移动记录指针到上一笔记录 void deleteRow():删除记录指针指向的记录 void moveToInsertRow():移动记录指针以新增一笔记录 void moveToCurrentRow():移动记录指针到被记忆的记录 void insertRow():新增一笔记录到数据
34、库中 void updateRow():修改数据库中的一笔记录void update类型类型(int columnIndex,类型 x) :修改指定字段的值 int get类型类型(int columnIndex) :取得指定字段的值 ResultSetMetaData getMetaData():取得ResultSetMetaData类对象 2022-4-25597. ResultSetMetaData类 保存了所有ResultSet类对象中关于字段的信息,并提供许多方法来取得这些信息。主要方法如下: int getColumnCount():取得ResultSet类对象的字段个数 int
35、getColumnDisplaySize():取得ResultSet类对象的字段长度 String getColumnName(int column) :取得ResultSet类对象的字段名称 String getColumnTypeName(int column) :取得ResultSet类对象的字段类型名称 String getTableName(int column) :取得ResultSet类对象的字段所属数据表的名称 boolean isCaseSensitive(int column) :测试ResultSet类对象的字段是否区分大小写 boolean isReadOnly(int
36、 column) :测试ResultSet类对象的字段是否为只读2022-4-25608. DatabaseMetaData类 DatabaseMetaData类保存了数据库的所有特性,并且提供许多方法来取得这些信息。 主要方法如下: String getDatabaseProductName() :取得数据库名称 String getDatabaseProductVersion():取得数据库版本代号 String getDriverName():取得JDBC驱动程序的名称 String getDriverVersion() :取得JDBC驱动程序的版本代号 String getURL():
37、取得连接数据库的JDBC URL String getUserName():取得登录数据库的使用者帐号 2022-4-25619. 利用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
38、=DriverManager.getConnection(url);2022-4-2562(3)建立Statementjava.sql.Statement st = con.createStatement();(4)执行sql语句例如: st.executeUpdate(sql语句)(5)关闭连接con.close();9. 利用JDBC进行数据库操作的步骤(续)2022-4-25636.3数据源(DataSource)6.3.1数据源简介 数据源定义的是连接到实际数据库的一条路径,数据源中并无真正的数据,它仅仅记录连接到哪个数据库,以及如何连接的。 也就是说数据源仅仅是数据库的连接名称,一个
39、数据库可以有多个数据源连接。 2022-4-25646.3.2配置数据源1. 通过修改文件添加数据源 数据源的配置涉及修改server.xml和web.xml(1)在server.xml中加入元素 元素用来定义JNDI Resource,一般添加到server.xml文件的结束标志之前。2022-4-25652022-4-2566(2)在元素中加入 元素元素用来指定各种参数值 2022-4-2567 factory mons.dbcp.BasicDataSourceFactory maxActive 100 2022-4-2568(3)在web.xml中加入元素 DB Connection j
40、dbc/MyData javax.sql.DataSource Container 2022-4-25692. 通过Tomcat控制台添加数据源(1)启动Tomcat,打开浏览器,在地址栏中输入:http:/localhost:8080/admin/,输入用户名和密码后进入Tomcat系统管理界面。 2022-4-2570(2)单击左侧的Data Sources,选择Create New Data Source,在弹出对话框的输入框中输入以下数据: JNDI Name输入框中输入jdbc/mysql Data Source URL输入框中输入jdbc:mysql:/localhost:3306
41、/MyData JDBC Driver Class输入框中输入com.mysql.jdbc.Driver User Name输入框中输入用户名root Password输入框中输入密码123 其他可安装默认值。 2022-4-2571(3)单击Save按钮,然后单击界面上部的Commit Changes按钮。(4)将数据库的JDBC驱动放入TOMCAT_HOME/common/lib下 2022-4-25726.3.3程序中访问数据源javax.naming.Context提供了查找JNDI Resource的接口,可以通过三个步骤来使用数据源对象:1. 获得对数据源的引用: Context
42、ctx = new InitalContext(); DataSource ds = (DataSource)ctx.lookup(java:comp/env/jdbc/mysql);2. 获得数据库连接对象: Connection con = ds.getConnection();3. 返回数据库连接到连接池: con.close();2022-4-2573注意:发布使用数据库的Web应用程序时,如果直接用JDBC访问数据库,可以把JDBC驱动程序拷贝到Web应用的WEB-INF/lib目录或者Tomcat安装目录下的common/lib目录下。如果通过数据源访问数据库,由于数据源由Serv
43、let容器创建并维护,所以必须把JDBC驱动程序拷贝到Tomcat安装目录下的common/lib目录下,确保Servlet容器能够访问驱动程序。2022-4-25746.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)
44、; Connection conn = ds.getConnection(); conn.close(); out.print(MySQL 数据源测试成功!); catch (Exception ex) out.print(出现意外,信息是: + ex.getMessage();ex.printStackTrace();%2022-4-2575因为没有配置,所以会出现出错信息。 图6.26 没有配置会出现出错信息2022-4-2576需要修改WEB-INF目录下的web.xml文件(如果没有该文件,则需要创建该文件),配置好的web.xml文件代码如下: mysqlDB Connection
45、jdbc/mysql javax.sql.DataSource Container 2022-4-2577此外,要在应用程序根目录下的META-INF目录下新建一个context.xml文件(如果没有META-INF目录,则需要新建),在其中输入以下的配置代码: 2022-4-2578图6.27 使用数据源访问数据库2022-4-25796.5小结 数据库是几乎所有的Web应用程序必不可少的部分,本章介绍了MySQL数据库的安装与配置,包括数据库的基础知识。此外还介绍了前台程序代码访问后台数据库的两种方法,一种是通过JDBC来访问,另一种是通过数据源来访问。2022-4-25806.6习题 1
46、. 单选题(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. UPDATE2022-4-25812. 上机练习 (1)启动MySQL的命令行管理工具,用MySQL的建库语句建立一个名为company的数据库。(2)在company库中建立雇员表em
47、p,表的数据项及数据类型如下所示:empno int(4) not null primary key,ename varchar(10),job varchar(10),2022-4-25822022-4-25832022-4-25842022-4-25852022-4-25862022-4-2587馋死2022-4-25882022-4-25892022-4-25902022-4-25912022-4-25922022-4-25932022-4-25942022-4-25952022-4-25962022-4-25972022-4-25982022-4-25992022-4-25100PPT研究院P O W E R P O I N T A C A D E M Y2022-4-251012022-4-25102