Jdbc小项目:员工工管理系统

前言

该项目是基于Idea2021.1.1和mysql8.0写的控制台小项目,主要是Jdbc的增删改查比较简单。这个项目结构理解后,可以写一些其他类似的控制台小项目做练习,例如,图书管理系统、超市管理系统、学籍管理系统等。

1.需求分析:

员工模块:
查询所有员工
按照员工编号查询员工
添加员工
修改员工
删除员工
部门模块:
查询所有部门
按照部门编号查询部门
添加部门
修改部门
删除部门
职位模块:
查询所有职位
按照职务编号查询职位
添加职位
修改职位
删除职位
工资等级模块:
查询所有工资等级
按照工资等级编号查询工资
添加工资等级
修改工资等级
删除工资等级

2.数据表设计

员工表
部门表
职位表
工资等级表

通过Mysql数据库创建表

– 员工表

CREATE TABLE emp (
id INT PRIMARY KEY, – 员工id
ename VARCHAR(50), – 员工姓名
job_id INT, – 职务id
mgr INT , – 上级领导
joindate DATE, – 入职日期
salary DECIMAL(7,2), – 工资
bonus DECIMAL(7,2), – 奖金
dept_id INT, – 所在部门编号
CONSTRAINT emp_jobid_ref_job_id_fk FOREIGN KEY (job_id) REFERENCES job (id),
CONSTRAINT emp_deptid_ref_dept_id_fk FOREIGN KEY (dept_id) REFERENCES dept (id)
);
desc emp;
select *from emp;
– 添加员工
INSERT INTO emp(id,ename,job_id,mgr,joindate,salary,bonus,dept_id)
VALUES (1001,‘孙悟空’,4,1004,‘2000-12-17’,‘8000.00’,NULL,20),
(1002,‘卢俊义’,3,1006,‘2001-02-20’,‘16000.00’,‘3000.00’,30),
(1003,‘林冲’,3,1006,‘2001-02-22’,‘12500.00’,‘5000.00’,30),
(1004,‘唐僧’,2,1009,‘2001-04-02’,‘29750.00’,NULL,20),
(1005,‘李逵’,4,1006,‘2001-09-28’,‘12500.00’,‘14000.00’,30),
(1006,‘宋江’,2,1009,‘2001-05-01’,‘28500.00’,NULL,30),
(1007,‘刘备’,2,1009,‘2001-09-01’,‘24500.00’,NULL,10),
(1008,‘猪八戒’,4,1004,‘2007-04-19’,‘30000.00’,NULL,20),
(1009,‘罗贯中’,1,NULL,‘2001-11-17’,‘50000.00’,NULL,10),
(1010,‘吴用’,3,1006,‘2001-09-08’,‘15000.00’,‘0.00’,30),
(1011,‘沙僧’,4,1004,‘2007-05-23’,‘11000.00’,NULL,20),

– 部门表

create table dept(
id int primary key ,
dname varchar(50),
loc varchar(50)
);
– 添加四个部门
insert into dept(id,dname,loc)values
(10,‘教育部’,‘北京’),
(20,‘学工部’,‘上海’),
(30,‘销售部’,‘广州’),
(40,‘财政部’,‘深圳’);

– 职位表

create table job(
id int primary key,
jname varchar(20),
description varchar(50)
);
– 添加四个职务
insert into job(id,jname,description)values
(1,‘董事长’,‘管理整个公司,接单’),
(2,‘经理’,‘管理整个公司’),
(3,‘销售员’,‘向客人推销产品’),
(4,‘文员’,‘使用办公软件’);

– 工资等级表

create table salarygrade(
grade int primary key, – 级别
losalary int, – 最低工资
hisalary int – 最高工资
);
– 添加工资等级
INSERT INTO salarygrade(grade,losalary,hisalary) VALUES
(1,7000,12000),
(2,12010,14000),
(3,14010,20000),
(4,20010,30000),

3.项目搭建

创建包结构:
cn.kwym.empmanager.model:实体类
cn.kwym.empmanager.dao:员工操作接口
cn.kwym.empmanager.dao.impl:员工操作实现类
cn.kwym.empmanager.util:工具类
cn.kwym.empmanager.test:测试类
cn.kwym.empmanager.view:展示层
2.导入jar包:
commons-beanutils-1.9.4.jar
日志commons-logging-1.2.jar
连接池druid-1.0.9.jar
hamcrest-2.2.jar
单元测试junit-4.12.jar
数据库驱动包mysql-connector-java-5.1.49.jar

