1、 能书写正确的SQL语句,能利用JSP操作Access数据库,能利用JSP通过JDBC直连数据库。掌握基本的SQL语句用法;掌握配置数据源的用法;掌握驱动程序的加载、连接对象的创建、SQL语句对象的创建;能利用JSP对数据库进行查询、数据更新操作。任何一个购物网站,用户可根据自己的喜好查询某类商品、可对自己喜爱的商品下订单,这就要求购物网站具有利用动态网页开发技术完成对数据库数据进行查询、数据库更新等操作。任务一 基本SQL语句 vSQL语言由3部分组成:v(1)数据定义语言(DDL):用于执行数据库定义的任务,对数据库以及数据库中的各种对象进行创建、删除、修改等操作。数据库对象主要包括:表、
2、缺省约束、规则、视图、触发器、存储过程。v(2)数据操纵语言(DML):用于操纵数据库中各种对象,检索和修改数据。v(3)数据控制语言(DCL):用于安全管理,确定哪些用户可以查看或修改数据库中的数据。v1.数据库与数据表的创建v(1)创建数据库CREATE DATABASEv在SQL语言中,创建一个新数据库基本语法格式如下:vCREATE DATABASE 数据库名称v例如:vCREATE DATABASE XSDATAv(2)创建表CREATE TABLEv在SQL语言中,创建一个新表基本语法格式如下:vCREATE TABLE(,.)v例如:vCREATE TABLE student(s
3、no char(10),sname varchar(8),ssex char(2),sbirthday datetime,sdept char(16),address varchar(50)v2.数据表数据维护v(1)插入记录v语法形式:vINSERT INTO 表名(字段名表)VALUES(值表)v例如:INSERT INTO student VALUES(20020101,胡一兵,男,1980-12-30,CS)v(2)数据记录的修改v要修改表中已有数据的记录,可用UPDATE语句。v语句格式:vUPDATE SET=,=,WHEREv例如:vUPDATE student SET ssex
4、=女 WHERE sname=张丽v将张丽同学的性别改为女。v(3)删除数据行vDELETE用来从表中删除记录。v语法格式:vDELETE FROM表名 WHERE 条件v例如:vDELETE FROM student WHERE sno=20050301v删除学号为20050301的学生记录。v3.数据查询v语法形式:vSELECT DISTINCT 别名.字段名或表达式 AS 列标题 FROM 表或视图 别名v WHERE条件 GROUP BY 分组表达式 ORDER BY 排序表达式 ASC|DESC v其中:vSELECT子句指出查询结果中显示的字段名或字段名和函数组成的表达式等,AS
5、列标题指定查询结果显示的列标题。若要显示表中所有字段时,可用通配符“*”代替字段名列表。可用DISTINCT去除重复的记录行。vFROM子句指定表或视图。vWHERE子句定义了查询条件。vGROUP BY子句对查询结果分组。vORDER BY子句对查询结果排序。任务二 连接Access数据库v1.创建ODBC数据源v(1)创建一个Access型数据库v(2)创建ODBC数据源v要通过JDBC-ODBC桥访问数据库,就必须先为数据库建立一个ODBC数据源,这样数据库才能实现和应用程序的交互。v2.建立JDBC-ODBC桥接器vJDBC-ODBC桥接器就是把应用程序与数据源连接起来的驱动程序。因此
6、,创建了数据源以后,还要加载JDBC-ODBC桥接器,即加载驱动程序。v下面是加载驱动程序的方式:vtryvv Class.forName(sun.jdbc.odbc.JdbcOdbcDriver);v catch(ClassNotFoundException e)v v通过Class类的静态方法forName(String driver)加载JDBC-ODBC桥接器。v3.建立数据库连接v创建了数据源,加载了驱动程序,应用程序还是不能连接到数据库。应用程序要访问数据库,还必须创建一个到数据库的连接。即创建一个连接对象。v下面是创建连接对象的静态方法:vpublic static Connec
7、tion getConnection(String url,String user,String password)throws SQLExceptionv假设数据源名是“xs_access”,用户登录系统的帐号是user/password。下面是获得连接对象的两种方法:vConnection conn=DriverManagergetConnection(“jdbc:odbc:xs_access”,user,password);vConnection conn=DriverManagergetConnection(“jdbc:odbc:xs_access”);vgetConnection()
8、方法是DriverManager类的一个静态方法。对于Access数据库连接,一般采用第二种连接。对于SQL Server数据库采用第一种连接方法。v4.进行数据库操作v数据库操作分为数据查询与数据维护两种。v(1)数据查询v通过以下两个步骤,获得查询结果集。v创建语句对象vStatement stmt=conncreateStatement(int type,int concurrency);v在顺序数据查询、数据更新事务中,一般采用无参的createStatement()方法创建语句对象。如果事务是随机查询、游动查询和用结果集更新数据库,则应采用createStatement(int ty
9、pe,int concurrency)方法创建语句对象。下面是对该方法参数的说明。vtype 的取值决定滚动方式,即结果集中的游标是否能上下滚动。取值如下:vResultSet.TYPE_FORWORD_ONLY:结果集的游标只能向下滚动。vResultSet.TYPE_SCROLL_INSENSITIVE:结果集的游标可以上下移动,当数据库变化时,当前结果集不变。vResultSet.TYPE_SCROLL_SENSITIVE:返回可滚动的结果集。当数据库变化时,当前结果集同步改变。vconcurrency的取值决定是否能用结果集更新数据库。concurrency取值如下:vResultSe
10、t.CONCUR_READ_ONLY:不能用结果集更新数据库中的表。vResultSet.CONCUR_UPDATABLE:能用结果集更新数据库中的表。v获得查询结果集vResultSet rs=stmtexecuteQuery(sql);/获得结果集rsv在ResultSet对象中,读取当前记录各字段值的方法是getXXX()方法,常用的方法如下:vpublic String getString(String columnName)throws SQLExceptionv读取当前记录中指定字段名的值,这个值以字符串形式返回。vpublic String getString(int colum
11、nIndex)throws SQLExceptionv读取当前记录中指定索引号字段的值,返回值是字符串。字段索引号从1开始编号,各字段的索引号以字段在select语句中的先后位置为准。在顺序查询中,只能使用next()方法,使游标移到下一行记录。v类似于getString(),如果当前记录中的某个字段是整数,可以用getByte()、getShort()、getInt()、getLong()直接读取到整数值。如果当前记录某字段是浮点型的,可以用getFloat()、getDouble()读取。如果当前记录某字段是布尔型的,可以用getBoolean()读取。如果当前记录是日期型的,可以用get
12、Date()、getTime()分别读取日期和时间。v要对ReusltSet对象中的数据进行更新操作,可用如下的方法:vpublic void deleteRow()throws SQLExceptionv删除ResultSet对象中当前指针处的记录。vpublic void updateRow()throws SQLExceptionv把ResultSet对象中当前记录的值回写至数据库中。vpublic void updateDouble(String columnName,double x)throws SQLExceptionv把当前记录中指定字段名的double型值更新为一个新的值x。
13、v相类似的方法还有:updateShort()、updateInt()、updateLong()、updateByte()、updateDate()、updateTime()、updateFloat()、updateBoolean()、updateString()等。vResultSet中和记录指针移动相关的方法有:vpublic int getRow()v获得当前记录的记录号。vpublic boolean next()v将ResultSet对象中的记录指针移到下一条记录处,如果成功移动返回true,移动失败返回false。vpublic boolean previous()v将游标向上移动
14、,该方法返回boolean型数据,当移动到结果集第一行之前时返回false。vpublic void beforeFirst()v将游标移到结果集的初始位置,即在第一行之前。vpublic void afterLast()v将游标移到结果集最后一行之后。vpublic void first()v将游标移到结果集的第一行。vpublic void last()v将游标移到结果集的最后一行。vpublic boolean isAfterLast()v判断游标是否在最后一行之后。vpublic boolean isBeforeFirst()v判断游标是否在第一行之前。vpublic boolean
15、isFirst()v判断游标是否指向结果集的第一行。vpublic boolean isLast()v判断游标是否指向结果集的最后一行。vpublic int getRow()v得到当前游标所指向的行号。行号从1开始,如果结果集没有行,返回0。vpublic boolean absolute(int row)v将游标移到参数row指定的行号。v说明:如果row取负值,就是倒数的行数。asolute(-1)表示移到最后一行,asolute(-2)表示移到倒数第二行。当移到第一行前面或最后一行的后面时,该方法返回false。v(2)数据更新v数据更新操作通过以下两个步骤实现:v创建语句对象vSta
16、tement stmt=conncreateStatement(int type,int concurrency);v执行更新vString sql=sqlStatement ;vsql代表插入、修改或删除操作的SQL字符串。vint number=stmtexecuteUpdate(sql);v执行更新操作,executeUpdate()方法返回执行更新影响的数据行数。任务三 连接SQL Server数据库 v下载免费的SQL Server 2000 Driver for JDBC Service Pack 4的安装文件。下载完毕后,双击安装文件并完成安装。v安装完毕后需要将C:Progra
17、m FilesMicrosoft SQL Server 2000 Driver for JDBClib 目录下的msbase.jar,msutil.jar和mssqlserver.jar这3个文件复制到Tomcat下的lib 目录下。v2.通过JDBC直连数据库v加载驱动程序v在JDBC中,通常有两种加载驱动程序的方式。一种是将驱动程序加到java.lang.System的属性jdbc.drivers中。这是一个由DriverManager类加载的驱动程序类名的列表,用冒号分隔。v另一种方式是在程序中利用Class.forName()方法加载指定的驱动程序,这样将显式地加载驱动程序。这种方式与
18、外部设置无关,因此推荐使用这种加载驱动程序的方式。代码如下:vClass.forName(com.microsoft.jdbc.sqlserver.SQLServerDriver);v其中com.microsoft.jdbc.sqlserver.SQLServerDriver为SQL Server的JDBC驱动程序的别名。v创建指定数据库的URLv要建立与数据库的连接,首先要创建指定数据库的URL。数据库URL对象与网络资源的统一资源定位类似,具体语法为如下:vjdbc:subProtocol:subName:/hostname:port;DatabaseName=dbname v建立与数据库
19、的连接v连接通常是通过数据库的URL对象,利用DriverManager的getConnection()方法建立的。创建数据库连接时,需要提供数据库的URL和驱动类型,并且提供访问数据库的用户名和密码。格式为:vConnection conn=DriverManager.getConnection(url,user,password);任务四 数据库维护 v1.数据库表的创建v在数据库建立好后,下一步应建立数据表,以存放数据。数据表即可在企业管理器中直接建立,也可通过程序建立。v2.数据库表记录的添加v向数据表中加入数据有两种方式,一种是通过企业管理器直接加入,另一种是通过程序向表中加入数据行
20、。下面我们通过编写程序向数据表中加入数据行。v3.数据库表记录的更新v为了实现数据库表记录更新功能,和添加记录一样,也利用SQLServerXSCJConnBean的executeUpdate()成员函数。v4.数据库表记录的删除v在数据库的维护过程中,经常要删除一些已经没有意义的记录。为了实现删除功能,和添加记录、更新记录一样,也利用SQLServerXSCJConnBean的executeUpdate()成员函数。知识拓展v1.预编译SQL语句v对于要多次执行的SQL语句,SQL Server 2000支持将其写成预编译SQL语句形式,而后直接多次调用。预编译SQL语句分为准备和执行两个过
21、程,准备语句过程是通知SQL Server 2000服务器将预编译语句编译成执行计划,SQL语句只需编译一次,后续执行是直接调用编译得到的机器代码段,执行效率较高。v在预编译语句中,不出现具体的数据值,具体数据值用“?”代替。在执行预编译语句前,要将具体数据值写入“?”处。v在JDBC中,使用Connection类的prepareStatement()方法为一条预编译语句建立一个PreparedStatement预编译对象,此方法的传入参数为等待编译的SQL语句。SQL语句中可变动的数据值用“?”表示,一般用法形如:vConnection con=.;vString sql=“insert i
22、nto xxxTable values(?,?)”;vPreparedStatement st=con.prepareStatement(sql);vPreparedStatement接口中常用的方法有:vpublic void setString(int n,String x)throws SQLExceptionv将一个字符串类型的数据值x写入预编译SQL语句的第n个“?”号处,n为预编译语句中“?”号的序号,第一个“?”号的序号为1。例如:vConnection con=.;vString sql=“select*from xscj where xh=?”;vPreparedStatem
23、ent st=con.prepareStatement(sql);vst.setString(1,“201”);v类似于setString()方法的用法还有setBoolean()、setByte()、setDate()、setInt()、setDouble()、setTime()等。vpublic ResultSet executeQuery()throws SQLExceptionv执行预编译的select语句,返回一个ResultSet结果集。vpublic int executeUpdate()throws SQLExceptionv执行预编译的delete、update、insert
24、等数据库更新命令,返回值是语句的影响行数。vpublic boolean execute()throws SQLExceptionv执行PreparedStatement对象中的预编译语句,可以是任何的SQL语句,返回true表示结果是一个ResultSet对象,返回false表示没有返回结果或返回的结果是SQL语句的影响行数。v2.使用存储过程v存储过程是用SQL语句和控制流语句等编写的一段程序代码,在创建时已被编译成机器代码并存储在数据库中供客户端调用。存储过程有以下优点:v所生成的机器代码被永久存储在数据库中,客户端调用时不需要重新编译,执行起来效率要高一些。v存储过程的网络使用效率比等
25、效的SQL 语句要高。v调用存储过程的命令如下示:v存储过程调用命令形式一v如果存储过程无返回值,但允许有传入参数时,调用命令格式形如:vcall 过程名(?,?,.)v“?”为参数标记符,含义同PreparedStatement。v存储过程调用命令形式二v如果存储过程有返回值,调用命令格式形如:v?=call 过程名(?,?,.)v左边第一个“?”处的参数存储返回值。动手练习v练习目的:练习目的:v1.掌握常用的SQL语句用法,掌握JavaBean的编写。v2.掌握在JSP中进行数据库数据的查询与更新操作。v练习内容:练习内容:v1.创建一个Access数据库,在数据库中建立一个学生档案的数据表,数据表包含的字段有编号、姓名、性别、年龄、家庭住址这样几个字段,向数据表中输入若干行数据,编写程序完成把数据表中的数据逐行输出到网页中。v2.建立一个SQL Server数据库,在数据库中建立一个学生成绩表,数据表中包含的字段包括学号、姓名、高等数学、英语、计算机网络、数据库原理,向数据表中输入若干行数据,编写程序完成把数据表中的数据逐行输出到网页中。v3.利用上一题的数据库与数据表,编写分页显示学生成绩的程序,实现学生成绩每页显示10行数据,通过网页中的“上一页”、“下一页”超级链接可完成翻页功能。