《访问数据库》PPT课件.ppt_第1页
《访问数据库》PPT课件.ppt_第2页
《访问数据库》PPT课件.ppt_第3页
《访问数据库》PPT课件.ppt_第4页
《访问数据库》PPT课件.ppt_第5页
已阅读5页,还剩48页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、第9章 访问数据库,9.1 JDBC 简介 9.2 建立数据库连接 9.3 执行SQL语句 9.4 使用Prepared Statement 9.5 事务处理 9.6 编写数据库工具类 9.7 一个实例,9.1 JDBC 简介-1,数据库的应用目前已经非常普遍,在应用程序的开发过程中,经常会涉及到访问数据库。Java语言为访问数据库提供了方便的技术。 Java使用JDBC(Java Database Connectivity)技术进行数据库的访问,如图9.1.1所示。使用JDBC技术进行数据库访问时,Java应用程序通过JDBC API和JDBC驱动程序管理器之间进行通信,例如Java应用程序

2、可以通过JDBC API向JDBC驱动程序管理器发送一个SQL查询语句。JDBC驱动程序管理器又可以以两种方式和最终的数据库进行通信:一是使用JDBC/ODBC桥接驱动程序的间接方式;另一是使用JDBC驱动程序的直接方式。,9.1 JDBC 简介-2,图9.1.1 JDBC示意图,9.1 JDBC 简介-3,JDBC所采用的这种数据库访问机制使得JDBC驱动程序管理器以及底层的数据库驱动程序对于开发人员来说是透明的。对于开发人员来说,访问不同类型的数据库时使用的是同一套JDBC API。此外,使用这种机制还有另一个重要的意义:当有新类型的数据库出现时,只要该数据库的生产厂商提供相应的JDBC驱

3、动程序,已有的Java应用程序不用做任何修改。 ! ODBC (开放式数据库连接)是一个编程接口,它允许程序访问使用SQL (结构化查询语言) 作为数据访问标准的DBMS(数据库管理系统)中的数据。SUN公司认为ODBC难以掌握、使用复杂并且在安全性方面存在问题,所以Java中没有直接采用ODBC 模式。,9.2 建立数据库连接-1,9.2.1 使用JDBC/ODBC桥接驱动程序 9.2.2 使用JDBC驱动程序 9.2.3 使用配置文件,9.2 建立数据库连接-2,要想对数据库进行访问,必须先和数据库建立连接。建立一个数据库连接总是需要两个步骤: l、载入驱动程序 Class.forName

4、(驱动程序名称); 2、建立连接 Connection con = DriverManager.getConnection(url,“用户名称, 用户密码); JDBC驱动程序管理器可以以两种方式进行数据库访问:一是使用JDBC/ODBC桥接驱动程序;另一种方式是使用JDBC驱动程序直接和数据库连接。下面将使用两个实例来分别讲解如何使用这两种方式进行数据库访问。 !不同的驱动程序,驱动程序名称以及子协议名称是可以不一样的。在随驱动程序提供的文档中能够找到具体使用方法。,9.2.1 使用JDBC/ODBC桥接驱动程序,使用MS Access建立一个名为bookTest.mdb的数据库,该数据库中

5、有一张表bookInfo,该表的的字段名称、数据类型和字段含义参见教材表9.2.1。 使用ODBC管理工具为bookTest.mdb的建立一个名为Book的数据源。设定好访问该数据源的用户名称和密码(本例中分别设定为admin 和 xyz)。,(1) 载入驱动程序,使用JDBC/ODBC桥接驱动程序,该驱动程序的名称为“sun.jdbc.odbc.JdbcOdbcDriver ”,使用下面的语句将载入JDBC/ODBC桥接驱动程序: Class.forName(sun.jdbc.odbc.JdbcOdbcDriver);,(2) 建立连接,使用下面的语句建立一个和数据库的连接: Connect

