前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >JDBC小项目—员工管理系统

JDBC小项目—员工管理系统

作者头像
时间静止不是简史
发布2020-07-27 09:55:19
1.2K0
发布2020-07-27 09:55:19
举报
文章被收录于专栏:Java探索之路Java探索之路

此界面系统由Java代码编写,没有上升到软件层面,简单易学。 本项目使用的是Oracle数据库中的scott用户下emp表

项目结构截图:

在这里插入图片描述
在这里插入图片描述

项目结果截图:

在这里插入图片描述
在这里插入图片描述

具体步骤:

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

代码语言:javascript
复制
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、编写配置文件:

代码语言:javascript
复制
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、实现序列化接口
代码语言:javascript
复制
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

设置操作员工的抽象方法

代码语言:javascript
复制
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操作的方法->进行准确封装

代码语言:javascript
复制
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所设置的功能

代码语言:javascript
复制
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、主体类

绘制主窗体

在这里插入图片描述
在这里插入图片描述
代码语言:javascript
复制
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、测试类

运行该项目,是该项目的入口

代码语言:javascript
复制
package cn.bjsxt.test;

import cn.bjsxt.view.MenuView;

public class testEmp {
	public static void main(String[] args) {
		MenuView mv=new MenuView();
		mv.showMenu();
	}
}
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2019-03-10 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 项目结构截图:
  • 项目结果截图:
  • 具体步骤:
    • 1、使用上次已经次练习已经编程好的工具类DBUtil
      • 2、编写配置文件:
        • 3、编写实体类
          • 4、创建接口EmpDao
            • 5、创建BaseDao类
              • 6、接口的实现类EmpDaoImpl
                • 7、主体类
                领券
                问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档