概述
前言
该项目是基于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.总结
项目到这里就暂时告一段落了,由于没有界面,在控制台操作,所以比较简陋,项目功能基本都实现了,后续还要对该项目继续优化,增加登录注册,及界面部分,使其项目更加完善,提高用户体验。
最后
以上就是时尚猫咪为你收集整理的Jdbc小项目:员工工管理系统前言的全部内容,希望文章能够帮你解决Jdbc小项目:员工工管理系统前言所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复