1、实验8 JDBC访问数据库 一、实验目的 1. 掌握使用传统的方法访问数据库; 2. 掌握使用数据源的方法访问数据库。 二、实验原理 数据库应用是Web应用开发的一个重要应用。Web应用程序访问数据库有两种方法:传统的方法和使用JNDI数据源的方法。 传统方法访问数据库的步骤是:①加载数据库驱动程序;②建立连接对象;③创建语句对象;④获得结果集;⑤关闭有关连接对象。 使用数据源访问数据库的步骤是:①配置数据源(局部数据源或全局数据源);②通过JNDI机制查找命名数据源;③通过数据源对象创建连接对象;④其他与传统方法一致。 三、实验内容与步骤 (一)使用传统方法通过JSP页面访
2、问数据库 【步骤1】创建数据库。假设在PostgreSQL建立了一个名为bookstore的数据库,在其中建立books表,代码如下: CREATE TABLE books ( bookid character(5) PRIMARY KEY, --书号 title varchar2(80), --书名 author character varying(20), --作者 publisher character varying (40), --出版社 price real
3、 --价格 ); 向books表中插入几条记录,代码如下: INSERT INTO books VALUES ('204','Head First Servlets & JSP', 'Bryan Basham', '中国电力出版社',98.00); INSERT INTO books VALUES ('201', 'Servlets 与JSP 核心教程', 'Hall Marty','清华大学出版社',45); INSERT INTO books VALUES ('202', 'Tomcat与Java Web 开发技术祥解', '孙卫琴',
4、'机械工业出版社',45); INSERT INTO books VALUES ('203', 'JSP 应用开发技术', '柳永坡','人民邮电出版社',52); INSERT INTO books VALUES ('205', 'J2EE 1.4 编程指南', 'Spielman Sue','电子工业出版社',68); 注意:需要将数据库的JDBC驱动程序安装到应用程序的WEB-INF\lib目录中。 【步骤2】使用下面JSP页面displayBooks.jsp访问books表中的数据。 <%@ page contentType="text/html; charset=g
5、b2312" %> <%@ page import="java.sql.*"%>
6、"); Statement stmt = conn.createStatement(); String sql = "SELECT * FROM books" ; ResultSet rs = stmt.executeQuery(sql); out.println("
书号 | 书名 | 作者 | 价格 |
"+ rs.getString(1)+" | 7、>"+ rs.getString(2) +" | "+ rs.getString(3) +" | "+ rs.getString(5)+" |
8、charset=gb2312"%> <%@ page import="java.sql.*"%>
9、 "root", ""); Statement stmt = conn.createStatement(); String sql = "SELECT * FROM books"; ResultSet rs = stmt.executeQuery(sql); out.println("
书号 | 书名 | 作者 | 价格 |
" + rs.getString(1) + " | " + rs.getString(2) + " | " + rs.getString(3) + " | " + rs.getString(5) + " |
11、 }
%>
图1 displayBooks.jsp
(二)通过数据源访问数据库
注意:需要将数据库的JDBC驱动程序安装到Tomcat安装目录的\lib目录中,并重新启动Tomcat服务器。
【步骤1】建立局部数据源
在Web应用程序中建立一个META-INF目录,在其中建立一个context.xml文件,内容如下:
12、 name="jdbc/bookDS"
type="javax.sql.DataSource"
maxActive="4"
maxIdle="2"
username="bookstore"
maxWait="5000"
driverClassName="org.postgresql.Driver"
password="bookstore"
url="jdbc:mysql://localhost:3306/bookstore"/>
13、SP页面displayBooks.jsp访问数据库 <%@ page contentType="text/html; charset=gb2312" %> <%@ page import="java.sql.*, javax.sql.*,javax.naming.*"%>
14、"java:comp/env/jdbc/bookDS"); Connection conn = ds.getConnection(); Statement stmt = conn.createStatement(); ResultSet rs = stmt.executeQuery("SELECT * FROM books"); out.println("
书号 | 书名 | 作者 | 价格 |
"+ rs.getString(1)+" | "+ rs.getString(2) +" | "+ rs.getString(3) +" | "+ rs.getString(5)+" |
16、playBooks.jsp (三)综合应用。本实验采用MVC设计模式,通过数据源和DAO对象访问数据库。其中JavaBeans实现模型,访问数据库,Servlet实现控制器,JSP页面实现视图。 · 模型包括2个JavaBean:BookBean用于存放图书信息,BookDAO用于访问数据库。 · 控制器包括2个Servlet:BookQueryServlet根据请求参数查询图书信息、BookInsertServlet用来向数据库中插入数据。 · 视图包括4个JSP页面:bookQuery.jsp显示查询页面、bookInsert.jsp显示插入页面、display.jsp显示查询结果
17、页面和errorPage.jsp显示错误页面。 【步骤1】存放图书信息的JavaBeans代码BookBean.java,它也是一个传输对象。 package com.beans; import java.io.*; public class BookBean implements Serializable{ private String bookid = null; private String title = null; private String author = null; private String publisher = nu
18、ll; private float price = 0.0F; public BookBean(){} public BookBean(String bookId, String author, String title, String publisher, float price) { this.bookid = bookId; this.title = title; this.author = author; this.publishe
19、r = publisher; this.price = price; } public String getBookid() { return this.bookid; } public String getTitle() { return title; } public String getAuthor() { return this.author; } public float getPrice() { return price; } public String getPublisher () { return publishe
20、r; } public void setBookid(String bookid){ this.bookid=bookid; } public void setTitle(String title){this.title=title; } public void setAuthor(String author){ this. author = author; } public void setPrice(float price){this.price=price; } public void setPublisher (String
21、 publisher){ this.publisher = publisher;} } 【步骤2】下面的BookDAO是一个简单的JavaBeans,它实现数据库的访问。 package com.beans; import java.sql.*; import javax.sql.*; import javax.naming.*; import java.util.ArrayList; import com.beans.BookBean; public class BookDAO{ private static InitialContext context=
22、null; private DataSource dataSource = null; public BookDAO(){ try{ if(context == null){ context = new InitialContext(); } dataSource = (DataSource)context.lookup("java:comp/env/jdbc/bookDS"); }catch(NamingException e2){ } } // 根据书
23、号查询图书信息 public BookBean searchBook(String bookid){ Connection conn = null; PreparedStatement pstmt = null; ResultSet rst = null; BookBean book = new BookBean(); try{ conn = dataSource.getConnection(); pstmt = conn.prepareStatement("SELEC
24、T * FROM books WHERE bookid=?"); pstmt.setString(1,bookid); rst = pstmt.executeQuery(); if(rst.next()){ book.setBookid(rst.getString("bookid")); book.setTitle(rst.getString("title")); book.setAuthor(rst.getString("author")); boo
25、k.setPublisher(rst.getString("publisher")); book.setPrice(rst.getFloat("price")); return book; }else{ return null; } }catch(SQLException se){ return null; }finally{ try{ conn.close(); }catch(SQLExcept
26、ion se){ } } } // 插入一本图书记录 public boolean insertBook(BookBean book){ Connection conn = null; PreparedStatement pstmt = null; try{ conn = dataSource.getConnection(); pstmt = conn.prepareStatement( "INSERT INTO boo
27、ks VALUES(?,?,?,?,?)"); pstmt.setString(1,book.getBookid()); pstmt.setString(2,book.getTitle()); pstmt.setString(3,book.getAuthor()); pstmt.setString(4,book.getPublisher()); pstmt.setFloat(3,book.getPrice()); pstmt.executeUpdate
28、); pstmt.close(); return true; }catch(SQLException se){ return false; }finally{ try{ conn.close(); }catch(SQLException se){ } } } } 【步骤3】下面的JSP页面bookQuery.jsp实现根据书号查询图书信息 <%@ page contentType="text/html;
29、charset=gb2312" %>
30、@ page contentType="text/html; charset=gb2312" %>
33、gb2312"%>
34、operty="publisher"/>
价格:
35、请求转发到显示页面(display.jsp)或错误页面(errorPage.jsp)。 package com.control; import java.io.*; import java.sql.*; import javax.servlet.*; import javax.servlet.http.*; import com.beans.BookBean; import com.beans.BookDAO; public class BookQueryServlet extends HttpServlet{ public void doPost(HttpSe
36、rvletRequest request,HttpServletResponse response) throws ServletException,IOException{ String bookid = request.getParameter("bookid"); BookDAO bookdao = new BookDAO(); BookBean book = bookdao.searchBook(bookid); if(book!=null){ request.getSession().set
37、Attribute("book", book); RequestDispatcher view = request.getRequestDispatcher("/display.jsp"); view.forward(request, response); }else{ RequestDispatcher view = request.getRequestDispatcher("/errorPage.jsp"); view.forward(request, response); } } } 【步骤8】下面的
38、Servlet实现向数据库插入数据,并将控制请求的转发到bookInsert.jsp页面。 package com.control; import java.io.*; import java.sql.*; import javax.servlet.*; import javax.servlet.http.*; import com.beans.BookBean; import com.beans.BookDAO; public class BookInsertServlet extends HttpServlet{ public void doPost(Htt
39、pServletRequest request,HttpServletResponse response) throws ServletException,IOException{ request.setCharacterEncoding("gb2312"); String message = null; BookBean book = new BookBean( request.getParameter("bookid"),request.getParameter("title")
40、 request.getParameter("author"),request.getParameter("publisher"), Float.parseFloat(request.getParameter("price")) ); BookDAO bookdao = new BookDAO(); boolean success = bookdao.insertBook(book); if(success){ message = "成功插入一条记录!"; }else{
41、 message = "插入记录错误!";
}
request.setAttribute("result",message);
RequestDispatcher view = request.getRequestDispatcher("/bookInsert.jsp");
view.forward(request, response);
}
}
【步骤9】在DD文件中部署Servlet,将下列代码添加到DD文件的适当位置:
42、
43、bookquery.do