项目要求:
1、使用JSP+DAO开发模式完成一个简单的雇员管理系统。系统主要功能如下:
- 登录验证:用户通过验证用户名密码进入后台管理界面
- 雇员列表:后台管理首页是雇员列表展示页面,并可以通过雇员编号、姓名等关键词查询出符合条件的雇员记录
- 添加雇员:新增雇员必填信息包括雇员编号、姓名,编号必须唯一;
- 编辑雇员:编辑雇员资料,必须确保编号唯一,姓名不能为空。
具体功能模块样式可以参照提供的项目原型
2、相关数据结构,数据库采用mysql。
序号 | 字段名 | 中文名 | 类型 | 是否为空 | 备注 |
1 | empno | 雇员编号 | varchar(10) | 否 | |
2 | ename | 雇员姓名 | varchar(20) | 否 | |
3 | hiredate | 雇佣日期 | date | ||
4 | job | 工作 | varchar(20) | ||
5 | sal | 工资 | double | 小数点保留2位 |
3、按照DAO的方式完成后端代码开发,定义VO类,DatabaseConnection.java类,定义DAO操作标准和代理主题实现类和DAO工厂类
完成思路:
1.页面设计:对于页面暂时不适用css等进行优化,使用html表单即可.
2.设计开发项目目录
2.组成部件:数据库(利用可视化界面或者后台新建表单),设计VO类(雇员,登录用户),设计DAO接口以及实现,工厂类
完整工程文件: Employee_system
- 实验步骤和结果
1.建表emp : mysql navcat中显示的表信息
2.建立项目相关夹:在WebContent下建立jsp文件夹,在JavaResources 下建立各包
3.先写javaBean信息,dao工具类,再写jsp内容
4.调试
运行结果:
1.登录界面
1*.登录失败时
2.雇员信息管理界面
3.添加雇员
添加成功
4.更新雇员信息 (与注册添加雇员一样的界面,但是通过超链接跳转传,会在文本框内显示修改的雇员信息)
部分代码:
2.Connection conn = null; JDBC连接数据库驱动.声明数据库连接对象
DatabaseConnection.java (封装数据库连接类)
package dbc;
import java.sql.Connection;
import java.sql.DriverManager;
//数据库连接类
public class DatabaseConnection {
private static final String DBDRIVER = "";
private static final String DBURL = "";
private static final String DBUSER = "";
private static final String DBPASSWORD= "";
private Connection conn = null;
//构造方法中进行数据连接
public DatabaseConnection() throws Exception{
try{
//Class.forName 方法的作用,就是初始化给定的类
Class.forName(DBDRIVER);//加载驱动程序
this.conn = DriverManager.getConnection(DBURL,DBUSER,DBPASSWORD);
}catch(Exception e){
throw e;
}
}
public Connection getConnection(){
return this.conn;
}
public void close () throws Exception{
if(this.conn!=null){
try{
this.conn.close();
}catch(Exception e){
throw e;
}
}
}
}
3.Emp.java (VO类)
玩转Eclipse — 自动生成setter和getter方法_懒,是我追求的美德-CSDN博客_eclipse getter setter快捷键 快速设置setter , getter 方法
使用快捷键Alt + Shift + S,再按R键(你Eclipse中的快捷键可能不同),或者右键选择Source -> Generate Getters and Setters...
package com.tt.vo;
import java.util.Date;
public class Emp {
private int empno;
private String ename;
private String job;
private Date hiredate;
private float sal;
public int getEmpno() {
return empno;
}
public void setEmpno(int empno) {
this.empno = empno;
}
public String getEname() {
return ename;
}
public void setEname(String ename) {
this.ename = ename;
}
public String getJob() {
return job;
}
public void setJob(String job) {
this.job = job;
}
public Date getHiredate() {
return hiredate;
}
public void setHiredate(Date hiredate) {
this.hiredate = hiredate;
}
public float getSal() {
return sal;
}
public void setSal(float sal) {
this.sal = sal;
}
}
4.dao : 设计DAO操作接口
package com.tt.dao;
import java.util.List;
import com.tt.vo.Emp;
public interface IEmpDAO {
public boolean doCreate (Emp emp) throws Exception;
//查询全部数据
public List<Emp> findAll(String keyWord) throws Exception;
//按照雇员的编号查询数据
public Emp findByld (int empno) throws Exception;
//更新职工信息
public boolean updateInfo (Emp emp) throws Exception;
}
真实主题实现DAO
package com.tt.dao;
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.tt.vo.Emp;
public class EmpDAOImpl implements IEmpDAO{
private Connection conn = null;//连接对象
private PreparedStatement pstmt = null;//数据库操作对象
//构造方式去得连接
public EmpDAOImpl(Connection conn){
this.conn = conn;
}
public boolean doCreate (Emp emp) throws Exception{
boolean flag = false;
//插入的sql语句
String sql = "INSERT INTO emp(empno,ename,job,hiredate,sal) VALUES (?,?,?,?,?)";
//实例化pstmt对象
this.pstmt = this.conn.prepareStatement(sql);
//pstmt的设置方法:通过传入emp 对象来获取对象信息
this.pstmt.setInt(1,emp.getEmpno());
this.pstmt.setString(2,emp.getEname());
this.pstmt.setString(3,emp.getJob());
this.pstmt.setDate(4,new java.sql.Date(emp.getHiredate().getTime()));
this.pstmt.setFloat(5,emp.getSal());
//执行操作次数
if(this.pstmt.executeUpdate()>0){
flag = true;
}
//执行对象关闭
this.pstmt.close();
return flag;
}
public boolean updateInfo (Emp emp) throws Exception{
boolean flag = false;
int count = 0;
//sql的更新语句
String sql = "update emp set empno='"+emp.getEmpno()
+"'job'"+emp.getJob()+"'hiredate'"+emp.getHiredate().getTime()+"'sal'"+emp.getSal()
+"where ename="+emp.getEname();
try {
System.out.println("准备更新 id 为 "+emp.getEname()+"的记录...");
Statement st = this.conn.createStatement();
count = st.executeUpdate(sql);
if (count != 0) {
System.out.print("更新成功!!! ");
} else {
System.out.print("update error!!! ");
}
} catch (SQLException e) {
e.printStackTrace();
} finally {
}
if(count != 0) return true;
else return false;
}
//查询全部数据:;利用list存储返回对象
public List<Emp> findAll(String keyWord) throws Exception{
List<Emp> all = new ArrayList<Emp>();
String sql = "SELECT empno,ename,job,hiredate,sal FROM emp WHERE ename LIKE ? OR job LIKE ?";
this.pstmt = this.conn.prepareStatement(sql);
this.pstmt.setString(1,"%"+keyWord+"%");//设置查找关键字
this.pstmt.setString(2,"%"+keyWord+"%");
ResultSet rs = this.pstmt.executeQuery();
Emp emp= null;
while(rs.next()){
emp = new Emp();
//get类型+对象序号
emp.setEmpno(rs.getInt(1));
emp.setEname(rs.getString(2));
emp.setJob(rs.getString(3));
emp.setHiredate(rs.getDate(4));
emp.setSal(rs.getFloat(5));
all.add(emp);
}
//关闭连接对象
this.pstmt.close();
//返回所有对象
return all;
}
//按照雇员的编号获取对象信息
public Emp findByld (int empno) throws Exception{
Emp emp = null;
String sql = "SELECT empno,ename,job,hiredate,sal FROM emp WHERE empno = ?";
this.pstmt = this.conn.prepareStatement(sql);
this.pstmt.setInt(1,empno);
ResultSet rs = this.pstmt.executeQuery();
while(rs.next()){
emp = new Emp();
emp.setEmpno(rs.getInt(1));
emp.setEname(rs.getString(2));
emp.setJob(rs.getString(3));
emp.setHiredate(rs.getDate(4));
emp.setSal(rs.getFloat(5));
}
this.pstmt.close();
return emp;
}
}
代理类(未写完):
package com.tt.dao;
import java.sql.Connection;
import java.text.SimpleDateFormat;
import java.util.List;
import com.tt.vo.Emp;
import com.util.dbc.DatabaseConnection;
public class EmpDAOProxy implements IEmpDAO {
//数据库连接类(工具类)
private DatabaseConnection dbc = null;
//真实DAO对象
private IEmpDAO dao = null;
private Connection conn = null;//连接对象
//构造方法中实例化对象
public EmpDAOProxy() throws Exception{
this.dbc = new DatabaseConnection();
//传入或得的conn对象
this.dao = new EmpDAOImpl(this.dbc.getConnection());
}
public boolean doCreate (Emp emp) throws Exception{
boolean flag = false;
try {
if(this.dao.findByld(emp.getEmpno())==null) {
flag = this.dao.doCreate(emp);
}
}catch(Exception e) {
throw e;
}finally {
this.dbc.close();
}
return flag;
}
//查询全部数据:;利用list存储返回对象
public List<Emp> findAll(String keyWord) throws Exception{
List<Emp>all = null;
try {
all = this.dao.findAll(keyWord);
}catch (Exception e){
throw e;
}finally {
this.dbc.close();
}
return all;
}
//按照雇员的编号获取对象信息
public Emp findByld (int empno) throws Exception{
Emp emp = null;
try {
emp = this.dao.findByld(empno);
} catch(Exception e) {
throw e;
}finally {
this.dbc.close();
}
return emp;
}
public boolean updateInfo (Emp emp) throws Exception{
boolean flag = false;
try {
if(this.dao.findByld(emp.getEmpno())==null) {
flag = this.dao.updateInfo(emp);
}
}catch(Exception e) {
throw e;
}finally {
this.dbc.close();
}
return flag;
}
}
代理工厂:
package factory;
import dao.EmpDAOProxy;
import dao.IEmpDAO;
public class DAOFactory {
public static IEmpDAO getIEmpDAOInstance () throws Exception{
return new EmpDAOProxy();
}
}
总结:
对数据库的操作流程:
通过 DAOFactory 创建 EmpDAOProxy (代理类) 获得 IEmpDAO 接口功能
EmpDAOProxy 通过利用 DatabaseConnection 取得数据库连接,传入 实例化 IEmpDAO(真实操作类),并通过真实类进行操作数据库.
IEmpDAO (真实类)通过定义 Connection(连接类),PreparedStatement(操作类),ResultSet (获取结果类)来操作返回 Emp 对象
最后页面通过取得 Emp 数据来进行输出.
源代码: