此处用的是一个java web系统的一个staff表操作的模块,核心部分包括表的设计、数据库连接、数据封装类(VO)的创建、封装业务的JavaBean(DAO)、servlet和jsp结合对数据库进行操作和显示。其他业务的操作大同小异。
涉及到的类、jsp和servlet
ConnectionManager.java
Staff.java
Staff_Interface.java
OperateStaff.java
servlet如下:
GetStaff.java
doAddStaff.java
doEditStaff.java
doDeleteStaff.java
配置文件:web.xml
jsp如下:
AddStaff.jsp
EditStaff.jsp
ShowStaff.jsp
error.jsp
使用sql server 数据库,staff表如下:
此数据表不是本人设计,在字段设置上有缺陷,还有数据库的编码也存在问题,此处只展示表的大体结构,大家在数据库设计上一定要力求完整!
接下来分析每个类的作用,以便理解DAO,VO,下篇再分析servlet。
ConnectionManager.java
此类是数据库管理类,注册数据库驱动和获取数据库连接,以及关闭数据库连接,其中,getConnection()方法用于返回连接对象dbconnection(后面用得到),另外还含有Connection、ResultSet、Statement对象的关闭方法,如void getConnection(Connection con){省略}
package beans;
//对数据库连接的类
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
public class ConnectionManager {
private static final String DRIVER_CLASS="com.microsoft.sqlserver.jdbc.SQLServerDriver";
private static final String DATABASE_URL="jdbc:sqlserver://127.0.0.1:1433;databaseName=数据库名称";
private static final String DATABASE_USER="sa";
private static final String DATABASE_PASSWORD="123456";
//返回连接
public static Connection getConnection(){
Connection dbConnection=null;
try{
Class.forName(DRIVER_CLASS);
dbConnection=DriverManager.getConnection(DATABASE_URL,DATABASE_USER,DATABASE_PASSWORD);
//System.out.println("连接:"+dbConnection);
}catch(Exception e){
e.printStackTrace();
}
return dbConnection;
}
//书上没有,增加的关闭数据库连接的一些代码
public static void closeConnection(Connection connection) throws SQLException{
connection.close();
}
public static void closeResultSet(ResultSet results) throws SQLException{
results.close();
}
public static void closeStatement(PreparedStatement st) throws SQLException{
st.close();
}
}
Staff.java
是一个封装数据的JavaBean(类),也是一个VO(VO就是一个简单的JavaBean),JavaBean 中定义了成员变量和相应的set和get方法。
package beans;
//数据封装类
public class staff {
private String staffID;//员工id
private String staffName;//员工姓名
private String staffPhone;//员工电话
private int staffAge;//员工年龄
private String staffPassword;//员工密码
private String worktime;//上班时段
private String managerID;//店长编号
public String getStaffID() {
return staffID;
}
public void setStaffID(String staffID) {
this.staffID = staffID;
}
public String getStaffName() {
return staffName;
}
public void setStaffName(String staffName) {
this.staffName = staffName;
}
public String getStaffPhone() {
return staffPhone;
}
public void setStaffPhone(String staffPhone) {
this.staffPhone = staffPhone;
}
public int getStaffAge() {
return staffAge;
}
public void setStaffAge(int staffAge) {
this.staffAge = staffAge;
}
public String getStaffPassword() {
return staffPassword;
}
public void setStaffPassword(String staffPassword) {
this.staffPassword = staffPassword;
}
public String getWorktime() {
return worktime;
}
public void setWorktime(String worktime) {
this.worktime = worktime;
}
public String getManagerID() {
return managerID;
}
public void setManagerID(String managerID) {
this.managerID = managerID;
}
}
Staff_Interface.java
Staff表的操作接口类,在接口类中定义类的方法原型,在具体类OperateStaff.java(DAO)中实现接口。设置接口的作用主要是便于对程序扩充。
package beans;
//员工信息表接口
import java.util.List;
public interface Staff_Interface {
public List getStaff();//获得员工列表
public int AddStaff(staff st);//添加员工
public int DeleteStaff(String staffID);//删除员工
public int UpdateStaff(staff st);//修改员工信息
public staff FindStaff(String staffID);//查找员工
}
OperateStaff.java
为一个DAO,封装了数据库的操作,如增加、删除、修改、查找,在此DAO中,会把从数据库查询到的信息实例化为VO(用查询到的信息来实例化VO(如此处的staff.java类)),再将实例化的VO放入ArrayList数组中(或其他存储对象中,如HashMap对象)。
DAO中一般含有如下结构:
ArrayList stlist=new ArrayList();
获取连接对象(用上面的getConnection()),然后查询
while(rs.next())
Staff staff=new Staff();//每次创建一个封装类的实例
staff.setXX(省略);//调用set方法实例化VO(就是那个staff类)
然后,用stlist.add(staff);//将实例化的类添加到数组中
最后,返回return stlist;//返回ArrayList对象,后面的servlet中用得到
package beans;
//数据库表操作类
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
public class OperateStaff implements Staff_Interface{//实现staff接口
private Connection connection;
private PreparedStatement StaffQuery;
private ResultSet results;
public List getStaff(){//用于ShowStaff中员工信息的显示
List staffList=new ArrayList();
//获取员工列表
try{
connection=ConnectionManager.getConnection();
StaffQuery=connection.prepareStatement("select staffID,staffName,staffPhone,staffAge,worktime,managerID from dbo.员工信息");
results=StaffQuery.executeQuery();
//读取行数据
while(results.next()){
staff st=new staff();//每次创建一个封装类的实例,实例化一个javabean
//将数据表中的一条记录数据添加到到封装类中
st.setStaffID(results.getString("staffID"));
st.setStaffName(results.getString("staffName"));
st.setStaffPhone(results.getString("staffPhone"));
st.setStaffAge(results.getInt("staffAge"));
st.setWorktime(results.getString("workTime"));
st.setManagerID(results.getString("managerID"));
staffList.add(st);
}
}catch(SQLException e){
e.printStackTrace();
}
//释放资源
finally{
try {
ConnectionManager.closeConnection(connection);
ConnectionManager.closeStatement(StaffQuery);
ConnectionManager.closeResultSet(results);
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
return staffList;
}
public int AddStaff(staff st){//利用封装类的实例插入记录
int result=0;
try{
connection=ConnectionManager.getConnection();
String sql="insert into dbo.员工信息 values(?,?,?,?,?,?)";
StaffQuery=connection.prepareStatement(sql);
StaffQuery.setString(1, st.getStaffID());
StaffQuery.setString(2, st.getStaffName());
StaffQuery.setString(3,st.getStaffPhone());
StaffQuery.setInt(4,st.getStaffAge());
StaffQuery.setString(5, st.getWorktime());
StaffQuery.setString(6, st.getManagerID());
result=StaffQuery.executeUpdate();
}catch(Exception e){
e.printStackTrace();
}finally{
try{ //ConnectionManager.closeResultSet(results);
ConnectionManager.closeStatement(StaffQuery);
ConnectionManager.closeConnection(connection);
}catch(Exception e){
e.printStackTrace();
}
}
return result;
}
public int DeleteStaff(String staffID){
int result=0;
try{
connection=ConnectionManager.getConnection();
String sql="delete from dbo.员工信息 where staffID='"+staffID+"'";
StaffQuery=connection.prepareStatement(sql);
result=StaffQuery.executeUpdate();
}catch(Exception e){
e.printStackTrace();
}//释放资源
finally{
try {
//ConnectionManager.closeResultSet(results);
ConnectionManager.closeStatement(StaffQuery);
ConnectionManager.closeConnection(connection);
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
return result;
}
public int UpdateStaff(staff st){//利用封装类的实例来更新表中记录
int result=0;
try{
connection=ConnectionManager.getConnection();
String sql="update dbo.员工信息 set staffName=?,staffPhone=?,staffAge=?,worktime=? where staffID=?";
StaffQuery=connection.prepareStatement(sql);
StaffQuery.setString(1, st.getStaffName());
StaffQuery.setString(2,st.getStaffPhone());
StaffQuery.setInt(3, st.getStaffAge());
StaffQuery.setString(4, st.getWorktime());
StaffQuery.setString(5,st.getStaffID());
result=StaffQuery.executeUpdate();
}catch(Exception e){
e.printStackTrace();
}//释放资源
finally{
try{
//ConnectionManager.closeResultSet(results);
ConnectionManager.closeStatement(StaffQuery);
ConnectionManager.closeConnection(connection);
}catch(Exception e){
e.printStackTrace();
}
}
return result;
}
public staff FindStaff(String staffID){//根据员工编号查找
staff st=null;
try{
connection=ConnectionManager.getConnection();
String sql="select * from dbo.员工信息 where staffID='"+staffID+"'";
StaffQuery=connection.prepareStatement(sql);
results=StaffQuery.executeQuery();
if(results.next()){
st=new staff();//每次创建一个封装类的实例
//将数据表中的一条记录添加到封装类中
st.setStaffID(results.getString("staffID"));
st.setStaffName(results.getString("staffName"));
st.setStaffPhone(results.getString("staffPhone"));
st.setStaffAge(results.getInt("staffAge"));
st.setWorktime(results.getString("worktime"));
st.setManagerID(results.getString("managerID"));
}
}catch(Exception e){
e.printStackTrace();
}finally{
try{
ConnectionManager.closeResultSet(results);
ConnectionManager.closeStatement(StaffQuery);
ConnectionManager.closeConnection(connection);
}catch(Exception e){
e.printStackTrace();
}
}
return st;
}
}