第2章JDBC数据库编程第2章JDBC数据库编程1.1JDBC概述1.2数据库基本操作1.3数据库存取优化习题第2章JDBC数据库编程2.1JDBC概述2.1.1JDBC数据库应用模型JDBC由两层构成,一层是JDBCAPI,负责在Java应用程序与JDBC驱动程序管理器之间进行通信,负责发送程序中的SQL语句。其下一层是JDBC驱动程序API,与实际连接数据库的第三方驱动程序进行通信,返回查询信息或者执行规定的操作。如图所示。第2章JDBC数据库编程第2章JDBC数据库编程1.Java应用程序Java程序包括应用程序、Applet以及Servlet,这些类型的程序都可以利用JDBC实现对数据库的访问,JDBC在其中所起的作用包括:请求与数据库建立连接、向数据库发送SQL请求、处理查询、错误处理等操作。2.JDBC驱动程序管理器JDBC驱动程序管理器动态地管理和维护数据库查询所需要的驱动程序对象,实现Java程序与特定驱动程序的连接。它完成的主要任务包括:为特定的数据库选取驱动程序、处理JDBC初始化调用、为每个驱动程序提供JDBC功能的入口、为JDBC调用传递参数等。第2章JDBC数据库编程3.驱动程序驱动程序一般由数据库厂商或者第三方提供,由JDBC方法调用,向特定数据库发送SQL请求,并为程序获取结果。驱动程序完成下列的任务:建立与数据库的连接、向数据库发送请求、在用户程序请求时进行翻译、错误处理。4.数据库数据库指数据库管理系统和用户程序所需要的数据库。第2章JDBC数据库编程2.1.2JDBC驱动程序JDBC驱动程序分为以下四种类型。(1)类型1,JDBC-ODBCBridgeDriver,这种驱动方式通过ODBC驱动器提供数据库连接。使用这种方式要求客户机装入ODBC驱动程序。(2)类型2,Native-APIpartly-JavaDriver,这种驱动方式将数据库厂商所提供的特殊协议转换为Java代码及二进制代码,利用客户机上的本地代码库与数据库进行直接通信。和类型1一样,这种驱动方式也存在很多局限,由于使用本地库,因此,必须将这些库预先安装在客户机上。第2章JDBC数据库编程(3)类型3,JDBC-NetAll-JavaDriver,这种类型的驱动程序是纯Java代码的驱动程序,它将JDBC指令转换成独立于DBMS的网络协议形式并与某种中间层连接,再通过中间层与特定的数据库通信。该类型驱动具有最大的灵活性,通常由非数据库厂商提供,是四种类型中最小的。(4)类型4,Native-protocolAll-JavaDriver,这种驱动程序也是一种纯Java的驱动程序,它通过本地协议直接与数据库引擎相连接。这种驱动程序也能应用于Internet。在全部四种驱动方式中,这种方式具有最好的性能。第2章JDBC数据库编程2.1.3用JDBC访问数据库用JDBC实现访问数据库要经历以下几个步骤:1.建立数据源这里的数据源是指ODBC数据源,这一点不是JDBC所必需的,而是当使用驱动程序类型1即JDBC-ODBCBridge建立连接时所需要的步骤。2.装入JDBC驱动程序DriverManager类管理各种数据库驱动程序,建立新的数据库连接。第2章JDBC数据库编程JDBC驱动程序通过调用registerDriver方法进行注册。用户在正常情况下不会直接调用DriverManager.registerDriver,而是在加载驱动程序时由驱动程序自动调用。加载Driver类,自动在DriverManager中注册的方法有以下两种:(1)调用方法Class.forName()将显式地加载驱动程序类。例如加载Sybase数据库驱动程序:Class.forName(“com.sybase.jdbc2.jdbc.SybDriver”);第2章JDBC数据库编程(2)通过将驱动程序添加到java.lang.System的属性jdbc.drivers中。初始化DriverManager类时,它自动搜索系统属性jdbc.drvers且加载其中包含的一个或多个驱动程序。例如下面的代码准备加载三个驱动程序类:jdbc.drivers=ei.bar.Driver:bee.sql.Driver:see.test.ourDriver;第2章JDBC数据库编程3.建立连接与数据库建立连接的方法包括:DriverManager.getConnection(Stringurl)DriverManager.getConnection(Stringurl,Propertiespro)DriverManager.getConnection(Stringurl,Stringuser,Stringpassword)其中,url指出使用哪个驱动程序以及连接数据库所需的其它信息。其格式为:第2章JDBC数据库编程jdbc:subprotocol:subname例如:Stringurl=“jdbc:microsoft:sqlserver://localhost:1433;User=JavaDB;Password=javadb;DatabaseName=northwind”;这里,subprotocol为microsoft,而subname为sqlserver及其后的内容。至于用户名和口令也是存取数据所需的信息。有时候,可以采用另一种方式建立连接:第2章JDBC数据库编程Stringurl=“jdbc:microsoft:sqlserver://localhost:1433;DatabaseName=northwind”;Connectioncon=DriverManager.getConnection(url,”JavaDB”,”javadb”);第2章JDBC数据库编程4.执行SQL语句与数据库建立连接之后,需要向访问的数据库发送SQL语句。在特定的程序环境和功能需求下,可能需要不同的SQL语句,例如数据库的增删改查等操作,或者数据库或表的创建及维护操作等等。需要说明的是:Java程序中所用到的SQL语句是否能得到正确的执行,是否会产生异常或错误,需要关注的不仅是语句本身的语法正确性,而且关注所访问的数据库是否支持,例如有的数据库不支持存储过程操作,则发送调用存储过程的语句即抛出异常。第2章JDBC数据库编程有三个类用于向数据库发送SQL语句:(1)Statement类,调用其createStatement()方法可以创建语句对象,然后利用该语句对象可以向数据库发送具体的SQL语句。例如:Stringquery=“select*fromtable1”;//查询语句Satementst=con.createStatement();//或用带参数的createStatement()方法ResultSetrs=st.executeQuery(query);//发送SQL语句,获得结果第2章JDBC数据库编程(2)PreparedStatement类,调用其方法prepareStatement()创建一编译预处理语句对象,可以向数据库发送带有参数的SQL语句。该类有一组setXXX方法,用设置参数值。这些参数被传送到数据库,预处理语句被执行。这个过程类似于给函数传递参数之后执行函数,完成预期的处理。使用PreparedStatement与使用Statement相比较有较高的效率,关于这一点详见后面相关部分的阐述。第2章JDBC数据库编程PreparedStatementps;ResultSetrs=null;Stringquery=selectname,age,addrfromxsdawhereaddr=?;ps=con.prepareStatement(query);ps.setString(1,hei);rs=ps.executeQuery();第2章JDBC数据库编程(3)CallableStatement类的方法prepareCall()可用于创建对象,该对象用于向数据库发送一调用某存储过程的SQL语句。prepareCall()和prepareStatement()一样,所创建的语句允许带有参数,用setXXX()设置输入参数,即IN参数,同时需接收和处理OUT参数、INOUT参数以及存储过程的返回值,概要说明其使用方法的语句例子如下:第2章JDBC数据库编程CallableStatementcstmt;ResultSetrs;cstmt=con.prepareCall({?=callstat(?,?)});//stat是一存储过程的名字,它有两个参数,且有返回值cstmt.setString(2,”JavaProgrammingLanguage”);rs=cstmt.executeQuery();第2章JDBC数据库编程5.检索结果数据库执行传送到的SQL语句,结果有多种存储位置,这与所执行的语句有关。以查询语句select为例,其结果需返回到程序中一结果集对象,即前面语句例子中的ResultSet之对象rs。rs可看作是一个表子集,有若干行和若干列,行列的具体数量与查询条件及满足查询条件的记录数有关。要浏览该表内容可以借助ResultSet类的相关方法完成。例如行指针移动方法rs.next()和取列内容的方法rs.getXXX()等。若是执行数据更新语句update,则返回的是成功进行更新的数据库记录行数,所以,检索结果操作要依程序的具体内容而定。第2章JDBC数据库编程6.关闭连接完成对数据库得操作之后应关闭与常用数据库的连接。关闭连接使用close()方法。格式如下:con.close();第2章JDBC数据库编程2.1.4JDBC常用APIJDBCAPI提供的类和接口是在java.sql包中定义的。1.DriverManager类DriverManager类的常用方法:1)staticvoidderegisterDriver(Driverdriver)方法,从DriverManager的列表中删除一个驱动程序。2)staticConnectiongetConnection(Stringurl)方法,建立到给定数据库URL的连接。3)staticConnectiongetConnection(Stringurl,Propertiesinfo)方法,用给定的数据库URL和相关信息(用户名、用户密码等属性)来创建一个连接。4)staticConnectiongetConnection(Stringurl,Stringuser,Stringpassword)方法,按给定的数据库URL、用户名和用户密码创建一个连接。第2章JDBC数据库编程5)staticDrivergetDriver(Stringurl)方法,查找给定URL下的驱动程序。6)staticEnumerationDrivergetDrivers()方法,获得当前调用方可以访问的所有已加载JDBC驱动程序的Enumeration。7)staticintgetLoginTimeout()方法,获得驱动程序连接到某一数据库时可以等待的最长时间,以秒为单位。8)staticPrintWritergetLogWriter()方法,检索记录写入器。9)staticvoidprintln(Stringmessage)方法,将一条消息打印到当前JDBC记录流中。10)staticvoidregisterDriver(Driverdriver)方法,向DriverManager注册给定驱动程序。第2章JDBC数据库编程2.Connection类Connection类有如下常量:1)staticintTRANSACTION_NONE指示不支持事务。2)staticintTRANSACTION_READ_UNCOMMITTED说明一个事务在提交前其变化对于其他事务而言是可见的。这样可能发生脏读(dirtyread)、不可重复读(unrepeatedread)和虚读(phantomread)。第2