JavaWeb编程技术第7章JDBC数据库访问7.1PostgreSQL数据库简介7.2Java数据库技术概述7.3传统的数据库连接方法7.4使用数据源连接数据库7.5预处理语句7.6DAO设计模式介绍7.1PostgreSQL数据库简介PostgreSQL是对象关系型数据库管理系统(ORDBMS).它起源于伯克利(BSD)的数据库研究计划,目前是最重要的开源数据库产品开发项目之一,有着非常广泛的用户。PostgreSQL支持事务、子查询、多版本并发控制、数据完整性检查等特性,并且支持多语言的应用开发。它能在包括Linux、FreeBSD和Windows等多种平台下运行。PostgreSQL的下载和安装计算机系统必须满足下面要求:CPU:Intel或AMD的32位CPU。操作系统:WindowsXP或WindowsServer2003。磁盘格式:文件系统为NTFS格式。用户:必须以系统管理员身份安装PostgreSQL。目前的最新版本是8.3.1版。下载后是一个压缩文件,文件名为postgresql-8.3.1-1.zip双击postgresql-8.3.msi文件即开始安装7.1.2使用pgAdminIII操作数据库PostgreSQL提供的pgAdminIII工具psql工具pgAdminIII是PostgreSQL安装程序自带的一个图形用户界面的管理工具。1.创建数据库角色2.创建数据库3.创建数据库对象4.操作数据库对象7.1.3使用psql工具操作数据库在PostgreSQL8.3程序组中选择“命令提示符”命令,启动一个命令提示符窗口,在提示符下输入:$psql-Upostgres–hlocalhostpsql客户程序具有很多特征,它使我们对PostgreSQL的使用变得很容易。除了可以使用PostgreSQL命令(SELECT,INSERT,UPDATE,CREATETABLE等)外,psql还提供了许多内部命令,这些命令也叫元命令(meta-command)。元命令包括:\?(显示元命令的帮助)、\q(退出psql工具)、\h(显示SQL命令的帮助)、\d(显示当前数据库中的表)、\dtable_name(显示指定表名的结构)。1.创建数据库用户只有数据库管理员才能创建用户。首先以超级用户身份登录到PostgreSQL:$psql–Upostgres–hlocalhost使用下面的SQL语句可以创建一个名为bookstore的数据库用户:postgres=#CREATEUSERbookstorepostgres-#LOGINpostgres-#CREATEDBpostgres-#PASSWORD'bookstore';CREATEUSER2.创建bookstore数据库下面的SQL语句创建一个名为bookstore的数据库,该数据库属于bookstore用户。postgres=#CREATEDATABASEbookstorepostgres-#OWNERbookstore;OWNERbookstore短语指定数据库的所有者(owner),对象的所有者具有在该对象上所有的操作权限。3.创建数据库对象超级用户postgres可以为其他用户创建数据库对象,但数据库对象一般由数据库所有者创建。如果要以用户bookstore的身份登录到bookstore数据库,请先退出psql,然后使用bookstore用户名连接到bookstore数据库:$psql–Ubookstore–dbookstore该命令以bookstore用户身份连接到bookstore数据库。接下来需要输入用户口令,最后出现的提示符如下:bookstore=例如,使用下面SQL语句创建books表:CREATETABLEbooks(bookidcharacter(5)PRIMARYKEY,titletext,authorcharactervarying(20),publishercharactervarying(40),pricedoubleprecision);使用SQLINSERT语句向表中插入若干数据。7.2Java数据库技术概述Java程序是通过JDBC访问数据库的。JDBC的基本功能包括:建立与数据库的连接;发送SQL语句;处理数据库操作结果。数据库访问的两层和三层模型两层模型即客户机/数据库服务器结构,也就是通常所说的C/S(Client/Server)结构三层模型是指客户机/应用服务器/数据库服务器结构,也就是通常所说的B/S(Browser/Server)结构JDBC驱动程序在Java程序中可以使用的数据库驱动程序主要有四种类型,常用的有下面两种:JDBC-ODBC桥驱动程序专为某种数据库而编写的驱动程序安装JDBC驱动程序使用JDBC-ODBC桥驱动程序连接数据库,不需要安装驱动程序,因为在JavaAPI中已经包含了该驱动程序。使用专用驱动程序连接数据库,必须安装驱动程序。在开发Web应用程序中,需要将驱动程序打包文件复制到:•Tomcat安装目录的lib目录中•Web应用程序的WEB-INF\classes\lib目录中。7.3传统的数据库连接方法JDBCAPIDriverManager类和Driver接口、Connection接口、Statement接口、PreparedStatement接口、CallableStatement接口、ResultSet接口、SQLException类。7.3.1加载驱动程序7.3.2建立连接对象7.3.3创建语句对象7.3.4获得SQL语句的执行结果7.3.5关闭建立的对象,释放资源7.3.6简单的应用示例7.3.1加载驱动程序使用Class类的forName()静态方法,该方法的声明格式为:publicstaticClass?forName(StringclassName)throwsClassNotFoundException如果使用ODBC-JDBC桥驱动程序,则使用JDK自带的驱动程序,名称为“sun.jdbc.odbc.JdbcOdbcDriver”Class.forName(sun.jdbc.odbc.JdbcOdbcDriver);数据库厂商提供的专门的驱动程序,应该给出专门的驱动程序名。如PostgreSQL数据库:Class.forName(org.postgresql.Driver);7.3.2建立连接对象使用DriverManager类的getConnection()DriverManager类的静态方法getConnection(),该方法的声明格式为:publicstaticConnectiongetConnection(Stringdburl)publicstaticConnectiongetConnection(Stringdburl,Stringuser,Stringpassword)JDBCURL如果通过JDBC-ODBC桥驱动程序连接数据库,URL的形式为:jdbc:odbc:DataSource例如:Stringdburl=jdbc:odbc:Bookstore;如果使用专门的驱动程序连接数据库,JDBCURL可能更复杂一些。例如要连接PostgreSQL数据库,它的JDBCURL为:jdbc:postgresql://localhost:5432/dbnameStringdburl=jdbc:postgresql://localhost:5432/bookstore;Connectionconn=DriverManager.getConnection(dburl,bookstore,bookstore);7.3.3创建语句对象对于不同的语句对象,可以使用Connection接口的不同方法创建。例如,要创建一个简单的Statement对象可以使用createStatement()方法,Statementstmt=conn.createStatement();创建PreparedStatement对象应该使用prepareStatement()方法创建CallableStatement对象应该使用prepareCall()方法。7.3.4获得SQL语句的执行结果对于查询语句,调用executeQuery(Stringsql)方法,如:Stringsql=SELECT*FROMbooks;ResultSetrst=stmt.executeQuery(sql);while(rst.next()){out.print(rst.getString(1)+\t);}对于DDL语句如CREATE、ALTER、DROP、INSERT、UPDATE、DELETE等须使用语句对象的executeUpdate(Stringsql)方法。该方法返回值为整数,用来指示被影响的行数。7.3.5关闭建立的对象,释放资源在Connection接口、Statement接口和ResultSet接口中都定义的close()方法。当这些对象使用完毕后应使用close()方法关闭建立的对象,关闭对象应该按与建立对象相反的顺序关闭。例如:conn.close();7.3.6简单的应用示例本示例程序从JSP页面输入一个书号,查询该书的信息。该例符合MVC设计模式该应用的程序代码:模型:BookBean.java视图:bookQuerys.jspshowBook.jsperror.jsp控制器:BookQueryServlet.javaweb.xml文件7.3JDBCAPI介绍JDBCAPI是Java语言的标准API,目前的最新版本是JDBC4.0。在JDK6.0中,它是通过两个包提供的:java.sql包javax.sql包。java.sql包提供了基本的数据库编程的类和接口,如驱动程序管理类DriverManager、创建数据库连接Connection接口、执行SQL语句以及处理查询结果的类和接口等。javax.sql包主要提供了服务器端访问和处理数据源的类和接口,如DataSource、RowSet、RowSetMetaData、PooledConnection接口等,它们可以实现数据源管理、行集管理以及连接池管理等。Connection对象代表与数据库的连接,也就是在加载的驱动程序与数据库之间建立连接。一个应用程序可以与一个数据库建立一个或多个连接,或者与多个数据库建立连接。得到连接对象后,可以调用Connection接口的方法创建SQL语句对象以及在连接对象上完成各种操作,下面是Connection接口的常用方法:publicStatementcreateStatement()7.4.1Connection接口publicDatabseMetaDatagetMetaData()publicvoidsetAutoCommit(booleanautoCommit)publicbooleangetAutoCommit()publicvoidcommit()提交对数据库的更新操作,使更新写入数据库。只有当setAutoCommit()设置为false时才应该使用该方法。publicvoidrollback()回滚对数据库的更新操作。只有当setAutoCommit()设置为false时才应该使用该方法。publicvoidclose()publicbooleanisClosed()4.4.2Statement对象通过Connection对象可以创建SQL语句对象,SQL语句对象有三种:Statement、PreparedStatement和CallableStatement。通过调用Connection接口的相应方法可以得到这三种语句对象。Stat