1、,第6章 java数据库开发,第 6章 java数据库开发,6.1 数据库管理系统 6.2 JDBC概述 6.3 JDBC中的常用接口 6.4 连接数据库 6.5 典型JSP数据库连接,数据库管理系统,Java可以访问并操作很多种数据库管理系统,如SQL Server、MySQL、Oracle、Access、DB2、Sybase和PostgreSQL数据库等,下面介绍几种常用的数据库管理系统。,SQL Server 2000数据库 MySQL数据库 Oracle数据库 Access数据库,6.2 JDBC概述,JDBC是Java数据库连接(Java DataBase Connectivity)
2、的简称,是Java语言访问数据库的API ,由一组用Java语言编写的类和接口组成 ,java.sql包中。,6.2.1 JDBC技术介绍 6.2.2 JDBC驱动程序,6.2.1 JDBC技术介绍,JDBC是一种底层API,在访问数据库时需要在业务逻辑中直接嵌入SQL语句。需要注意的是,JDBC不能直接访问数据库,必须依赖于数据库厂商提供的JDBC驱动程序,通常情况下使用JDBC完成以下操作:,JDBC技术介绍,JDBC主要完成以下4个步骤:,(1)与数据库建立连接。 (2)向数据库发送SQL语句。 (3)处理发送的SQL语句。 (4)将处理的结果进行返回。,JDBC和ODBC的比较,ODB
3、C是访问数据库C语言接口 ODBC是低级和高层混合的API ODBC复杂难学 效率较低,6.2.2 JDBC驱动程序,JDBC驱动程序是用于解决应用程序与数据库通信的问题,它可以分为4种,下面分别进行介绍。JDBC-ODBC Bridge(JDBC-ODBC桥):利用ODBC驱 动程序提供JDBC访问,把JDBC调用映射为ODBC方法。 JDBC-Native Bridge(部分Java、部分本机驱动程序):将JDBC调用转换为特定DBMS专有的客户端API。 JDBC-Net Bridge(中间数据访问服务器):将JDBC调用转换至中间服务器,由中间服务器再进行对特定DBMS的调用。 All
4、-Java JDBC Driver(纯Java驱动程序):将JDBC调用转换为对特定DBMS的直接网络调用。,JDBC-ODBC Bridge驱动是在JDBC技术出现初期,大部分数据库厂商提供了对ODBC的支持,而没有提供对JDBC支持的情况下,借用ODBC驱动来实现JDBC技术。JDBC-ODBC 桥驱动程序由SUN公司提供,位于JRE安装目录lib子目录下的rt.jar文件中,包结构为:sun.jdbc.odbc。使用JDBC-ODBC 桥驱动程序的明显缺点是效率低下,,1JDBC-ODBC Bridge,6.2.2 JDBC驱动程序,第4种类型的全Java驱动程序是最完善的JDBC驱动程
5、序,是数据库管理系统对JDBC提供的全面支持。现在大多数的数据库厂商都在其数据库产品中提供该种类型的驱动程序,可从SUN公司、数据库厂家的网站上下载,或者从Internet上搜索。,4All-JDBC Driver,JDBC驱动程序的包结构及类名,可用压缩程序,如WinARA,打开驱动程序的jar文件查看。除JDBC-ODBC Bridge驱动外,其它驱动程序的jar文件要在环境变量classpath中进行设置,数据库驱动程序,大多数数据库都有JDBC驱动程序,常见的驱动程序如表所示。,6.3.1 驱动程序接口Driver 6.3.2 驱动程序管理器DriverManager 6.3.3 数据
6、库连接接口Connection 6.3.4 执行SQL语句接口Statement 6.3.5 执行动态SQL语句接口PreparedStatement 6.3.6 执行存储过程接口CallableStatement 6.3.7 访问结果集接口ResultSet,6.3 JDBC中的常用接口,JDBC提供了许多接口和类,通过这些接口和类,可以实现与数据库的通信,本节将详细介绍一些常用的JDBC接口和类。,Inferface A Class B implements A A a=new B() jdbc:oracle:thin:dssw2k01:1521:数据库名称,Driver接口面向设计DBM
7、S的程序员,每个数据库的JDBC驱动程序必须实现Driver接口。对于Java程序员而言,Driver接口是透明的,开发者不会直接使用Driver接口的方法,只需加载特定厂商提供的数据库驱动程序即可。加载数据库驱动程序最常用的方法为: Class.forName(“packages.DriverName”); Class是java.lang包中的重要类,forName是其静态方法。,6.3.1 驱动程序接口Driver,驱动名称,DriverManager类是JDBC的管理层,作用于用户程序和驱动程序之间。DriverManager类跟踪可用的驱动程序,并在数据库和相应的驱动程序之间建立连接。
8、调用DriverManager类的getConnection()方法请求建立数据库连接:,6.3.2 驱动程序管理器DriverManager,Connection con = DriverManager.getConnection(url, “sa“,“);,6.3.2 驱动程序管理器DriverManager,连接字符串URL,连接字符串URL指定数据库的位置,其格式对于不同的驱动程序而存在差异,一般格式为: jdbc: 协议:jdbc,JDBC URL中的协议总是jdbc。 子协议:是一个驱动程序名或数据库连接机制的名称,用于识别数据库驱动程序。 子名称:是一种标识数据库的方法。子名称可
9、以根据不同的子协议而变化。,Connection接口对象代表与数据库的连接,也就是在已经加载的数据库驱动程序和数据库之间建立连接。Connection接口类型的对象由DriverManager类的静态方法getConnection()获取,该接口中的常用方法为:,6.3.3 数据库连接接口Connection,数据库连接接口Connection,close():关闭连接 Statement createStatement():创建一个Statement用于执行SQL语句。 PreparedStatement prepareStatement(String sql):创建一个预处理SQL语句Pr
10、eparedStatement。 CallableStatement prepareCall(String sql):创建一个CallableStatement用于执行存储过程,Statement接口对象称为语句对象,通过语句对象可以向数据库发送SQL语句并执行返回结果。java.sql.Statement接口用来执行静态的SQL语句,并返回执行结果。例如,对于insert、update和delete语句,调用executeUpdate(String sql)方法,而select语句则调用executeQuery(String sql)方法,并返回一个ResultSet实例。,6.3.4 执行
11、SQL语句接口Statement,执行静态SQL语句接口:Statement (1),处理SQL语句主要分为3种Statement对象:Statement、PreparedStatement、CallableStatement。它们作为在指定连接上执行SQL语句的容器。这3种Statement对象的关系如图所示。,执行静态SQL语句接口:Statement (2),1创建Statement对象,Class.forName(驱动名称); /加载驱动 Connection con = DriverManager.getConnection(url, “sa“,“); /取得数据库连接 Statem
12、ent stmt = con.createStatement(); /获取Statement对象,为了执行Statement对象,被发送到数据库的SQL语句将被作为参数提供给Statement类中的指定方法。例如,通过Statement对象执行查询的SQL语句:,ResultSet rs = stmt.executeQuery(“select * from user“);,2使用Statement对象执行SQL语句,执行静态SQL语句接口:Statement (3),Statement接口提供了3种执行语句的方法,如表所示。,3关闭Statement对象,Stmt.Close();,6.3.5
13、 执行动态SQL语句接口PreparedStatement,PreparedStatement接口继承并扩展了Statement接口,用来执行动态的SQL语句即包含参数的SQL语句。 包含于PreparedStatement对象中的 SQL语句可具有一个或多个参数。该语句为每个参数保留一个问号(?)作为占位符。每个问号的值必须在该语句执行之前,通过适当的setXXX()方法来提供。由于PreparedStatement对象已预编译过,所以其执行速度要快于Statement对象。,6.3.5 执行动态SQL语句接口PreparedStatement,执行预编译的SQL语句接口:PreparedS
14、tatement (2),1创建PreparedStatement对象,例如,创建包含带两个参数的SQL语句的PreparedStatement对象:,PreparedStatement pstmt = con.prepareStatement(“UPDATE wy_table SET m =? WHERE x= ?“);,2传递参数,例如,将第一个参数设为“王”,第二个参数设为“毅” :,pstmt.setString(1,“王”); pstmt.setString(2,“毅”);,执行预编译的SQL语句接口:PreparedStatement,3执行预编译的SQL语句,设置完预编译的SQL
15、语句后,就可以通过PreparedStatement类中的方法执行该SQL语句。,注意:参数中数据类型的一致性,setXXX()方法中的XXX是Java类型。它是一种隐含的JDBC类型(一般SQL语句类型),因为驱动程序将把Java类型映射为相应的JDBC类型,并将该JDBC类型发送给数据库。在编写代码时要确保将每个参数的Java类型映射为与数据库所需的JDBC数据类型兼容的JDBC类型。,java.sql.CallableStatement接口继承于PreparedStatement接口,是PreparedStatement接口的扩展,用来执行SQL的存储过程。,6.3.6 执行存储过程接口
16、CallableStatement,java.sql.ResultSet接口类似于一个数据表,通过该接口的实例可以获得检索结果集,以及对应数据表的相关信息,例如列名和类型等,ResultSet实例通过执行查询数据库的语句生成。ResultSet实例具有指向其当前数据行的指针。最初,指针指向第一行记录的前方,通过next()方法可以将指针移动到下一行,因为该方法在没有下一行时将返回false,所以可以通过while循环来遍历ResultSet结果集。,6.3.7 访问结果集接口ResultSet,ResultSet接口提供了从当前行检索不同类型列值的getXxx( )方法,均有两个重载方法,可以
17、通过列的索引编号或列的名称检索,通过列的索引编号较为高效,列的索引编号从1开始。,6.3.7 访问结果集接口ResultSet,6.3.7 访问结果集接口ResultSet,6.4.1 加载JDBC驱动程序 6.4.2 创建数据库连接 6.4.3 创建语句对象 6.4.4 通过语句对象执行SQL语句返回结果 6.4.5 关闭连接等,6.4 JDBC访问数据库步骤,JDBC中连接数据库大致可以分加载JDBC驱动程序、创建Connection对象的实例、创建语句对象、通过语句对象执行SQL语句返回结果和关闭连接等5个步骤,下面进行详细介绍。,6.4.1 加载JDBC驱动程序,try Class.f
18、orName(“com.microsoft.jdbc.sqlserver.SQLServerDriver“); catch (ClassNotFoundException e) System.out.println(“加载数据库驱动时抛出异常,内容如下:“);e.printStackTrace(); ,在连接数据库之前,首先要加载要连接数据库的驱动程序,通过java.lang.Class类的静态方法forName(String className)实现,例如加载SQL Server2000驱动程序的代码如下:,6.4.2 创建数据库连接,Connection conn = DriverMana
19、ger.getConnection( “jdbc:microsoft:sqlserver:/127.0.0.1:1433;DatabaseName=db_database06“, “sa“, “);,java.sql.DriverManager(驱动程序管理器)类是JDBC的管理层,负责建立和管理数据库连接。通过DriverManager类的静态方法getConnection(String url, String user, String password)可以建立数据库连接,典型代码如下:,在上面的代码中,连接的是本地的SQL Server数据库,数据库名称为db_database06,登录
20、用户为sa,密码为空。,6.4.3 创建语句对象,建立数据库连接(Connection)的目的是与数据库进行通信,实现方式为执行SQL语句,但是通过Connection实例并不能执行SQL语句,还需要通过Connection实例创建Statement实例,典型代码如下:,Statement stmt = con.createStatement();,6.4.4通过语句对象执行SQL语句返回结果,通过Statement接口的executeUpdate()或executeQuery()方法,可以执行SQL语句,同时将返回执行结果。,ResultSet rs = stmt.executeQuery(
21、“select * from user“);,6.4.5 关闭连接,resultSet.close(); statement.close(); connection.close();,在建立Connection,Statement和ResultSet实例时,均需占用一定的数据库和JDBC资源,所以每次访问数据库结束后,应该及时销毁这些实例,释放它们占用的所有资源,方法是通过各个实例的close()方法,并且在关闭时建议按照以下的顺序:,6.5.1 使用JDBC-ODBC桥访问数据库 6.5.2使用All-Java JDBC Driver 访问数据库,6.5 典型JDBC数据库访问,6.5.1
22、使用JDBC-ODBC桥访问数据库,目前,对微软公司的一些单机简易数据库以及数据表格,如Access、Excel的访问,仍需要使用JDBC-ODBC桥。,使用JDBC-ODBC桥接器方式的机制是,应用程序只需建立JDBC和ODBC之间的连接,而和数据库的连接由ODBC去完成。,使用JDBC-ODBC桥访问数据库,连接信息的两种储存方法,连接信息保存在系统数据源又称计算机数据源中,它在指定计算机的 Windows 注册表中保存数据源的连接信息。 另一种方式是将连接信息直接写在连接字符串中,这样就无须建立数据源,简化了应用程序的安装过程,提高了应用程序的可移植性,所以在程序设计中这种方式最常用。,
23、/建立与ACCESS数据库连接,数据源名称为jspexdsnConnection con=DriverManager.getConnection(“jdbc:odbc:jspexdsn“);/不设置数据源,将连接信息直接写在连接字符串中String datapath=“database/jspex.mdb”;Connection con=DriverManager.getConnection(“jdbc:odbc:driver=Driver do Microsoft Access (*.mdb); dbq=“ + datapath);,连接信息的两种储存方法,DBQ=E:/db_databas
24、e06.mdb为Access数据库的绝对存放路径。,Access数据库的连接,String driverClass=“sun.jdbc.odbc.JdbcOdbcDriver“;,Access数据库的驱动名称为:,连接Access数据库的URL为:,String url = “jdbc:odbc:driver=Microsoft Access Driver (*.mdb);DBQ=E:/db_database06.mdb“;,注意:访问Excel数据表的SQL语句有些特殊之处,工作表名后须加上“$”符号,由于“$”符号在SQL中是关键字,所以还应加上方括号。 对于My SQL、SQL Serv
25、er、 Oracle这些大型网络数据库,它们都对JDBC提供了全面的支持,最高效的方法是使用这些数据库的全Java驱动程序进行连接访问。,6.5.2 使用All-Java JDBC Driver 访问数据库,用Java语言编写的数据库驱动程序称作Java数据库驱动程序。JDBC可以调用本地的Java数据库驱动程序和相应的数据库建立连接 。,使用全Java驱动程序访问数据库时,首先要将相应数据库的JDBC驱动程序文件(.jar文件)在环境变量classpath中进行设置,在上面的URL中,“127.0.0.1”为数据库所在机器的IP地址,该IP代表本机,也可替换为“localhost”;“143
26、3”为SQL Server 2000数据库默认的端口号;“db_database06”为数据库名。,SQL Server 2000数据库的连接,String driverClass=“com.microsoft.jdbc.sqlserver.SQLServerDriver“;,SQL Server 2000数据库的驱动为:,连接SQL Server 2000数据库需要用到的包有msbase.jar,mssqlserver.jar和msutil.jar。 连接SQL Server 2000数据库的URL为:,String url = “jdbc:microsoft:sqlserver:/127.
27、0.0.1:1433;DatabaseName=db_database06“;,SQL Server 2000数据库的连接注意以下事项 :,(1) 将SQL Server 2000的JDBC驱动程序在环境变量classpath中进行设置。这个驱动程序的jar文件包括mssqlserver.jar、msbase.jar、msutil.jar。 (2) MS SQL Server 2000数据库服务器要打上SP3及以上的补丁才支持JDBC访问, SQL Server 2000的初始版本为8.00.194,打SP3补丁后的版本为8.00.760,而打SP4补丁后的版本为8.00.2039。,(3)
28、用户名与密码必须正确,且所提供的用户对要访问的数据库有相应的权限。只能使用数据库用户,不能使用Windows内置账户,在上面的URL中,“127.0.0.1”为数据库所在机器的IP地址,该IP代表本机,也可替换为“localhost”;“3306”为MySQL数据库默认的端口号;“db_database06”为要连接的数据库名。,MySQL数据库的连接,String driverClass=“com.mysql.jdbc.Driver“;,MySQL数据库的驱动为:,连接MySQL数据库需要用到的包为mysql-connector-java-5.1.7-bin.jar。 连接MySQL数据库的
29、URL为:,String url=“jdbc:mysql:/127.0.0.1:3306/db_database06“;,6.6.1 查询操作 6.6.2 添加操作 6.6.3 更新操作 6.6.4 删除操作,6.5.4 JDBC操作数据库示例,在开发java应用程序时,经常需要对数据库进行操作,最常用的数据库操作技术,包括向数据库查询、添加、修改或删除数据库中的数据.,对数据库的更新(Update)、删除(Delete)、插入(Insert)操作与查询操作基本相似,不同的是使用的SQL语句不同,并且调用的方法为Statement.executeUpdate()。,SQL语句注意问题,注意,在
30、SQL语句中如果字段类型为字符串型时,其值前后要加单引号,而字段类型为数值型时,其值前后不能加引号。 update student set chinese=82.0,maths=93.0,physics=95.0,chemistry=86.0 where id=2 update student set name=赵六,sex=男,class=一年级二班 where id=2,修改学生成绩的SQL语句为:“update student set chinese=” + chinese + “,maths=” + maths + “,physics=” + physics + “,chemistry
31、=” + chemistry+ “ where id=” + id。 注意各字段之间的逗号分隔符及SQL关键字where前的空格不能少。由于这4个字段的数据类型为浮点型,其值前后不能加单引号。,修改学生信息的SQL语句为:“ update student set name=” + name + “,sex=” + gender + “,class=” + grade + “ where id=” + id。 由于前3个字段的数据类型为字符串型,其值前后必须加单引号。,添加操作,Insert INTO table_name(column_list) values(data_values),上面语
32、法中各参数说明如下表所示。,修改操作,实现数据修改操作使用的SQL语句为UPDATE语句,其语法格式如下:,UPDATE table_name SET =.,= WHERE,6.6.3 修改操作,删除操作,实现数据删除操作也可以通过两种方法实现,一种是通过Statement对象执行静态的SQL语句实现;另一种是通过PreparedStatement对象执行动态的SQL语句实现。 实现数据删除操作使用的SQL语句为DELETE语句,其语法格式如下:,DELETE FROM WHERE,在上面的语法中,table_name用于指定要删除数据的表的名称;用于指定删除数据的限定条件。在搜索条件中对包含
33、的谓词数量没有限制。,2执行预编译SQL语句对象,使用PreparedStatement对象可以避免编写复杂的动态SQL语句,使代码更简洁、清晰。PreparedStatement对象可以保存预编译过的SQL语句,所以第一次执行后,再调用该对象其速度要快于 Statement 对象。因此,多次执行的 SQL 语句经常创建为 PreparedStatement对象,以提高效率。,4. 获取元数据,ResultSetMetaData类主要获取表本身的元数据信息(表结构信息),它包含的方法可获取结果集信息和结果集中列的各种信息。 ResultSetMetaData mdata=rs.getMetaData();,