**注意:**导入包之后,选中jar包,鼠标右键单击弹出菜单,找到Add as library点击后,jar包这时才导入成功(jar包直接粘贴到项目是不能用的)
员工管理系统所需jar包下载链接:链接:https://pan.baidu.com/s/1kJf9G4SmIDfwPuu1xkHHyA
提取码:p9a0

3.编写代码:

该部分只展示核心代码
项目结构
项目结构
项目结构
由于项目四个部分类似,以部门表为例,展示核心代码:

BaseDao类:
public class BaseDao {
    /**
     * 查询操作
     * @param clazz 类的字节码文件对象
     * @param sql sql语句
     * @param params 要赋的值
     * @param <T>
     * @return
     */
    public <T> List<T> queryAll(Class<T> clazz, String sql, Object... params){
        // 创建集合
        List<T> list = new ArrayList<>();
        ResultSet rs = null;
        // 获取连接
        Connection conn = DruidUtils.getConnection();
        // 获取预编译的sql执行对象
        PreparedStatement pstat = DruidUtils.getPreparedStatement(conn, sql);
        // 给参数赋值
        DruidUtils.bindParam(pstat,params);
        try {
            // 执行查询
            rs = pstat.executeQuery();
            // 获取表的元数据 ResultSetMetaData getMetaData()
            ResultSetMetaData metaData = rs.getMetaData();
            // 获取列数 int getColumnCount()
            int columnCount = metaData.getColumnCount();
            // 处理结果集
            while (rs.next()){
                // 反射创建对象
                T bean = clazz.newInstance();
                // 遍历列数
                for(int i = 1; i <= columnCount; i++){
                    // 获取每列的数据 getObject(int columnIndex)
                    Object value = rs.getObject(i);
                    // 给对象的属性设置值
                    BeanUtils.setProperty(bean,metaData.getColumnName(i),value);
                }
                list.add(bean);
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            DruidUtils.close(rs,pstat,conn);
        }
        return list;
    }

    /**
     * 查询单个操作
     * @param clazz 类的字节码文件对象
     * @param sql sql语句
     * @param params 要赋的值
     * @param <T>
     * @return
     */
    public <T> T queryOne(Class<T> clazz, String sql, Object... params){
        ResultSet rs = null;
        // 获取连接
        Connection conn = DruidUtils.getConnection();
        // 获取预编译的sql执行对象
        PreparedStatement pstat = DruidUtils.getPreparedStatement(conn, sql);
        // 给参数赋值
        DruidUtils.bindParam(pstat,params);
        try {
            // 执行查询
            rs = pstat.executeQuery();
            // 获取表的元数据 ResultSetMetaData getMetaData()
            ResultSetMetaData metaData = rs.getMetaData();
            // 获取列数 int getColumnCount()
            int columnCount = metaData.getColumnCount();
            // 处理结果集
            if (rs.next()){
                // 反射创建对象
                T bean = clazz.newInstance();
                // 遍历列数
                for(int i = 1; i <= columnCount; i++){
                    // 获取每列的数据 getObject(int columnIndex)
                    Object value = rs.getObject(i);
                    // 给对象的属性设置值
                    BeanUtils.setProperty(bean,metaData.getColumnName(i),value);
                }
                return bean;
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            DruidUtils.close(rs,pstat,conn);
        }
        return null;
    }

    /**
     * 增删改操作
     * @param sql
     * @param params
     * @return
     */
    public boolean update(String sql,Object... params){
        // 获取连接
        Connection conn = DruidUtils.getConnection();
        // 获取预编译的sql执行对象
        PreparedStatement pstat = DruidUtils.getPreparedStatement(conn, sql);
        // 给sql的问号赋值
        DruidUtils.bindParam(pstat,params);
        try {
            // 执行增删改操作
            int i = pstat.executeUpdate();
            // 判断
            if (i>0) {
                return true;
            }
        } catch (SQLException throwables) {
            throwables.printStackTrace();
        } finally {
            DruidUtils.close(null, pstat, conn);
        }
        return false;
    }
Dept:
public class Dept {

    private Integer id;
    private String dname;
    private String loc;

    public Dept() {
    }

    public Dept(Integer id, String dname, String loc) {
        this.id = id;
        this.dname = dname;
        this.loc = loc;
    }

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getDname() {
        return dname;
    }

    public void setDname(String dname) {
        this.dname = dname;
    }

    public String getLoc() {
        return loc;
    }

    public void setLoc(String loc) {
        this.loc = loc;
    }

    @Override
    public String toString() {
        return "Dept{" +
                "id=" + id +
                ", dname='" + dname + '\'' +
                ", loc='" + loc + '\'' +
                '}';
    }
}
DeptDao接口:
public interface DeptDao {
    List<Dept> findAll();
    Dept findById(Integer id);
    boolean addDept(Dept dept);
    boolean updateDept(Integer id,String loc);
    boolean delDept(Integer id);
}
DeptDaoImpl实现类:
public class DeptDaoImpl extends BaseDao implements DeptDao {
    @Override
    public List<Dept> findAll() {
        String sql = "select * from dept";
        return queryAll(Dept.class,sql);
    }

    @Override
    public Dept findById(Integer id) {
       String sql = "select *from dept where id = ? ";
       return queryAll(Dept.class,sql,id).get(0);
    }

    @Override
    public boolean addDept(Dept dept) {
        String sql = "insert into dept values(?,?,?)";
        Object[] objs = {dept.getId(),dept.getDname(),dept.getLoc()};
        return update(sql,objs);
    }

    @Override
    public boolean updateDept(Integer id, String loc) {
        String sql = "update dept set loc = ? where id = ?";
        return update(sql,loc,id);
    }

    @Override
    public boolean delDept(Integer id) {
        String sql = "delete from dept where id = ?";
        return update(sql,id);
    }
}
TestDeptDao单元测试:
public class TestDeptDao {
    DeptDao deptDao = new DeptDaoImpl();
    @Test
    public void testFind(){
        List<Dept> list = deptDao.findAll();
        System.out.println(list);
    }
    @Test
    public void testFindByID(){
        Dept dept = deptDao.findById(10);
        System.out.println(dept);
    }

    @Test
    public void testAdd(){
        Dept dept = new Dept(60,"研发部","杭州");
        boolean b = deptDao.addDept(dept);
        System.out.println(b);
    }

    @Test
    public void testUpdete(){
        boolean b = deptDao.updateDept(60,"武汉");
        System.out.println(b);
    }

    @Test
    public void testDelete(){
        boolean b = deptDao.delDept(60);
        System.out.println(b);
    }
}
DruidUitls连接池工具类:
public class DruidUtils {

    private static DataSource dataSource;

    // 初始化连接池
    static {
        try {
            Properties props = new Properties();
            props.load(DruidUtils.class.getClassLoader().getResourceAsStream("druid.properties"));
            // 获取连接池对象
            dataSource = DruidDataSourceFactory.createDataSource(props);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    /**
     * 获取连接
     * @return
     */
    public static Connection getConnection(){
        Connection conn = null;
        try {
            conn = dataSource.getConnection();
        } catch (SQLException throwables) {
            throwables.printStackTrace();
        }
        return conn;
    }

    /**
     * 获取预编译的sql执行对象
     * @param conn
     * @param sql
     * @return
     */
    public static PreparedStatement getPreparedStatement(Connection conn, String sql){
        PreparedStatement pstat = null;
        try {
            pstat = conn.prepareStatement(sql);
        } catch (SQLException throwables) {
            throwables.printStackTrace();
        }
        return pstat;
    }

    /**
     * 给sql的占位符赋值
     * @param pstat 预编译的sql执行对象
     * @param params 赋的值
     */
    public static void bindParam(PreparedStatement pstat,Object... params){
        // 可变参数本质就是一个数组
        // ?,?,?
        // [1001,张三,sdfa]
        // params[0],params[1],params[2]
        for (int i = 1; i <= params.length; i++) {
            // setObject(int parameterIndex, Object x)
            try {
                pstat.setObject(i, params[i-1]);
            } catch (SQLException throwables) {
                throwables.printStackTrace();
            }
        }
    }

    /**
     * 释放资源
     * @param rs
     * @param stat
     * @param conn
     */
    public static void close(ResultSet rs, Statement stat, Connection conn){
        try {
            if (rs != null) {
                rs.close();
            }
            if (stat != null) {
                stat.close();
            }
            if (conn != null) {
                conn.close();
            }
        } catch (SQLException throwables) {
            throwables.printStackTrace();
        }
    }
}
DeptView窗口类:
public class DeptView {
    Scanner sc = new Scanner(System.in);
    DeptDao deptDao = new DeptDaoImpl();

    /**
     * 展示操作菜单
     */
    public void showDeptMenu(){

        while (true){
            System.out.println("********************************");
            System.out.println("********** 部门信息操作 **********");
            System.out.println("********************************");
            System.out.println("1.添加部门");
            System.out.println("2.查询所有部门");
            System.out.println("3.根据编号查询部门");
            System.out.println("4.修改部门地址");
            System.out.println("5.删除部门");
            System.out.println("6.退出");
            System.out.println("请输入对应的数字进行操作:");

            int num = sc.nextInt();
            switch (num){
                case 1:
                    addDept();
                    break;
                case 2:
                    findAll();
                    break;
                case 3:
                    findById();
                    break;
                case 4:
                    updateDept();
                    break;
                case 5:
                    delDept();
                    break;
                case 6:
                    MainView mainView = new MainView();
                    mainView.main();
                    return;
                default:
                    System.out.println("输入有误,请重新输入");
                    break;
            }
        }
    }

    private void addDept() {
        System.out.println("请输入部门编号:");
        int id = sc.nextInt();
        System.out.println("请输入部门名称:");
        String dname = sc.next();
        System.out.println("请输入部门地址:");
        String loc = sc.next();
        Dept dept = new Dept(id, dname, loc);
        if (deptDao.addDept(dept)) {
            System.out.println("添加成功");
        } else {
            System.out.println("添加失败");
        }

    }

    private void findAll() {
        List<Dept> list = deptDao.findAll();
        for (Dept dept : list) {
            System.out.println(dept);
        }
    }

    private void findById() {
        System.out.println("请输入部门编号:");
        int id = sc.nextInt();
        Dept dept = deptDao.findById(id);
        System.out.println(dept);
    }

    private void updateDept() {
        System.out.println("请输入部门编号:");
        int id = sc.nextInt();
        System.out.println("请输入部门地址:");
        String loc = sc.next();
        if (deptDao.updateDept(id,loc)) {
            System.out.println("修改成功");
        } else {
            System.out.println("修改失败");
        }
    }

    private void delDept() {
        System.out.println("请输入部门编号:");
        int id = sc.nextInt();
        if (deptDao.delDept(id)) {
            System.out.println("删除成功");
        } else {
            System.out.println("删除失败");
        }
    }
}

TestDeptView测试窗口
public class TestDeptView {
    public static void main(String[] args) {
        DeptView view = new DeptView();
        view.showDeptMenu();
    }
}
MainView主程序入口
public class MainView {
    public static void main(String[] args) {

        Scanner sc = new Scanner(System.in);

        /**
         * 主菜单
         */

        while (true){
            System.out.println("********************************");
            System.out.println("******* 欢迎使用员工管理系统 *******");
            System.out.println("********************************");
            System.out.println("1.员工信息操作");
            System.out.println("2.职位信息操作");
            System.out.println("3.部门信息操作");
            System.out.println("4.工资等级信息操作");
            System.out.println("5.退出");
            System.out.println("请输入对应的数字进行操作:");

            int num = sc.nextInt();
            switch (num){
                case 1:
                    EmpView empView = new EmpView();
                    empView.showEmpMenu();
                    break;
                case 2:
                    JobView jobView = new JobView();
                    jobView.showJobMenu();
                    break;
                case 3:
                    DeptView deptView = new DeptView();
                    deptView.showDeptMenu();
                    break;
                case 4:
                    SalarygradeView salarygradeView =new SalarygradeView();
                    salarygradeView.showSalarygradeMenu();
                    break;

                case 5:
                    System.out.println("谢谢使用,bye~");
                    System.exit(0);
                    break;
                default:
                    System.out.println("输入有误,请重新输入");
                    break;
            }
        }

    }



    public void main() {
        return;
    }
}

druid.properties 配置文件:

文件命名druid.properties

driverClassName=com.mysql.jdbc.Driver
url=jdbc:mysql://127.0.0.1:3306/自己的数据库名?useSSL=false
username=root
password=123456
# 初始化连接数
initialSize=5
# 最大连接数
maxActive=10
# 超时时间
maxWait=3000

注意:数据库要改为自己的数据库名Mysql的用户名username和密码password也要改为自己的。

4.项目测试

启动项目

在这里插入图片描述

测试部门信息操作

在这里插入图片描述

添加部门

在这里插入图片描述

查询所有部门

在这里插入图片描述

根据编号查询部门

在这里插入图片描述

修改部门地址

在这里插入图片描述

删除部门

在这里插入图片描述

退出,返回主界面

在这里插入图片描述
该部分测试只测试部门,其他部分基本相同,都是增删改查操作。

5.总结

项目到这里就暂时告一段落了,由于没有界面,在控制台操作,所以比较简陋,项目功能基本都实现了,后续还要对该项目继续优化,增加登录注册,及界面部分,使其项目更加完善,提高用户体验。

  • 4
    点赞
  • 32
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值