JDBC(三) 员工管理系统的实现

简介: 基于JDBC实现员工管理(附上源码)
此界面系统由Java代码编写,没有上升到软件层面,简单易学。
本项目使用的是Oracle数据库中的scott用户下emp表

项目结构截图:

在这里插入图片描述

项目结果截图:

在这里插入图片描述

具体步骤:

1、使用上次已经次练习已经编程好的工具类DBUtil

package cn.bjsxt.util;

import java.io.IOException;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Properties;


/**
 * 软编码,将配置信息生成一个配置文件,然后让程序在执行过程中,读取配置信息
 * 好处:可以动态调整配置信息,有助于后续代码的维护
 *
 *Java中,提供了一个类,叫Properties类,用于读取properties文件
 */
public class DBUtil {
    private static  String url;
    private static  String user;
    private static  String password;
    private static  String driver;
    
    static {
        try {
            //创建Properties对象
            Properties prop=new Properties();
            //加载配置文件
            prop.load(DBUtil.class.getClassLoader().getResourceAsStream("db.properties"));
            //读取信息并进行初始化,trim()的作用是取出字符串两端多余的字符或者是其他预定义字符
            driver=prop.getProperty("jdbc.driver").trim();
            url=prop.getProperty("jdbc.url").trim();
            user=prop.getProperty("jdbc.user").trim();
            password=prop.getProperty("jdbc.password").trim();
            
            
            //注册驱动
            Class.forName(driver);
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    
    /**
     * 获取数据库连接
     * @return
     */
    public static Connection getConn() {
        Connection conn=null;
        try {
            conn=DriverManager.getConnection(url,user,password);
        } catch (SQLException e) {
            System.out.println(
                    "DBUtil.getConn(连接创建失败, 请检查[url]:" + url + ", [user]:" + user + ", [password]:" + password + ")");
        }
        return conn;
    }
    
    /**
     * 获取sql发送器
     * @param conn
     * @return
     */
    public static Statement     getStmt(Connection conn) {
        Statement stmt=null;
        try {
            stmt=conn.createStatement();
        } catch (SQLException e) {
            e.printStackTrace();
        }
        return stmt;
    }
    
    /**
     * 获取预处理发送器
     * @param conn
     * @param sql
     * @return
     */
    public static PreparedStatement getPstmt(Connection conn,String sql) {
        PreparedStatement pstmt=null;
        try {
            pstmt=conn.prepareStatement(sql);
        } catch (SQLException e) {
            e.printStackTrace();
        }
        return pstmt;
    }
    
    /**
     * 动态绑定参数,如果sql语句中有问号就使用,且按顺序匹配
     * @param pstmt
     * @param params
     */
    public static void bindParam(PreparedStatement pstmt,Object...params) {
        //...可变参数,可以被认为是一个数组
        try {
            for (int i = 1; i <= params.length; i++) {
                pstmt.setObject(i, params[i-1]);
            }
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }
    
    /**
     * 执行修改操作pstmt.executeUpdate(),rs为null
     * 执行查询操作pstmt.executeQuery(),rs才出现
     * @param rs
     * @param stmt
     * @param conn
     */
    public static void close(ResultSet rs,Statement stmt,Connection conn) {
        if (rs!=null) {
            try {
                rs.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
        if (stmt!=null) {
            try {
                stmt.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }if (conn!=null) {
            try {
                conn.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
    }

}

2、编写配置文件:

jdbc.driver=oracle.jdbc.OracleDriver
jdbc.url=jdbc:oracle:thin:@localhost:1521:orcl
jdbc.user=scott
jdbc.password=tiger

3、编写实体类

实体类的特征

  • 1、私有化成员变量
  • 2、公开的getter和setter
  • 3、至少提供一个无参构造器
  • 4、重写hashcode的equals方法
  • 5、重新toString方法
  • 6、实现序列化接口
package cn.bjsxt.pojo;

import java.io.Serializable;
import java.sql.Date;

/**
 *    实体类
 * @author chy
 *
 */
public class Emp implements Serializable{//一个实体类在网络中传播需要实现序列化接口
    private int empno;
    private String ename;
    private String job;
    private int mgr;
    private Date hiredate;
    private double sal;
    private double comm;
    private int deptno;
    
    //alt+shift+s 调出窗口;r;alt+a 全选
    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 int getMgr() {
        return mgr;
    }
    public void setMgr(int mgr) {
        this.mgr = mgr;
    }
    public Date getHiredate() {
        return hiredate;
    }
    public void setHiredate(Date hiredate) {
        this.hiredate = hiredate;
    }
    public double getSal() {
        return sal;
    }
    public void setSal(double sal) {
        this.sal = sal;
    }

    public double getComm() {
        return comm;
    }
    public void setComm(double comm) {
        this.comm = comm;
    }
    public int getDeptno() {
        return deptno;
    }
    public void setDeptno(int deptno) {
        this.deptno = deptno;
    }
    
    
    //hashcode()和equals的作用是方便比较
    public int hashCode() {
        final int prime = 31;
        int result = 1;
        long temp;
        temp = Double.doubleToLongBits(comm);
        result = prime * result + (int) (temp ^ (temp >>> 32));
        result = prime * result + deptno;
        result = prime * result + empno;
        result = prime * result + ((ename == null) ? 0 : ename.hashCode());
        result = prime * result + ((hiredate == null) ? 0 : hiredate.hashCode());
        result = prime * result + ((job == null) ? 0 : job.hashCode());
        result = prime * result + mgr;
        temp = Double.doubleToLongBits(sal);
        result = prime * result + (int) (temp ^ (temp >>> 32));
        return result;
    }
    @Override
    public boolean equals(Object obj) {
        if (this == obj)
            return true;
        if (obj == null)
            return false;
        if (getClass() != obj.getClass())
            return false;
        Emp other = (Emp) obj;
        if (Double.doubleToLongBits(comm) != Double.doubleToLongBits(other.comm))
            return false;
        if (deptno != other.deptno)
            return false;
        if (empno != other.empno)
            return false;
        if (ename == null) {
            if (other.ename != null)
                return false;
        } else if (!ename.equals(other.ename))
            return false;
        if (hiredate == null) {
            if (other.hiredate != null)
                return false;
        } else if (!hiredate.equals(other.hiredate))
            return false;
        if (job == null) {
            if (other.job != null)
                return false;
        } else if (!job.equals(other.job))
            return false;
        if (mgr != other.mgr)
            return false;
        if (Double.doubleToLongBits(sal) != Double.doubleToLongBits(other.sal))
            return false;
        return true;
    }
    public Emp(int empno, String ename, String job, int mgr, Date hiredate, double sal, double conn, int deptno) {
        super();
        this.empno = empno;
        this.ename = ename;
        this.job = job;
        this.mgr = mgr;
        this.hiredate = hiredate;
        this.sal = sal;
        this.comm = conn;
        this.deptno = deptno;
    }
    
    //反射里面不通过new创建对象,大部分使用的是无参构造器
    public Emp() {
        super();
    }
    
    public String toString() {
        return "EmpDao [empno=" + empno + ", ename=" + ename + ", job=" + job + ", mgr=" + mgr + ", hiredate=" + hiredate
                + ", sal=" + sal + ", conn=" + comm + ", deptno=" + deptno + "]";
    }
    
    
    
    
    
}

4、创建接口EmpDao

设置操作员工的抽象方法
package cn.bjsxt.dao;


import java.util.List;
import cn.bjsxt.pojo.Emp;
/**
 * 专门用来操作emp的接口
 * @author chy
 *
 */
public interface EmpDao {
    
    /**
     * 查询所有员工信息(select all)
     * @return
     */
    List<Emp> selALL();//通过List集合来存储emp类型的数据
    
    /**
     * 根据员工编号查询员工信息(select by empno)
     * @param empno
     * @return
     */
    Emp selByEmpno(int empno);
    
    /**
     * 新增员工信息(insert)
     * @param emp
     * @return
     */
    boolean insEmp(Emp emp);
    
    /**
     * 根据编号修改工资(update sal by empno)
     * @param empno
     * @param sal
     * @return
     */
    boolean upsalByEmpno(int empno,double sal);
    
    /**
     * 根据编号删除员工
     * @param empno
     * @return
     */
    boolean delEmp(int empno);
}

5、创建BaseDao类

执行DML操作的方法->进行准确封装
package cn.bjsxt.dao;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

import javax.management.Query;

import org.apache.commons.beanutils.BeanUtils;

import cn.bjsxt.util.DBUtil;

public class BaseDao {
    
    /**
     * @param sql
     * @param params
     * @return
     */
    protected boolean update(String sql,Object...params) {
        //protected保证同一个包以及子类能够访问
        Connection conn=DBUtil.getConn();
        PreparedStatement pstmt=DBUtil.getPstmt(conn, sql);
        DBUtil.bindParam(pstmt, params);
        
        try {
            int num=pstmt.executeUpdate();
            if (num>0) {
                return true;
            }
        } catch (SQLException e) {
            e.printStackTrace();
        }finally {
            DBUtil.close(null, pstmt, conn);
        }
        
        return false;
        
    }
    
    /**
     * 返回List集合的查询操作
     * @param cls
     * @param sql
     * @param Params
     * @return
     */
    protected <T>  List<T>QueryAll(Class<T>cls,String sql,Object...params){
        List<T>list=new ArrayList<>();
        
        Connection conn=DBUtil.getConn();
        PreparedStatement pstmt=DBUtil.getPstmt(conn, sql);
        DBUtil.bindParam(pstmt,params);
        ResultSet rs=null;
        try {//获取原始数据
            rs=pstmt.executeQuery();
            ResultSetMetaData metaData=rs.getMetaData();
            while (rs.next()) {
                T bean=cls.newInstance();//反射
                for (int i = 0; i < metaData.getColumnCount(); i++) {
                    BeanUtils.setProperty(bean, metaData.getColumnLabel(i+1).toLowerCase(), rs.getObject(i+1));
                }//toLowerCase()将查到的字母小写,因为从Oracle哪里所查询到的结果是大写的
                list.add(bean);
            }
        } catch (Exception e) {
            e.printStackTrace();
        }finally {
            DBUtil.close(null, pstmt, conn);
        }
        return list;
    }
    
    /**
     * 返回一个对象的查询
     * @param cls
     * @param sql
     * @param params
     * @return
     */
    protected <T> T QueryOne(Class<T>cls,String sql,Object...params){
        
        Connection conn=DBUtil.getConn();
        PreparedStatement pstmt=DBUtil.getPstmt(conn, sql);
        DBUtil.bindParam(pstmt,params);
        ResultSet rs=null;
        try {//获取原始数据
            rs=pstmt.executeQuery();
            ResultSetMetaData metaData=rs.getMetaData();
            if (rs.next()) {
                T bean=cls.newInstance();//反射
                for (int i = 0; i < metaData.getColumnCount(); i++) {
                    BeanUtils.setProperty(bean, metaData.getColumnLabel(i+1).toLowerCase(), rs.getObject(i+1));
                }
                return bean;
            }
        } catch (Exception e) {
            e.printStackTrace();
        }finally {
            DBUtil.close(null, pstmt, conn);
        }
        return null;
    }
}

6、接口的实现类EmpDaoImpl

实现接口所定义的功能并继承BaseDao所设置的功能
package cn.bjsxt.dao;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

import cn.bjsxt.pojo.Emp;
import cn.bjsxt.util.DBUtil;

/**
 * 相比上版本而言封装查询语句
 * 
 * @author chy
 *
 */
public class EmpDaoImpl extends BaseDao implements EmpDao {

    @Override
    public List<Emp> selALL() {
        String sql = "select * from emp";
        return QueryAll(Emp.class, sql);
    }

    @Override
    public Emp selByEmpno(int empno) {
        String sql = "select * from emp where empno=?";

        return QueryAll(Emp.class, sql, empno).get(0);

    }

    @Override
    public boolean insEmp(Emp emp) {
        String sql = "insert into emp values (?, ?, ?, ?, sysdate, ?, ?, ?)";
        Object[] params = { emp.getEmpno(), emp.getEname(), emp.getJob(), emp.getMgr(), emp.getSal(), emp.getComm(),
                emp.getDeptno() };
        return update(sql, params);
    }

    @Override
    public boolean upsalByEmpno(int empno, double sal) {
        String sql = "update emp set sal=? where empno=?";
        return update(sql, sal, empno);
    }

    @Override
    public boolean delEmp(int empno) {

        return update("delete from emp where empno=?", empno);
    }

}

7、主体类

绘制主窗体
在这里插入图片描述
package cn.bjsxt.view;

import java.util.List;
import java.util.Scanner;

import cn.bjsxt.dao.EmpDao;
import cn.bjsxt.dao.EmpDaoImpl;
import cn.bjsxt.pojo.Emp;

public class MenuView {
    Scanner sc=new Scanner(System.in);
    EmpDao dao=new EmpDaoImpl();
    
    public void showMenu() {
        System.out.println("*************************************");
        System.out.println("************欢迎使用员工管理系统**********");
        System.out.println("*************************************");
        System.out.println("请输入对应数字进行操作");
        
        
        while (true) {
            System.out.println("1、添加员工");
            System.out.println("2、查询所有员工");
            System.out.println("3、根据编号查询员工");
            System.out.println("4、修改员工工资");
            System.out.println("5、删除员工");
            System.out.println("6、退出");
            int num=sc.nextInt();
            
            switch (num) {
            case 1:
                addEmp();
                continue;
            case 2:
                selAll();
                continue;
            case 3:
                selByEmpno();
                continue;
            case 4:
                updSal();
                break;
            case 5:
                delEmp();
                continue;
            case 6:
                System.out.println("谢谢使用,byebye~");
                break;//用于跳出switch循环

            default:
                System.out.println("输入有误,请从新输入");
                continue;
            }
            break;//用于跳出while循环
        }
    }

    private void delEmp() {
        System.out.println("请输入员工编号:");
        int empno=sc.nextInt();
        if (dao.delEmp(empno)) {
            System.out.println("删除成功");
        }else {
            System.out.println("删除失败");
        }
    }

    private void updSal() {
        System.out.println("请输入员工编号:");
        int empno=sc.nextInt();
        System.out.println("请输入薪资:");
        double sal=sc.nextDouble();
        if (dao.upsalByEmpno(empno, sal)) {
            System.out.println("修改成功");
        }else {
            System.out.println("修改失败");
        }
    }

    private void selByEmpno() {
        System.out.println("请输入员工编号");
        int empno=sc.nextInt();
        Emp emp=dao.selByEmpno(empno);
        //定义emp对象,方便打印
        System.out.println(emp);
    }

    private void selAll() {
        List<Emp>list=dao.selALL();
        for (Emp emp : list) {
            System.out.println(emp);
        }
    }

    private void addEmp() {
        System.out.println("请输入编号:");
        int empno=sc.nextInt();
        System.out.println("请输入姓名:");
        String ename=sc.next();
        System.out.println("请输入职位:");
        String job=sc.next();
        System.out.println("请输入领导编号");
        int mgr=sc.nextInt();
        System.out.println("请输入薪资:");
        double sal=sc.nextDouble();
        System.out.println("请输入提成:");
        double comm=sc.nextDouble();
        System.out.println("请输入部门编号:");
        int deptno=sc.nextInt();
    
        Emp emp = new Emp(empno, ename, job, mgr, null, sal, comm, deptno);
        if(dao.insEmp(emp)) {
            System.out.println("添加成功!");
        } else {
            System.out.println("添加失败!");
        }
        
    }
}

8、测试类

运行该项目,是该项目的入口
package cn.bjsxt.test;

import cn.bjsxt.view.MenuView;

public class testEmp {
    public static void main(String[] args) {
        MenuView mv=new MenuView();
        mv.showMenu();
    }
}
相关文章
|
12月前
|
Java 关系型数据库 MySQL
JSP在线小说系统用eclipse定制开发mysql数据库BS模式java编程jdbc
JSP 在线小说系统是一套完善的web设计系统,对理解JSP java SERLVET mvc编程开发语言有帮助,系统具有完整的源代码和数据库,系统主要采用B/S模式开发。开发环境为TOMCAT7.0,eclipse开发,数据库为Mysql5.0,使用java语言开发。
83 1
JSP在线小说系统用eclipse定制开发mysql数据库BS模式java编程jdbc
|
5月前
|
Java 数据库 数据安全/隐私保护
基于JavaSE+JDBC使用控制台操作的简易购物系统【源码+数据库】
基于JavaSE+JDBC使用控制台操作的简易购物系统【源码+数据库】
|
12月前
|
Java 关系型数据库 MySQL
JSP居民信息采集系统yeclipse开发mysql数据库bs框架java编程jdbc
JSP 居民信息采集系统是一套完善的web设计系统,对理解JSP java编程开发语言有帮助,系统具有完整的源代码和数据库,开发环境为TOMCAT7.0,Myeclipse8.5开发,数据库为Mysql5.0,使用java语,言开发系统主要采用B/S模式开发。
56 0
|
12月前
|
Java 关系型数据库 MySQL
java 网上二手车销售系统用eclipse定制开发mysql数据库BS模式java编程jdbc
JSP 网上二手车销售系统是一套完善的web设计系统,对理解JSP java SERLVET mvc编程开发语言有帮助,系统具有完整的源代码和数据库,系统主要采用B/S模式开发。开发环境为TOMCAT7.0,eclipse开发,数据库为Mysql5.0,使用java语言开发。
66 0
|
12月前
|
Java 关系型数据库 MySQL
JSP学生交流论坛系统myeclipse开发mysql数据库bs框架java编程jdbc
JSP 学生交流论坛系统是一套完善的web设计系统,对理解JSP java编程开发语言有帮助,系统具有完整的源代码和数据库,开发环境为TOMCAT7.0,Myeclipse8.5开发,数据库为Mysql5.0,使用java语,言开发系统主要采用B/S模式开发。 https://www.bilibili.com/video/BV1jB4y1q7Ut?spm_id_from=333.999.0.0
91 0
|
12月前
|
SQL Java 数据库连接
JSP网上相亲交友系统myeclipse开发sql数据库bs框架java编程jdbc
JSP 网上相亲交友系统是一套完善的web设计系统,对理解JSP java编程开发语言有帮助,系统具有完整的源代码和数据库,开发环境为TOMCAT7.0,Myeclipse8.5开发,数据库为sqlserver2008,使用java语言开发,系统主要采用B/S模式开发。
98 0
|
5月前
|
Java 关系型数据库 MySQL
基于JDBC的账务管理系统(一)
基于JDBC的账务管理系统
70 0
基于JDBC的账务管理系统(一)
|
5月前
|
机器学习/深度学习 算法 前端开发
基于JDBC的账务管理系统(三)
基于JDBC的账务管理系统
28 0
|
5月前
|
Java 数据库连接
基于JDBC的账务管理系统(二)
基于JDBC的账务管理系统
42 0
|
12月前
|
Java 关系型数据库 数据库
JSP网上手机商城系统 用eclipse定制开发mysql数据库BS模式java编程jdbc
JSP 网上手机商城系统是一套完善的web设计系统,对理解JSP java SERLVET mvc编程开发语言有帮助,系统具有完整的源代码和数据库,系统主要采用B/S模式开发。开发环境为TOMCAT7.0,eclipse开发,数据库为Mysql5.0,使用java语言开发。
119 1
JSP网上手机商城系统 用eclipse定制开发mysql数据库BS模式java编程jdbc