1、第10章 数据库访问 第10章 数据库访问 10.1 数据库概述 10.2 MySQL数据库 10.3 JDBC 10.4 数据库的维护 10.5 数据库查询 10.6 数据库操作实例第10章 数据库访问 10.1 10.1 数数据据库库概概述述数据库是按照数据结构来组织、存储和管理数据的仓库,它产生于50年前。随着信息技术和市场的发展,数据管理不再仅仅是存储和管理数据,而转变成用户所需要的各种数据管理的方式。数据库有很多种类型,从最简单的存储有各种数据的表格到能够进行海量数据存储的大型数据库系统,在各个方面都得到了广泛的应用。第10章 数据库访问 10.1.1 10.1.1 数据库的功能数据
2、库的功能数据库提供了以下主要功能:实现数据共享:数据共享包含所有用户可同时存取数据库中的数据,也包括用户可以用各种方式通过接口使用数据库,并提供数据共享。减少数据的冗余度:与文件系统相比,由于数据库实现数据共享,从而避免了用户各自建立应用文件,减少了大量重复数据,减少了数据冗余,维护了数据的一致性。数据的独立性:数据的独立性包括数据库中数据库的逻辑结构和应用程序相互独立,也包括数据物理结构的变化不影响数据的逻辑结构。第10章 数据库访问 数据实现集中控制:文件管理方式中,数据处于一种分散的状态,不同的用户或同一用户在不同处理中其文件之间毫无关系。利用数据库可对数据进行集中控制和管理,并通过数据
3、模型表示各种数据的组织以及数据间的联系。数据一致性和可维护性,以确保数据的安全性和可靠性:主要包括安全性控制,以防止数据丢失、错误更新和越权使用;完整性控制,保证数据的正确性、有效性和相容性;并发控制,使在同一时间周期内,允许对数据实现多路存取,还能防止用户之间的不正常交互作用;故障的发现和恢复,由数据库管理系统提供一套方法,可及时发现故障和修复故障,从而防止数据被破坏。第10章 数据库访问 故障恢复:由数据库管理系统提供一套方法,发现故障后及时修复,从而防止数据被破坏。数据库系统能尽快恢复数据库系统运行时出现的故障,这些故障可能是物理上或是逻辑上的错误,比如对系统的误操作造成的数据错误等。第
4、10章 数据库访问 10.1.2 SQL10.1.2 SQL语句语句SQL(Structure Query Language)是用于访问和处理数据库的标准的计算机语言。SQL是一种由美国国家标准化组织(American National Standards Institute,ANSI)推荐的标准计算机语言,提供访问数据库的能力。SQL可以实现以下功能:面向数据库执行查询和取回数据;在数据库中插入新的记录;更新数据库中的数据;从数据库删除记录;第10章 数据库访问 创建新数据库;在数据库中创建新表;在数据库中创建存储过程;在数据库中创建视图;设置表、存储过程和视图的权限。数据库通常包含一个或多
5、个表,每个表由一个名字标识(例如“学生信息”或者“课程成绩”),表包含带有数据的记录(行)。例如一个名为Students的学生信息表:第10章 数据库访问 第10章 数据库访问 上面的表包含三条记录(每一条对应一个人)和五个字段(Id、姓、名、地址和城市)。在数据库上执行的大部分工作都由 SQL 语句完成。(1)通过SQL语句创建该表:create table Persons(id int auto_increment,/第一个字段,自动增长记录行序号 LastName char(20)not null,/第二字段,名 FirstName char(20)not null,/第三字段,姓 Ad
6、dress varchar(50),/第四字段,联系住址 City char(30),/第五字段,居住城市 Primary Key(id);/序号字段为主键第10章 数据库访问(2)当表建立成功后就可以添加数据。在该表中由于ID字段被设置为自动增长属性,所以只需要添加其他三个字段内容即可,通过SQL语句向该表插入数据:insert into Persons(LastName,FirstName,Address,City)values(“Adams”,“Zhang”,“Yanta Street”,“Xi An”)同时插入多条数据:insert into Persons(LastName,Firs
7、tName,Address,City)values(“Bush”,“Li”,“Centruy Avenue”,“Shang Hai”),(“Carter”,“Wang”,“Changan Street”,“BeiJing”)(3)可以通过选择语句从表中读取指定的数据,例如选取 LastName 列的数据:SELECT LastName FROM Students第10章 数据库访问 结果集类似这样:第10章 数据库访问 如果要选择FirstName=Bush:SELECT*FROM Persons where FirstName=“Bush”结果集类似这样:(4)当发现存在不合理的数据时应该删
8、除该记录,例如,删除LastName=Bush:DELETE FROM Persons WHERE LastName=Bush如果要删除所有记录,则:DELETE FROM Persons;第10章 数据库访问 10.2 MySQL10.2 MySQL数据库数据库10.2.1 MySQL 10.2.1 MySQL 在本书中采用MySQL数据库管理系统软件。MySQL是一个小型关系型数据库管理系统,开发者为瑞典MySQLAB公司,由于其体积小、速度快、总体拥有成本低,尤其是开放源码这一特点,许多中小型网站为了降低网站总体成本而选择了MySQL作为网站数据库。MySQL的官方网站的网址是:www.
9、MySQL.com。与其他的大型数据库例如Oracle、DB2、SQL Server等相比,MySQL有它的不足之处,如规模小、功能有限等,但是这丝毫也没有减少它受欢迎的程度。对于一般的个人使用者和中小型企业来说,MySQL提供的功能已经绰绰有余,而且由于MySQL是开放源码软件,因此可以大大降低总体拥有成本。在各大下载网站均可免费下载MySQL,其当前最新版本为MySQL 5.1.46。第10章 数据库访问 在Windows环境下安装,可选MySQL稳定版本MySQL-5.0.67-win32.zip,安装步骤简单,容易入手,如图10-1所示。图10-1 MySQL安装主界面 第10章 数据
10、库访问 图10-2 设置服务端口 但需要注意配置MySQL服务端口、支持的字体编码和管理员密码。其默认服务端口3306,可改为自定义的端口,如图10-2所示。第10章 数据库访问 其默认字体编码Latin1,需要修改为UTF-8,以便支持多国文字,如图10-3所示。图10-3 设置默认字符集 第10章 数据库访问 MySQL安装完毕后,下载数据库驱动类库MySQL-connector-java-5.1.7-bin.jar,并将其复制到Java安装路径,例如:安装路径为C:Program FilesJavajdk1.5.0_02lib。然后在JCreator编译环境中添加该数据库连接文件的存储路
11、径,如图10-4所示。第10章 数据库访问 图10-4 在JCreator中引入MySQL连接工具开发包 第10章 数据库访问 10.2.2 MySQL10.2.2 MySQL常用命令常用命令管理MySQL数据库可以通过MySQL安装目录下bin中的命令行工具MySQL和MySQLadmin来进行,也可以从MySQL的网站下载图形管理工具MySQL Administrator和MySQL Query Browser。如果使用命令行工具,常用的命令如下:显示数据库列表:show databases;刚开始时只有两个数据库:MySQL和test。MySQL库很重要,它里面有MySQL的系统信 息,
12、我们改密码和新增用户,实际上就是用这个库进行操作。第10章 数据库访问 使用某数据库:use databases_name;显示库中的数据表:show tables_name;显示数据表的结构:describe tables_name;建立数据库:create database databases_name;建立数据表:create table tables_name(字段设定列表);第10章 数据库访问 显示表中的记录:select*from tables_name;将表中记录清空:delete from tables_name;删库和删表:drop table tables_name;dr
13、op database databases_name;第10章 数据库访问 10.3 JDBC10.3 JDBC10.3.1 JDBC10.3.1 JDBC的结构的结构JDBC(Java Data Base Connectivity,Java数据库连接)是一种用于执行SQL语句的Java API,可以为多种关系数据库提供统一访问接口,它由一组用Java语言编写的类和接口组成。JDBC对Java程序员而言是API,对实现与数据库连接的服务提供商而言是接口模型。作为API,JDBC为程序开发提供标准的接口,并为数据库厂商及第三方中间件厂商实现与数据库的连接提供了标准方法。JDBC使用已有的SQL
14、标准并支持与其他数据库连接标准,如ODBC之间的桥接。JDBC实现了所有这些面向标准的目标并且具有简单、严格类型定义且高性能实现的接口。JDBC的结构如图10-5所示。第10章 数据库访问 图10-5 JDBC层次结构 第10章 数据库访问 在JDBC体系结构中包含两个层次:JDBC API和JDBC驱动程序管理器API通信,向它发送各种不同的SQL语句。驱动程序管理器和各种不同的第三方驱动程序通信,完成数据库连接,返回查询信息或执行查询语句指定的操作。JDBC扩展了Java的功能。例如,用Java和JDBC API可以发布含有applet的网页,而该applet使用的信息可能来自远程数据库。
15、企业也可以用 JDBC 通过Intranet 将所有职员信息存储到一个或多个内部数据库中。随着越来越多的程序员开始使用Java编程语言,对从Java中便捷地访问数据库的要求也在日益增加。第10章 数据库访问 10.3.2 JDBC10.3.2 JDBC的驱动程序的驱动程序目前比较常见的JDBC驱动程序可分为以下四个种类:(1)JDBC-ODBC桥加ODBC驱动程序。JavaSoft桥产品利用ODBC驱动程序提供JDBC访问。注意,必须将ODBC二进制代码加载到使用该驱动程序的每个客户机上。因此,这种类型的驱动程序最适合于企业网,或者是用Java编写的三层结构的应用程序服务器代码。(2)本地AP
16、I。这种类型的驱动程序把客户机API上的JDBC调用转换为Oracle、Sybase、Informix、DB2或其他DBMS的调用。注意,像桥驱动程序一样,这种类型的驱动程序要求将某些二进制代码加载到每台客户机上。第10章 数据库访问(3)JDBC网络纯Java驱动程序。这种驱动程序将JDBC转换为与DBMS无关的网络协议,之后这种协议又被某个服务器转换为一种DBMS协议。这种网络服务器中间件能够将它的纯Java客户机连接到多种不同的数据库上。所用的具体协议取决于提供者,所以,这是最为灵活的JDBC 驱动程序。(4)本地协议纯Java驱动程序。这种类型的驱动程序将JDBC调用直接转换为DBMS
17、所使用的网络协议。这将允许从客户机上直接调用DBMS服务器,是Intranet访问的一个很实用的解决方法。第10章 数据库访问 10.3.3 10.3.3 数据库编程的基本步骤数据库编程的基本步骤在JDBC中访问数据库的基本步骤:首先加载数据库驱动程序,其次建立数据库连接,接下来执行SQL语句访问数据库,然后处理结果集,最后关闭结果集,并断开连接。所以,JDBC由一系列连接(Connection)、SQL语句声明(Statement)和结果集(ResultSet)构成,如图10-6所示。第10章 数据库访问 图10-6 JDBC结构 第10章 数据库访问 1.JDBC URL1.JDBC UR
18、L在加载数据库驱动程序时需要对网络上的数据库进行定位。JDBC URL提供了一种标识数据库的方法,可以使相应的驱动程序能识别该数据库并与之建立连接。其作用是提供某些约定,驱动程序编程员在构造他们的JDBC URL时应该遵循这些约定。由于JDBC URL要与各种不同的驱动程序一起使用,因此这些约定应非常灵活。首先,它们应允许不同的驱动程序使用不同的方案来命名数据库。例如,odbc子协议允许(但并不是要求)URL含有属性值。第10章 数据库访问 其次,JDBC URL应允许驱动程序编程员将一切所需的信息编入其中。这样就可以让要与给定数据库对话的applet打开数据库连接,而无须要求用户去做任何系统
19、管理工作。最后,JDBC URL应允许某种程度的间接性。也就是说,JDBC URL可指向逻辑主机或数据库名,而这种逻辑主机或数据库名将由网络命名系统动态地转换为实际的名称。JDBC URL的标准语法如下:JDBC:它由三部分组成,各部分间用冒号分隔。JDBC URL的三个部分可分解如下:JDBC协议:JDBC URL中的协议总是JDBC。第10章 数据库访问 :驱动程序名或数据库连接机制(这种机制可由一个或多个驱动程序支持)的名称。子协议名的典型示例是“odbc”,该名称是为用于指定ODBC风格的数据资源名称的URL专门保留的。例如,为了通过JDBC-ODBC桥来访问某个数据库,可以用如下所示
20、的URL:JDBC:odbc:book。本例中,子协议为“odbc”,子名称“book”是本地ODBC数据资源。如果要用网络命名服务(这样JDBC URL中的数据库名称不必是实际名称),则命名服务作为子协议,例如,URL:JDBC:dcenaming:accounts。第10章 数据库访问 :一种标识数据库的方法。子名称可以依不同的子协议而变化。它还可以有子名称的子名称(含有驱动程序编程员所选的任何内部语法)。使用子名称的目的是为定位数据库提供足够的信息。若数据库是通过Internet来访问的,则必须遵循如下的标准URL命名约定:/主机名:端口/子协议。假设“dbnet”是个用于将某个主机连接
21、到Internet上的协议,则JDBC URL应为:JDBC:dbnet:/wombat:356/fred。第10章 数据库访问 2.DriverManager2.DriverManager类类当明确了数据库的URL后,用户还需要安装与指定数据库相应的驱动程序。在Java语言中,DriverManager类负责加载和注册JDBC驱动程序,管理应用程序和已注册的驱动程序的连接。加载和注册驱动程序使用Class类的forName方法,装载驱动程序只需要非常简单的一行代码。例如,若要使用 JDBC-ODBC 桥驱动程序,可以用下列代码装载它:Class.forName(“sun.JDBC.odbc.
22、JdbcOdbcDriver”);驱动程序文档将提示应该使用的类名。例如,如果类名是 JDBC.DriverXYZ,那么将用以下代码装载驱动程序:Class.forName(JDBC.DriverXYZ);第10章 数据库访问 不需要创建一个驱动程序类的实例并且用 DriverManager 登记它,因为调用Class.forName 将自动加载驱动程序类。如果你曾自己创建实例,你将创建一个不必要的副本,但它不会带来什么坏处。加载 Driver 类后,它们即可用来与数据库建立连接。第10章 数据库访问 3.Connection3.Connection接口接口Connection接口负责维护Ja
23、va应用程序与数据库之间的连接。用适当的驱动程序类与 DBMS建立一个连接。下列代码是一般的做法:Connection con=DriverManager.getConnection(url,“user”,“Password”);在这里url是关键。如果你正在使用 JDBC-ODBC 桥,JDBC URL 将以 JDBC:odbc 开始,余下URL通常是你的数据源名或数据库系统名。因此,假设你正在使用ODBC存取一个叫“Fred”的ODBC数据源,你的JDBC URL是JDBC:odbc:Fred。把“user”及“Password”替换为你登录DBMS的用户名及口令。如果你登录数据库系统的用
24、户名为“Fernanda”,口令为“J8”,只需下面的2行代码就可以建立一个连接:第10章 数据库访问 String url=“JDBC:odbc:Fred”;Connection con=DriverManager.getConnection(url,“Fernanda”,“J8”);如果你使用了第三方JDBC驱动程序,程序文档将告诉你该使用什么子协议,就是在 JDBC URL中放在JDBC后面的部分。例如,如果驱动程序开发者注册了acme作为子协议,JDBC URL的第一和第二部分将是 JDBC:acme。JDBC URL最后一部分提供了定位数据库的信息。如果装载的驱动程序识别了提供给Dr
25、iverManager.getConnection的JDBC URL,那么驱动程序将根据JDBC URL建立一个到指定DBMS的连接。DriverManager 类在后台为你管理建立连接的所有细节。程序员在此类中直接使用唯一方法DriverManager.get Connection()。该方法返回一个打开的连接,你可以使用此连接创建JDBC statements并发送SQL语句到数据库。在前面的例子里,con对象是一个打开的连接,并且我们要在以后的例子里使用它。第10章 数据库访问 所以,JDBC连接数据库的准备工作分三个步骤,分别是:(1)加载驱动程序。Class.forName(“sun
26、.JDBC.odbc.JdbcOdbcDriver”);(2)创建指定数据库的URL。String url=“JDBC:odbc:fred”;(3)建立数据库连接。DriverManager.getConnection(url,userID,password);第10章 数据库访问 例如:import java.sql.*;/定义连接字串,LibrarySQLServer是ODBC数据源名String url=“JDBC:odbc:LibrarySQLServer”;Connection conn=null;/建立连接类try /告诉程序使用JDBC与ODBC桥创建数据库连接 Class.fo
27、rName(“sun.JDBC.odbc.JdbcOdbcDriver”);/使用DriverManager类的getConnection()方法建立连接,/第一个字符参数定义用户名,第二个字符参数定义密码 conn=DriverManager.getConnection(url,“”,“”);catch(Exception e)第10章 数据库访问 又例如:/加载数据库驱动Class.forName(“com.MySQL.JDBC.Driver”);/连接数据库,IP地址:3306(是端口):数据库名String url=“JDBC:MySQL:/10.10.2.188:3306/bbs”;
28、/root是用户名,123456是密码Connection con=DriverManager.getConnection(url,“root”,“123456”);/声明SQL语句执行实例对象Statement stat=con.createStatement();第10章 数据库访问 4.Statement 4.Statement 类和接口,以及类和接口,以及PreparedStatementPreparedStatement接口接口数据库连接完毕,接下来创建SQL语句执行实例对象,预备进行数据库的维护。在Java中,定义了三种类,来分别执行不同的SQL语句:Statement:执行简单的
29、无参数的SQL语句;PrepareStatement:采用预编译的Statement,用于执行带参数的SQL语句;CallableStatement:执行数据库存储过程的调用。例如:Statement stmt=conn.createStatement();第10章 数据库访问 创建JDBC Statements对象,Statement对象用于把SQL语句发送到DBMS。需要创建一个Statement对象并且执行它。Statement对象有三个常用的方法,分别是:ResultSet executeQuery(String sql)throws SQLException:执行一条SELECT语句
30、,返回查询结果集;Int executeUpdate(String sql)throws SQLException:执行INSERT UPDATE DELETE语句,返回操作成功的记录数;Void close()throws SQLException:释放Statement对象的数据库和JDBC资源。第10章 数据库访问 对SELECT语句来说,可以使用executeQuery()方法。要创建或修改表的语句,使用的方法是executeUpdate()。需要一个活跃的连接的来创建Statement对象的实例。例如,使用Connection对象con创建Statement对象stmt:Statem
31、ent stmt=con.createStatement();到此stmt已经存在了,但它还没有把SQL语句传递到DBMS。我们需要提供SQL语句作为参数提供给我们使用的Statement的方法。例如,在下面的代码段里,使用上面例子中的 SQL 语句作为executeUpdate的参数:stmt.executeUpdate(“create table Persons”+(id int auto_increment,LastName char(20)not null,FirstName char(20)not null,第10章 数据库访问 Address varchar(50),City ch
32、ar(30),Primary Key(id)“);SQL准备完毕就该执行语句,我们使用 executeUpdate()方法是因为其中的SQL语句是DDL(数据定义语言)语句。创建表、改变表、删除表都是DDL语句,要用executeUpdate()方法来执行。方法executeUpdate()也被用于执行更新表SQL语句。实际上,相对于创建表来说,executeUpdate()用于更新表的时间更多,因为表只需要创建一次,但经常被更新。使用最多的执行SQL语句的方法是executeQuery()。例如:/加载数据库驱动Class.forName(”com.MySQL.JDBC.Driver“);/
33、连接数据库,IP地址:3306(是端口):数据库名String url=JDBC:MySQL:/10.10.2.188:3306/bbs;第10章 数据库访问/root是用户名,123456是密码Connection con=DriverManager.getConnection(url,“root”,“123456”);/声明SQL语句执行实例对象Statement stat=con.createStatement();stat.executeQuery(“select*from Students where id=1”);在Java语言中,PreparedStatement是Stateme
34、nt的子接口,两者功能相似。如果某SQL指令被执行多次,PreparedStatement的效率比Statement高,且PreparedStatement可以给SQL指令传递参数。例如:/加载数据库驱动Class.forName(com.MySQL.JDBC.Driver);第10章 数据库访问/连接数据库,IP地址:3306(是端口):数据库名String url=JDBC:MySQL:/10.10.2.188:3306/bbs;/root是用户名,123456是密码Connection con=DriverManager.getConnection(url,root,123456);/声
35、明SQL语句执行实例对象String sql=select*from Students where id=?and firstName=?;PreparedStatement stat=con.preparedStatement(sql);stat.setInt(1,1);stat.setString(2,Li);stat.executeQuery();第10章 数据库访问 5.ResultSet5.ResultSet接口接口ResultSet接口用于通过statement或preparedStatement调用excuteQuery()方法后,存储返回的查询结果集。其常用的读取数据的方法如表
36、10-1所示。第10章 数据库访问 第10章 数据库访问 例如:Class.forName(“com.MySQL.JDBC.Driver”);String url=“JDBC:MySQL:/10.10.2.188:3306/bbs”;Connection con=DriverManager.getConnection(url,“root”,“123456”);String sql=“select*from Students”;PreparedStatement stat=con.preparedStatement(sql);ResultSet rs=stat.executeQuery();wh
37、ile(rs.next()System.out.print(“ID=”+rs.getInt(“id”);System.out.print(“LastName=”+rs.getString(“lastname”);System.out.print(“FirstName=”+rs.getString(“firstname”);stat.close();con.close();第10章 数据库访问 10.4 10.4 数据库的维护数据库的维护10.4.1 10.4.1 数据的添加数据的添加当在指定的数据库内建立了相应的数据表,就需要向该表中添加数据。在表中插入一条新的记录的语法如下:insert i
38、nto 表名称(字段名1,字段名2,)values(值1,值2,)向表中添加数据有以下规则:(1)values中值的类型必须和字段类型保持一致;(2)如果值包括了所有字段,则可不必列出字段名称,依次按表中字段顺序赋值;第10章 数据库访问(3)如果表中某第一个字段具有自动增加属性,则可不必写主键字段名,会自动填写;(4)可以不必列出所有表中字段,但必须列出表中属性不为空的字段;(5)需要同时插入多条记录,可以在values后跟多个记录集合。例如,有表结构如create table Persons(id int auto_increment,/第一个字段,自动增长记录行序号LastName ch
39、ar(20)not null,/第二字段,名FirstName char(20)not null,/第三字段,姓Address varchar(50),/第四字段,联系住址City char(30),/第五字段,居住城市Primary Key(id);/序号字段为主键第10章 数据库访问 则考查以下SQL语句:Insert into Persons(id,LastName,FirstName,Address,City)values(1,“Nick”,“Bush”,“First Street No.1”,“New York”)正确Insert into Persons(id,LastName,F
40、irstName,Address,City)values(1,123,“Bush”,“First Street No.1”,“New York”)错误,因为对应LastName字段应该为字符串类型,使用单引号或者双引号包括:Insert into Persons values(1,“Mark”,“Johns”,“Chang An Avenve”,“Xian”)正确Insert into Persons values(“Mark”,1,“Johns”,“Chang An Avenve”,“Xian”)错误,字段顺序不一致,序号值排到了第2个位置Insert into Persons(LastNa
41、me,FirstName,Address,City)values(Mofy,Bush,First Street No.1,BeiJing)正确第10章 数据库访问 Insert into Persons(FirstName,Address)values(“Zhang”,“He Bei”)错误,没有列出LastName字段,该字段内容不能为空Insert into Persons(id,LastName,FirstName,Address,City)values(8,“yu”,“Guan”,“zhuo zhou”,“He Bei”)(9,“bei”,“Liu”,“zhuo zhou”,“He B
42、ei”)正确Insert into Persons(LastName,FirstName)values(12,“ren”,“Cao”)(13,“yuan”,“XiaHou”)正确在JDBC中为了实现以上SQL语句,需要调用Statement.execute Update()方法,该方法的返回值为整数,表示因该SQL语句执行而插入的数据记录行数,例如:Statement stat=con.createStatement();String sql=“Insert into Persons(id,LastName,FirstName,Address,City)values(1,Nick,Bush,F
43、irst Street No.1,New York)”;int i=stat.executeUpdate(sql);第10章 数据库访问 10.4.2 10.4.2 数据的删除数据的删除当数据表中某些数据不再需要,如发现该数据错误,可以利用SQL语句删除该数据,语法如下:delete from 数据表名 where 删除条件例如:delete from Persons where id=1delete from Persons where FirstName=“Cao”delete from Persons where City like“He%”delete from Persons whe
44、re LastName=“yu”and FirstName=“Guan”delete from Persons where FirstName=Cao or FirstName=XiaHou第10章 数据库访问 在JDBC中为了实现以上SQL语句,需要调用Statement.executeUpdate()方法,该方法的返回值为整数,表示因该SQL语句执行而删除的数据记录行数,例如:Statement stat=con.createStatement();String sql=“delete from Persons where FirstName=Cao”;int i=stat.execute
45、Update(sql);第10章 数据库访问 10.4.3 10.4.3 数据的修改数据的修改当数据表中某些数据错误时,可利用SQL语句修改,语法如下:update数据表名set字段名=值 where 修改条件在修改数据时有如下规则:若字段被标识为自增字段,则修改无效;若字段是主键,则修改后的取值不能和表中相同字段值相同;不能将非空的字段设置为Null。第10章 数据库访问 例如:update Persons set City=“Xian”/修改所有记录update Persons set City=“Ji Nan”where FirstName=“Liu”update Persons set
46、 Address=“the Center Road”,City=“Bei Jing”where FirstName=“Liu”在JDBC中为了实现以上SQL语句,需要调用Statement.executeUpdate()方法,该方法的返回值为整数,表示因该SQL语句执行而修改的数据记录行数,例如:Statement stat=con.createStatement();String sql=“update Persons set City=Ji Nan where FirstName=Liu”;int i=stat.executeUpdate(sql);第10章 数据库访问 10.5 10.5
47、 数数据据库库查查询询查询操作是数据库的基本操作,一个数据库应用中80%的工作量是完成了查询操作。10.5.1 10.5.1 数据库的查询方法数据库的查询方法实现查询数据的SQL语法如下:Select 字段1,字段2 from 数据表名 where 查询条件 order by 字段名在该语句中,需要给出查询结果的字段集合,多个字段之间使用“,”间隔,如要需要查询所有字段使用“*”来代替;查询的结果可以根据“order by”所指定的顺序给出。第10章 数据库访问 例如:Select*from PersonsSelect*from Persons where id=1Select FirstNa
48、me,LastName from Persons where id=1Select*from Persons where id=1 and id=2Select*from Persons where LastName like“c%”Select*from Persons order by idSelect FirstName,LastName,Address,City from Persons where City=“Bei Jing”order by FirstNameSelect count(*)as a from PersonsSelect count(*)as a from Pers
49、ons where City=Bei Jing第10章 数据库访问 在JDBC中为了实现以上SQL语句,需要调用Statement.executeQuery()方法,该方法的返回值为查询结果集(ResultSet),表示因该SQL语句执行获得的数据记录集合,例如:Statement stat=con.createStatement();String sql=“Select FirstName,LastName from Persons where id=1”;ResultSet rs=stat.executeQuery(sql);第10章 数据库访问 10.5.2 PreparedStatem
50、ent10.5.2 PreparedStatement类类Java中的PreparedStatement接口继承了Statement。由于 PreparedStatement 对象已预编译过,所以其执行速度要快于Statement对象。因此,多次执行的SQL语句经常创建为 PreparedStatement对象,以提高效率。PreparedStatement实例包含已编译的SQL语句。这就是使语句“准备好”。包含于PreparedStatement对象中的SQL语句可具有一个或多个插入参数。IN参数的值在SQL语句创建时未被指定。相反的,该语句为每个插入参数使用一个问号(“?”)作为占位符。每