专栏首页Java探索之路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();
	}
}

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 进行JDBC操作时,连接参数的配置(附DBUtil工具类)

    时间静止不是简史
  • Spring全家桶之SpringData——Spring Data JPA

    举例: @JoinTable(name=“t_roles_menus”,joinColumns=@JoinColumn(name=“role_id”),inv...

    时间静止不是简史
  • ORA-00933: SQL 命令未正确结束

    时间静止不是简史
  • 浅谈JS中的装饰器模式

    装饰器(Decorator)是ES7中的一个新语法,使用可参考阮一峰的文章。正如其字面意思而言,它可以对类、方法、属性进行修饰,从而进行一些相关功能定制。它的写...

    IMWeb前端团队
  • Java 利用poi把数据库中数据导入Excel

    使用时先把poi包导入工程的path,注意只需要导入poi包即可,下载后有三个jar包

    Hongten
  • jdbc基础 (二) 通过properties配置文件连接数据库

    上一篇描述了对mysql数据库的简单操作,下面来看一下开发中应该如何灵活应用。 因为jdbc对数据库的驱动加载、连接获取、释放资源的代码都是相同的,为了提高代码...

    欠扁的小篮子
  • C++版 - 剑指offer 面试题39:判断平衡二叉树(LeetCode 110. Balanced Binary Tree) 题解

    提交网址:  http://www.nowcoder.com/practice/8b3b95850edb4115918ecebdf1b4d222?tpId=13...

    Enjoy233
  • kubernetes1.9安装dashboard

    dashboard的安装非常简单。但按照官网建议的方式安装完成后,输入token登录时会没有反应。 这个问题困扰了我一整天,最终在这里找到了答案。

    我的小碗汤
  • 自媒体作者评奖活动(12月)&11月获奖名单

    为鼓励参与腾讯云自媒体分享计划的作者产出更多优质内容,为自媒体计划注入更多的新鲜力量。云+社区将试运行自媒体作者月度评奖活动(以下简称活动)。

    腾讯云自媒体分享计划
  • 自媒体作者评奖活动再度开启!(5月)

    为鼓励参与腾讯云自媒体分享计划的作者产出更多优质内容,为自媒体计划注入更多的新鲜力量。云+社区将试运行自媒体作者月度评奖活动(以下简称活动)。

    云加社区

扫码关注云+社区

领取腾讯云代金券