资源描述
实验三DBCP数据库连接池配置的应用
实验内容和要求:
总所周知建立数据库连接是一个非常耗时耗资源的行为,因此现代的Web中间件,无论是开源的Tomcat、Jboss还是商业的websphere、weblogic都提供了数据库连接池功能,可以毫不夸张的说,数据库连接池性能的好坏,不同厂商对连接池有着不同的实现。本实验要求掌握数据库连接池的配置和使用。
项目运行如下图:
实验步骤如下:
1.准备需要访问的数据库
n 下载并安装MySQL5.0
n Copy MySQL5.0驱动mysql-connector-java-5.0.8-bin.jar到%TOMCAT%\lib文件夹下
n 创建数据库及表:
数据库的设计如下表:
数据库采用MySQL5.0,数据库名:rj12,表名:usertab(用户表)
数据库表usertab中数据如下:
2. 配置tomcat,将apache-tomcat-6.0.20.zip压缩文件解压缩,在MyEclipse中配置tomcat6,如图所示:
在windows-〉Preferences-〉MyEclipse-〉Servers-〉Tomcat-〉Tomcat 6.x
配置好以后在Server面板中出现:
3. 驱动mysql-connector-java-5.0.8-bin.jar拷贝到%TOMCAT%\lib文件夹下,在%TOMCAT%\config文件夹下,找到server.xml文件,修改此文件,在<GlobalNamingResources>和</ GlobalNamingResources>之间添加如下代码:
<Resource name="jdbc/mysqls"
auth="Container"
type="javax.sql.DataSource"
maxActive="100"
maxIdle="30"
maxWait="10000"
username="root"
password="root"
driverClassName="com.mysql.jdbc.Driver"
url="jdbc:mysql://localhost:3306/rj12"/>
4. 在%TOMCAT%\conf文件夹下编辑web.xml文件,在<web-app>和</web-app >之间添加如下代码:
<resource-ref>
<res-ref-name>jdbc/mysqls</res-ref-name>
<res-type>javax.sql.DataSource</res-type>
<res-auth>Container</res-auth>
</resource-ref>
5. 在Tomcat安装目录下的\conf\Catalina\localhost文件夹下,找到要配置的Web应用的xml文件,例如web应用为empproject,既是empproject.xml
在<Context>和</ Context >之间添加如下代码:
<Context antiResourceLocking="false" privileged="true" >
<ResourceLink name="jdbc/mysqls"
global="jdbc/mysqls" type="javax.sql.DataSource"/>
</Context>
若没有这句,就可能出现
“Cannot create JDBC driver of class for connect URL ‘null’ “的错误.
6. 开发过程如下:
Step1:在com.pojo包中创建JavaBean: User.java,内容如下:
package com.pojo;
public class User {
private int id;
private String username;
private String password;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
}
Step2:在com.util包中创建访问数据库的工具类—JdbcUti.java,内容如下:
package com.util;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.sql.DataSource;
public class JdbcUtil {
private static final String DSNAME = "java:comp/env/jdbc/mysqls";
private static JdbcUtil instance = new JdbcUtil();
private JdbcUtil() {
}
public static JdbcUtil getInstance() {
return instance;
}
private static Context ctx=null;
private static DataSource ds=null;
// 加载驱动
static {
try {
//Class.forName(DIVER);
ctx=new InitialContext();
ds=(DataSource)ctx.lookup(DSNAME);
} catch (Exception e) {
// TODO Auto-generated catch block
// e.printStackTrace();
System.out.println("数据库驱动加载失败!");
}
}
// 创建连接
public Connection getConn() {
Connection conn = null;
try {
conn=ds.getConnection();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
System.out.println("连接数据库失败!");
}
return conn;
}
// 关闭资源
public void free(Connection conn, Statement stmt, ResultSet rs) {
try {
if (rs != null) {
rs.close();
} else if (stmt != null) {
stmt.close();
} else if (conn != null) {
conn.close();
}
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
Step3:采用DAO设计模式
在com.dao包下创建UserDao接口,代码如下:
package com.dao;
import java.util.List;
import com.pojo.User;
public interface UserDao {
//查询全部信息
List<User> findAll();
//登录
User findOne(String username,String password);
//通过Id查一个数据
User findOne(int id);
//注册
int insertOne(User user);
}
在com.dao.impl包下创建UserDao接口的实现类UserDaoImpl.java,代码如下:
package com.dao.impl;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.List;
import com.dao.UserDao;
import com.pojo.User;
import com.util.JdbcUtil;
public class UserDaoImpl implements UserDao{
public List<User> findAll() {
Connection conn=JdbcUtil.getInstance().getConn();
String sql="select * from usertab";
List<User> list=new ArrayList<User>();
Statement stmt=null;
ResultSet rs=null;
try {
stmt=conn.createStatement();
rs=stmt.executeQuery(sql);
while(rs.next()){
User user=new User();
user.setId(rs.getInt("id"));
user.setUsername(rs.getString("username"));
user.setPassword(rs.getString("password"));
list.add(user);
}
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally{
JdbcUtil.getInstance().free(conn, stmt, rs);
}
return list;
}
//登录
public User findOne(String username, String password) {
Connection conn=JdbcUtil.getInstance().getConn();
String sql="select * from usertab where username=? and password=?";
PreparedStatement pstmt=null;
ResultSet rs=null;
User user=null;
try {
pstmt=conn.prepareStatement(sql);
pstmt.setString(1, username);
pstmt.setString(2, password);
rs=pstmt.executeQuery();
if(rs.next()){
user=new User();
user.setId(rs.getInt("id"));
user.setUsername(rs.getString("username"));
user.setPassword(rs.getString("password"));
}
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally{
JdbcUtil.getInstance().free(conn, pstmt, rs);
}
return user;
}
public User findOne(int id) {
// TODO Auto-generated method stub
return null;
}
public int insertOne(User user) {
// TODO Auto-generated method stub
return 0;
}
}
Step4:根据MVC设计模式,在com.service包下创建UserService.java 接口,代码如下:
package com.service;
import java.util.List;
import com.pojo.User;
public interface UserService {
List<User> findAll();
}
在com.service.impl包下创建实现了UserService接口的实现类UserServiceImpl.java,代码如下:
package com.service.impl;
import java.util.List;
import com.dao.UserDao;
import com.dao.impl.UserDaoImpl;
import com.pojo.User;
import com.service.UserService;
public class UserServiceImpl implements UserService{
private UserDao ud=new UserDaoImpl();
public List<User> findAll() {
// TODO Auto-generated method stub
return ud.findAll();
}
}
Step5:修改在WebRoot下的index.jsp页面。代码如下:
<body>
<a href="UserServlet?flag=1">查看所有用户信息</a>
</body>
其中flag是在UserServlet中接收的一个标志参数,flag=1时所实现的功能是到数据库中查询全部信息。
Step6:在com.servlet包下创建一个Servlet,UserServlet.java代码如下:
package servlet;
import java.io.IOException;
import java.util.List;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import com.pojo.User;
import com.service.UserService;
import com.service.impl.UserServiceImpl;
public class UserServlet extends HttpServlet {
private UserService us=new UserServiceImpl();
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doPost(request, response);
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("text/html;charset=utf-8");
request.setCharacterEncoding("utf-8");
response.setCharacterEncoding("utf-8");
String flag=request.getParameter("flag");
int select=0;
if(flag!=null){
select=Integer.parseInt(flag);
}
switch (select) {
case 1:
findAll(request,response);
break;
default:
break;
}
}
//查询全部用户信息
public void findAll(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
List<User> list=us.findAll();
request.setAttribute("list", list);
request.getRequestDispatcher("list.jsp").forward(request, response);
}
}
注意:在servlet中只能调用service层中的方法,遵循MVC设计原则。
Step6:在WebRoot下增加list.jsp页面,显示从数据库中查到的所有数据。代码如下:
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@taglib prefix="c" uri="
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>My JSP 'list.jsp' starting page</title>
</head>
<body>
显示用户信息
<br>
<table border="1">
<tr>
<td>
用户ID
</td>
<td>
用户名
</td>
<td>
用户密码
</td>
</tr>
<c:forEach items="${requestScope.list}" var="u">
<tr>
<td>
${u.id }
</td>
<td>
${u.username}
</td>
<td>
${u.password}
</td>
</tr>
</c:forEach>
</table>
</body>
</html>
总结:本实验要求对MVC设计模式的各个层深刻理解,要求会写连接数据库的工具类JdbcUtil类。
展开阅读全文