此界面系统由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、实现序列化接口
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类
代码语言:javascript复制执行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
代码语言:javascript复制实现接口所定义的功能并继承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、主体类
代码语言: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();
}
}