6、ion con=DriverManager.getConnection( jdbc:odbc:Book,admin,xyz);,JDBC/ODBC桥连接Access的硬件设置,打开控制面板,选中管理工具。如图,JDBC/ODBC桥连接Access的硬件设置,打开管理工具,选中(ODBC)数据源,JDBC/ODBC桥连接Access的硬件设置,打开数据源管理器,选择系统DNS,并单击添加按钮。,JDBC/ODBC桥连接Access的硬件设置,选中Driver do Microsoft Access (*mdb),JDBC/ODBC桥连接Access的硬件设置,在ODBC Microsoft Ac

7、cess安装界面中,填写数据源(如Book),并选择数据库,选好过后如图 单击确定,不完成了设置。,JDBC/ODBC桥连接SQL的硬件设置,在创建数据源界面中,选择SQL Server并单击完成按钮。,JDBC/ODBC桥连接SQL的硬件设置,在创建到SQL Server的数据源界面中,命名数据源(如book),注意:服务器后一定要选择Local,JDBC/ODBC桥连接SQL的硬件设置,在创建SQL Server的新数据源中选择如下图,JDBC/ODBC桥连接SQL的硬件设置,在创建到SQL Server的新数据源界面中选择所需数据库(如BookTest)单击下一步如图,JDBC/ODBC

8、桥连接SQL的硬件设置,在创建到SQL Server的新数据源界面中设置如下,单击完成,JDBC/ODBC桥连接SQL的硬件设置,在ODBC Microsoft SQL Server安装界面中单击测试数据源按钮,如果出现右图测试成功界面,则单击完成结束设置,例9.2.1 JdbcOdbc.java,import java.sql.*; public class JdbcOdbc public static void main(String args) try Class.forName(sun.jdbc.odbc.JdbcOdbcDriver); Connection con=DriverMa

