您好,欢迎访问三七文档
当前位置:首页 > 行业资料 > 能源与动力工程 > JAVAweb开发课件
第7章JDBC数据库访问本章内容•7.1JDBC技术概述•7.2传统的数据库连接方法•7.3JDBCAPI介绍•7.4预处理语句•7.5连接池与数据源•7.6DAO设计模式本章内容•许多Web应用程序都需要访问数据库。在Java应用程序中是通过JDBC访问数据库的,JDBC是Sun公司开发的数据库访问API。•本章首先介绍了传统的数据库连接方法,然后介绍了常用的JDBCAPI,接下来介绍了使用数据源连接数据库的方法,最后讨论了DAO设计模式。7.1JDBC技术概述•JDBC是Java程序访问数据库的标准,它是由一组Java语言编写的类和接口组成,这些类和接口称为JDBCAPI,它为Java程序提供一种通用的数据访问接口。•使用JDBCAPI可以访问任何的数据源,从关系数据库到电子表格甚至平面文件,它使开发人员可以用纯Java语言编写完整的数据库应用程序。•JDBC的基本功能包括:建立与数据库的连接;发送SQL语句;处理数据库操作结果。7.1.1数据库访问的两层和三层模型•两层模型(图7-1)即客户机/数据库服务器结构,也就是通常所说的C/S结构。•在两层模型中,Java应用程序通过JDBCAPI直接和数据源交互。用户的SQL命令被传送给数据库或其他数据源,SQL语句的执行结果返回给用户。数据源可以位于网络的其他机器上。这被称为是客户服务器配置,用户机器为客户,存放数据源的机器为服务器。网络可以是企业内部网,也可以是Internet。7.1.1数据库访问的两层和三层模型•三层模型(图7-2)是指客户机/应用服务器/数据库服务器结构,也就是通常所说的B/S结构。在三层模型中,客户机通过Java小程序或浏览器发出SQL请求,该请求首先传送到应用服务器,应用服务器再通过JDBC与数据库服务器进行连接,由数据库服务器处理SQL语句,然后将结果返回给应用服务器,再由应用服务器将结果发送给客户机。这里应用服务器一般是Web服务器,它是一个“中间层”。7.1.1数据库访问的两层和三层模型7.1.2JDBC驱动程序•Java应用程序访问数据库的一般过程如图7-3所示。应用程序通过JDBC驱动程序管理器加载相应的驱动程序,通过驱动程序与具体的数据库连接,然后访问数据库。7.1.2JDBC驱动程序7.1.2JDBC驱动程序•目前有多种类型的数据库,每种数据库都定义了一套API,这些API一般是用C/C++语言实现的,因此需要有在程序收到JDBC请求后,将其转换成适合于数据库系统的方法调用。把完成这类转换工作的程序叫做数据库驱动程序。•在Java程序中可以使用的数据库驱动程序主要有4种类型,常用的有下面两种:1.JDBC-ODBC桥驱动程序。2.专为某种数据库而编写的驱动程序。1.JDBC-ODBC桥驱动程序•JDBC-ODBC桥驱动程序是为了与Microsoft的ODBC连接而设计的。•ODBC(OpenDataBaseConnectivity)称为开放数据库连接,它是Windows系统与各种数据库进行通信的软件。通过该驱动程序与ODBC进行通信,就可以与各种数据库系统进行通信了。•但是不推荐使用这种方法与数据库连接,只是在不能获得数据库专用的JDBC驱动程序或在开发阶段使用这种方法。2.专为某种数据库而编写的驱动程序•由于ODBC具有一定的缺陷,因此许多数据库厂商专门开发了针对JDBC的驱动程序,这类驱动程序大多是用纯Java语言编写的,因此推荐使用数据库厂商为JDBC开发的专门的驱动程序。7.1.3安装JDBC驱动程序•使用JDBC-ODBC桥驱动程序连接数据库,不需要安装驱动程序,因为在JavaAPI中已经包含了该驱动程序。•使用专用驱动程序连接数据库,必须安装驱动程序。不同的数据库系统提供了不同的JDBC驱动程序,可以到相关网站下载。7.1.3安装JDBC驱动程序•例如,如果使用PostgreSQL数据库,可以到下载,下载后是一个打包文件(如postgresql-9.2-1000.jdbc4.jar)。在开发Web应用程序中,需要将驱动程序打包文件复制到Tomcat安装目录的lib目录中或Web应用程序的WEB-INF\lib目录中。7.2传统的数据库连接方法•JDBCAPI是在java.sql包和javax.sql包中定义的,其中包括JDBCAPI用到的所有类和接口。下面是主要的类和接口:DriverManager类Driver接口Connection接口Statement接口PreparedStatement接口ResultSet接口CallableStatement接口SQLException类7.2.1加载驱动程序•要使应用程序能够访问数据库,首先必须加载驱动程序。驱动程序是实现了Driver接口的类,它一般由数据库厂商提供。•加载JDBC驱动程序最常用的方法是使用Class类的forName()静态方法,该方法的声明格式为:publicstaticClass?forName(StringclassName)throwsClassNotFoundException•参数className为一字符串表示的完整的驱动程序类的名称。如果找不到驱动程序将抛出ClassNotFoundException异常。该方法返回一个Class类的对象。•对于不同的数据库,驱动程序的类名是不同的。如果使用JDBC-ODBC桥驱动程序连接数据库,则使用JDK自带的驱动程序,名称为“sun.jdbc.odbc.JdbcOdbcDriver”,要加载该驱动程序,可使用下面的语句:Class.forName(sun.jdbc.odbc.JdbcOdbcDriver);7.2.1加载驱动程序•如果要加载数据库厂商提供的专门的驱动程序,应该给出专门的驱动程序名。例如,要加载PostgreSQL数据库驱动程序应使用下列语句:Class.forName(org.postgresql.Driver);•这里,org.postgresql.Driver为PostgreSQL的驱动程序类名。7.2.1加载驱动程序7.2.2建立连接对象•驱动程序加载成功后应使用DriverManager类的getConnection()建立数据库连接对象。•DriverManager类维护一个注册的Driver类的列表。1.DriverManager类•建立数据库连接的方法是调用DriverManager类的静态方法getConnection(),该方法的声明格式为:publicstaticConnectiongetConnection(Stringdburl)publicstaticConnectiongetConnection(Stringdburl,Stringuser,Stringpassword)•这里字符串参数dburl表示JDBCURL,user表示数据库用户名,password表示口令。调用该方法,DriverManager类试图从注册的驱动程序中选择一个合适的驱动程序,然后建立到给定的JDBCURL的连接。如果不能建立连接将抛出SQLException异常。1.DriverManager类2.JDBCURL•JDBCURL与一般的URL不同,它用来标识数据源,这样驱动程序就可以与它建立一个连接。•下面是JDBCURL的标准语法,它包括三个部分,中间用冒号分隔:jdbc:subprotocol:subname•其中,jdbc表示协议,JDBCURL的协议总是jdbc。subprotocol表示子协议。subname为子名称,它表示数据库标识符,该部分内容随数据库驱动程序的不同而不同。•如果通过JDBC-ODBC桥驱动程序连接数据库,URL的形式为:jdbc:odbc:DataSource•上面三个部分组成一个整体字符串就是JDBCURL,例如:Stringdburl=jdbc:odbc:sampleDS;2.JDBCURL•如果使用数据库厂商提供的专门的驱动程序连接数据库,JDBCURL可能复杂一些。•例如,要连接PostgreSQL数据库,它的JDBCURL为:jdbc:postgresql://localhost:5432/dbname•这里,localhost表示主机名或IP地址,5432为数据库服务器的端口号,dbname为数据库名。2.JDBCURL•下面代码说明了如何以paipaistore用户连接到PostgreSQL数据库。这里的数据库名为paipaistore、用户名为paipaistore、口令为paipaistore:Stringdburl=jdbc:postgresql://localhost:5432/paipaistore;Connectionconn=DriverManager.getConnection(dburl,paipaistore,paipaistore);2.JDBCURL常用的数据库JDBC连接代码7.2.3创建语句对象•通过Connection对象,可创建语句对象。对于不同的语句对象,可以使用Connection接口的不同方法创建。•例如,要创建一个简单的Statement对象可以使用createStatement(),创建PreparedStatement对象应该使用prepareStatement(),创建CallableStatement对象应该使用prepareCall()。•下面的代码将创建一个简单的Statement对象。Statementstmt=conn.createStatement();7.2.4获得SQL语句的执行结果•执行SQL语句使用Statement对象的方法。对于查询语句,调用executeQuery(Stringsql)返回ResultSet。ResultSet对象保存查询的结果集,再调用ResultSet的方法可以对查询结果的每行进行处理。Stringsql=SELECT*FROMproducts;ResultSetrst=stmt.executeQuery(sql);while(rst.next()){out.print(rst.getString(1)+\t);}7.2.4获得SQL语句的执行结果•对于DDL语句如CREATE、ALTER、DROP和DML语句如INSERT、UPDATE、DELETE等须使用语句对象的executeUpdate(Stringsql)。该方法返回值为整数,用来指示被影响的行数。7.2.5关闭建立的对象•在Connection接口、Statement接口和ResultSet接口中都定义了close()。当这些对象使用完毕后应使用close()关闭。•如果使用Java7的try-with-resources语句,则可以自动关闭这些对象。7.2.6简单的应用示例•本示例程序可以根据用户输入的商品号从数据库中查询该商品信息,或者查询所有商品信息。•本应用的设计遵循了MVC设计模式,其中视图有queryProduct.jsp、displayProduct.jsp、displayAllProduct.jsp和error.jsp几个页面,Product类实现模型,QueryProductServlet类实现控制器。7.2.6简单的应用示例•该应用需要访问数据库表products中的数据,该表的定义如下。CREATETABLEproducts(prod_idcharacter(3)NOTNULL,pnamecharactervarying(30)NOTNULL,pricenumeric(8,2),stockinteger,CONSTRAINTproduct_pkeyPRIMARYKEY(prod_id))•根据表的定义,设计下面的JavaBeans存放商品信息,这里表的字段对应Product类的成员变量。程序7.1Product.java•下面是queryProduct.jsp页面代码。程序7.2
本文标题:JAVAweb开发课件
链接地址:https://www.777doc.com/doc-1726743 .html