9、nager.getConnection( jdbc:odbc:Book,admin,abc); Statement stmt = con.createStatement(); ResultSet rs=stmt.executeQuery(select * from bookInfo); while(rs.next() System.out.println(rs.getString(1)+ +rs.getString(2)+ +rs.getFloat(3)+ +rs.getString(4); rs.close(); stmt.close(); catch(Exception e) e.prin

10、tStackTrace(); ,9.2.2 使用JDBC驱动程序-1,本小节介绍如何使用JDBC驱动程序直接和运行在MS SQLSERVER 2000服务器上的数据库建立连接,9.2.2 使用JDBC驱动程序-2,这里使用一个MS SQLSERVER 2000上的数据库作为例子。先在MS SQLSERVER 2000上建立一个名为BookTest的数据库,并且在该数据库中创建一个名为bookInfo的表。表bookInfo的字段名、数据类型及字段含义见表9.2.2。使用企业管理器为该数据库创建一个合法的用户,用户名为admin,密码为xyz。 下载并安装MS SQLSERVER 2000的JD

11、BC驱动程序。在安装目录的lib子目录中,会发现有三个.jar文件(msbase.jar、mssqlserver.jar 及msutil.jar),就是MS SQLSERVER 2000的JDBC驱动程序。注意:要使得Java应用程序能够访问MS SQLSERVER 2000上的数据库,必须使得在类路径中能够找到这三个.jar文件。您可以在环境变量中设置好CLASSPATH;或是更简单一点,直接将这三个.jar文件解压缩到应用程序所在的目录。,(1) 载入驱动程序,MS SQLSERVER 2000 JDBC驱动程序的名称为(参看该驱动程序安装目录下的文档) “com.microsoft.jd

12、bc.sqlserver.SQLServerDriver”。 使用下面的语句将载入MS SQLSERVER 2000 JDBC驱动程序: Class.forName(com.microsoft.jdbc.sqlserver.SQLServerDriver);,(2) 建立连接,使用下面的语句建立一个和数据库的连接: String url =jdbc:microsoft:sqlserver: /:1433; Connection con=DriverManager.getConnection(url,admin,xyz ); con.setCatalog(bookTest);

13、本例中使用JDBC驱动程序直接和数据库服务器建立连接,url子协议的书写方式与上例中有所不同(参看随驱动程序提供的帮助文档)。例9.2.2完整显示了使用JDBC驱动程序直接访问MS SQL SERVER 2000数据库的源代码,完成和例9.2.1相似的功能。,例9.2.2 Jdbc.java,import java.sql.*; public class Jdbc public static void main(String args) try Class.forName(com.microsoft.jdbc.sqlserver.SQLServerDriver); String url =jd

14、bc:microsoft:sqlserver:/:1433; Connection con=DriverManager.getConnection(url,admin,xyz ); con.setCatalog(bookTest); Statement stmt = con.createStatement(); ResultSet rs=stmt.executeQuery(select * from bookInfo); while(rs.next() System.out.println(rs.getString(1)+ +rs.getString(2) + +rs.get

15、Float(3)+ +rs.getString(4); rs.close(); stmt.close(); catch(Exception e) e.printStackTrace(); ,9.2.3 使用配置文件,使用JDBC的一个优点就是:数据库编程独立于平台和数据库类型。也就是数据库类型改变后,访问数据的代码不需要改变(数据库驱动程序名称和数据库url需要做相应的变动)。在例9.2.1和9.2.2,驱动程序名称和数据库url都已经被“硬”编码到应用程序中。一旦所访问的数据库类型改变后,必须修改程序中的驱动程序名称和数据库url,重新编译后才能运行。这对于应用程序的用户是不能接受的,另一方

16、面也削减了JDBC数据库编程独立于数据库类型的优点。可以通过使用配置文件来解决这个问题:提供一个设置界面,用户可以在该界面中指定驱动程序的名称以及数据库url,并将结果保存到一个配置文件中。应用程序进行数据库连接时使用配置文件中的信息,这样可以提高应用程序的灵活性。,9.2.3 使用配置文件,为了简单起见,这里的例子只演示了如何从配置文件中读取信息。在第11章的项目实例中演示了如何完整地读写配置文件。 在应用程序所在的目录中创建一个配置文件db.cfg,该文件中的内容为: dbDriver=com.microsoft.jdbc.sqlserver.SQLServerDriver dbIP=12

17、 dbPort=1433 dbUserName=admin dbPassword=xyz defaultDbName=bookTest,9.2.3 使用配置文件,Java语言中提供了一个类java.util.Properties,该类中提供了load()方法可以从输入流中读入属性值。下面的语句从配置文件db.cfg中读入配置信息存放到对象prop中: Properties prop=new Properties(); prop.load(new FileInputStream(db.cfg); 从配置文件中读入的配置信息是以(关键字,属性值)对的形式存放在对象prop中的。例如要

18、取得关键字dbDriver的属性值,使用getProperty()方法: String driver=prop.getProperty(dbDriver); 这时候driver中的值为“com.microsoft.jdbc.sqlserver.SQLServerDriver”。 !为了提高应用程序的安全性,可以对配置文件中的用户名和用户密码进行加密操作。,9.3 执行SQL语句,和数据库建立连接的目的是为了让应用程序能够和数据库进行交互。首先使用连接对象中createStatement()方法创建一个Statement对象,然后就可以通过Statement对象向数据库发送各种SQL语句了。 S

19、tatement类型的对象中提供了几种不同的执行SQL语句的方法,如: executeUpdate(SQL)、executeQuery(SQL)、 execute(SQL) 以及executeBatch(),9.3.1 executeUpdate,executeUpdate(SQL)方法用来执行那些会修改数据库的SQL语句,例如insert、update、delete以及create等命令。 例如,如果要向数据库bookTest的bookInfo表中插入一条记录: stmt.executeUpdate(insert into bookInfo values (B0002,程序设计,23.45,

20、XX出版社),9.3.2 executeQuery,如果对数据库进行查询操作,那么使用方法executeQuery(SQL),该方法将返回一个ResultSet类型的结果集对象,该对象中包含了所有查询结果。如: ResultSet rs=stmt.executeQuery(select * from bookInfo); 要访问结果集中的一条记录,需要定位到该记录。ResultSet类型的对象中提供了next()方法用于依次定位结果集中的每条记录。,9.3.3 executeBatch,executeBatch()方法用来批量执行SQL语句。需要注意的是,这些要批量执行的SQL语句是更新类型

21、(如insert、update、delete以及create等) 的,即会对数据库进行修改操作的SQL语句,并且其中不能包含查询类型(select)的SQL语句。 下面的一段代码演示了如何使用executeBatch()方法: Statement stmt=con.createStatement(); stmt.addBatch(updateSql_1); stmt.addBatch(updateSql_2); stmt.addBatch(updateSql_3); int results=smt.executeBatch(); 上面的代码片断中,向stmt对象中添加了三条更新类型的SQL语句

22、。调用executeBatch()方法后,这三条SQL语句将批量执行。该方法返回的是一个整型数组,其中依次存放了每条SQL语句对数据库产生影响的行数。,9.4 使用Prepared Statement,前面的介绍中,使用数据库连接对象创建Statement对象,然后通过Statement对象向DBMS发送SQL语句。其实还可以通过数据库连接对象创建PreparedStatement类型的对象,然后通过它向DBMS发送SQL语句。 在有些情形下,PreparedStatement类型的对象与Statement类型对象相比,有如下两个优点: 1、效率高 2、使用方便,效率高,使用数据库连接对象创建

23、PreparedStatement类型的对象时,作为参数的SQL语句会立刻被发送到DBMS并进行编译。这样PreparedStatement类型的对象中包含的是预编译好的SQL语句。这样,当需要再次执行PreparedStatement类型对象中的SQL语句时,DBMS立刻就可以执行其中已经编译好的SQL语句。,使用方便-1,使用数据库连接对象创建PreparedStatement类型的对象时,作为参数的SQL语句中允许使用参数占位符(?)。这样,在每次运行这条SQL语句时,可以通过赋给参数占位符不同的参数值,从而完成不同的功能。 如果需要向表bookInfo中插入一条新的记录(B0003,c

24、+,78.50,清华大学出版社),根据上面所讲的知识,下列的代码片断能够完成该功能: PreparedStatement update=con.prepareStatement(insert into bookInfo values(?,?,?,?); update.setString(1, B0003); update.setString(2, c+); update.setFloat(3, 78.50f); update.setString(4, “清华大学出版社”); update.executeUpdate(); 上述的代码片断中,使用了setXXX()方法逐个设置占位符的值。在实际的

25、应用程序中,一条记录的字段往往有几十个,那么使用这种方式去做的话,程序就会写得很长,效率不高。这时候,可以使用setObject()方法结合循环语句来设置占位符的值。,使用方便-2,同样以上述插入一条记录为例: PreparedStatement update=con.prepareStatement(insert into bookInfo values(?,?,?,?); Object line=B0003,C+,new Float(78.50),清华大学; for(int i=1;i=line.length;i+) update.setObject(i,linei-1); update.

26、executeUpdate(); setObject()方法中有两个参数:第一个参数是占位符的索引;第二个参数是对象类型的值,赋值给占位符所指的参数。需要注意的是,所赋的对象类型必须和占位符所指参数的SQL数据类型相匹配。例如上述代码片断中,将Float类型的对象赋值给一个SQL数据类型为了float的参数,将String类型的对象赋值给SQL数据类型为varchar的参数。,9.5 事务处理-1,先来看一个帐户转移的问题:假设存在两个帐户A 和B,现在需要将帐户A上的部分资金转移到帐户B中。使用下面的代码: PreparedStatement stmt_1 = con.preparedSta

27、tement(SQL1); PreparedStatement stmt_2 = con.preparedStatement(SQL2); stmt_1.executeUpdate(); / stmt_1语句的作用是:从帐户A减去资金x stmt_2.executeUpdate(); / stmt_2语句的作用是:将帐户B加上资金x 如果一切正常,上面的代码片断完成资金转移的功能。然而,实际情况可能不是这么简单。例如,如果语句stmt_1正常执行完毕,而语句stmt_2在执行时出现异常,那么就会出现数据的不一致性:帐户A上的资金减少了x,而帐户B上资金并没有增加。这种情况显然是不能接受的。,9

28、.5 事务处理-2,要解决这个问题,我们希望:语句stmt_1和语句stmt_2组成一个执行单元,并且只有在 stmt_1和stmt_2均正确执行完毕后,才对数据库产生影响;任何一个语句出错都退回到这个执行单元执行之前的状态。这个执行单元就被称之为事务。 在缺省状态下,创建的连接是处于自动递交(auto commit)模式:每条语句执行完毕后,立即向DBMS递交执行结果。亦即每条语句独立构成一个事务。因此为了让若干条语句构成一个事务,在执行第一条语句前先关闭自动递交模式,使用如下方法: con.setAutoCommit(false); 在将自动递交模式设置为false后,所执行的语句不会将执

29、行结果递交给DBMS,直到调用如下的递交语句: mit();,9.5 事务处理-3,因此,要在上述的帐户转移定制事务,使用下面的代码片断: con.setAutoCommit(false); / 设置为非自动递交模式 PreparedStatement stmt_1 = con.preparedStatement(SQL1); PreparedStatement stmt_2 = con.preparedStatement(SQL2); stmt_1.executeUpdate(); / 执行完毕后不立刻递交 stmt_2.executeUpdate(); / 执行完毕后不立刻递交 mit()

30、; / 递交事务 con.setAutoCommit(true); / 恢复自动递交模式 stmt_1.close(); stmt_2.close();,9.5 事务处理-4,再回到上述的问题:语句stmt_1正常执行完毕,而语句stmt_2在执行时出现异常。这时候,就需要放弃该事务,并且恢复到事务开始时的状态。为此,可以把事务放在一个try块中,在对应的catch块中捕获事务执行过程中所出现的异常。一旦有异常出现,可以调用rollBack()方法进行事务回滚,恢复到事务开始时的状态。这样就可以有效地保持数据库数据的完整性和一致性。如:,9.5 事务处理-5,try con.setAutoCo

31、mmit(false); / 设置为非自动递交模式 PreparedStatement stmt_1 = con.preparedStatement(SQL1); PreparedStatement stmt_2 = con.preparedStatement(SQL2); stmt_1.executeUpdate(); / 执行完毕后不立刻递交 stmt_2.executeUpdate(); / 执行完毕后不立刻递交 mit(); / 递交事务 con.setAutoCommit(true); / 恢复自动递交模式 stmt_1.close(); stmt_2.close(); catch(

32、SQLException e) e.printStackTrace(); if (con != null) try con.rollback(); /事务回滚 con.setAutoCommit(true); / 恢复自动递交模式 catch(SQLException ex) ex.printStackTrace(); ,9.6 编写数据库工具类-1,Java编程语言中提供了用于数据库访问的各种API。有的时候,一些API总是要组合在一起使用。例如,要建立一个数据录连接,总是需要先载入数据库驱动程序,然后使用驱动程序管理器建立连接。为此,我们可以编写一个方法(如例9.6.1中的acquireC

33、onnection(),该方法完成载入数据库驱动程序并使用驱动程序管理器建立连接),然后将该方法封装到一个自定义的类中(如例9.6.1中的SqlUtil类)。这样,要创建一个数据库连接,只需要一个语句: Connection con=SqlUtil.acquireConnection(.); 这样可以更加高效、简洁地编写出应用程序。,9.6 编写数据库工具类-2,在例9.6.1中,类SqlUtil被打包到edu.njust.cs。因此,在其他的类中需要使用类SqlUtil的时候,必须先使用: import edu.njust.cs.*; 或是: import edu.njust.cs.SqlU

34、til; 来引入(import)SqlUtil类。 SqlUtil类中集成了读写数据库和表格的一些方法,包括将数据库中的记录读入表格以及将表格中的数据写入数据库等等。本节中SqlUtil类中的方法还相当少,读者可以逐步向其中添加更多的实用方法来丰富该类的内容。在第11章中,读者将会看到SqlUtil类中会拥有更多的实用方法。,9.6 编写数据库工具类-3,我们希望数据库中存储的字段值不出现空值(null),这样可以在应用程序中减少很多烦人的空值条件判断。为此,当字段值为空值时,可以考虑使用特殊值来代替。例如,一个Double类型的字段,可以用Double.NEGATIVE_INFINITE这个特殊值来代替空值。也就是说,在数据库中,如果一个数据字段的值为Double.NEGATIVE_INFINITE,表示该字段值为空值。使用这种处理方式后,当需要将字段值为空值(已经由特殊值表示)的字段读入

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论