实现商品库存的显示,增加,删除,修改,查找。
设计思想:简易版mvc三层架构,系统太小了,就没有做前端。
首先数据库
CREATE TABLE IF NOT EXISTS goods(
`id` INT(4) NOT NULL UNIQUE AUTO_INCREMENT,
`gname` VARCHAR(20) NOT NULL UNIQUE ,
`price` INT(4) NOT NULL ,
`num` INT(10) NOT NULL ,
`money` INT(10) NOT NULL ,
`pname` VARCHAR(20) NOT NULL ,
`data` DATETIME NOT NULL ,
PRIMARY KEY(`id`)
)ENGINE=INNODB DEFAULT CHARSET=utf8
M层:
值对象模型pojo
package 商品进货系统.pojo;
import java.util.Date;
public class Good {
private int id;
private String gname;
private double price;
private int num;
private double money;
private String pname;
private Date date;
public Good() {
}
public Good(int id, String gname, double price, int num, double money, String pname, Date date) {
this.id = id;
this.gname = gname;
this.price = price;
this.num = num;
this.money = money;
this.pname = pname;
this.date = date;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getGname() {
return gname;
}
public void setGname(String gname) {
this.gname = gname;
}
public double getPrice() {
return price;
}
public void setPrice(int price) {
this.price = price;
}
public int getNum() {
return num;
}
public void setNum(int num) {
this.num = num;
}
public double getMoney() {
return money;
}
public void setMoney(int money) {
this.money = money;
}
public String getPname() {
return pname;
}
public void setPname(String pname) {
this.pname = pname;
}
public Date getDate() {
return date;
}
public void setDate(Date date) {
this.date = date;
}
@Override
public String toString() {
return
id +
"\t\t" + gname +
"\t" + price +
"\t" + num +
"\t\t" + money +
"\t" + pname +
"\t\t" + date;
}
}
数据访问模型DAO
接口GoodDAO
package 商品进货系统.dao;
import 商品进货系统.pojo.Good;
import java.util.List;
public interface GoodDAO {
List<Good> getGoodList();
boolean addGood(Good good);
void delGood(Integer id);
void editGood(Good good,Integer id);
List<Good> getGoodList(String keyword);
Good getGoodById(Integer id);
}实现GoodDaoImpl
package 商品进货系统.dao.impl;
import myssm.basedao.BaseDAO;
import 商品进货系统.dao.GoodDAO;
import 商品进货系统.pojo.Good;
import java.util.List;
public class GoodDaoImpl extends BaseDAO<Good> implements GoodDAO {
@Override
public List<Good> getGoodList() {
return super.executeQuery("select * from goods");
}
@Override
public boolean addGood(Good good) {
String sql="insert into goods values(0,?,?,?,?,?,?)";
int count=super.executeUpdate(sql,good.getGname(),good.getPrice(),good.getNum(),good.getMoney(),good.getPname(),good.getDate());
return count>0;
}
@Override
public void delGood(Integer id) {
super.executeUpdate("delete from goods where id=?",id);
}
@Override
public void editGood(Good good,Integer id) {
String sql="update goods set gname=?,price=?,num=?,money=?,pname=?,date=? where id=?";
super.executeUpdate(sql,good.getGname(),good.getPrice(),good.getNum(),good.getMoney(),good.getPname(),good.getDate(),good.getId());
}
@Override
public List<Good> getGoodList(String keyword) {
return super.executeQuery("select * from goods where id like ? or gname like ? or price like ?or num like ?or money like ? or pname like ? or date like ?","%" + keyword + "%","%" + keyword + "%","%" + keyword + "%","%" + keyword + "%","%" + keyword + "%","%" + keyword + "%","%" + keyword + "%");
}
@Override
public Good getGoodById(Integer id) {
return super.load("select * from goods where id=?", id);
}
}V层
由于没有前端,视图层名存实亡了,放个main函数在这里吧,虽然感觉怪怪的。
package 商品进货系统.View;
import 商品进货系统.controllers.GoodController;
public class Menu {
public static void main(String[] args) {
GoodController controller = new GoodController();
controller.Menu();
}
}
C层
package 商品进货系统.controllers;
import 商品进货系统.dao.GoodDAO;
import 商品进货系统.dao.impl.GoodDaoImpl;
import 商品进货系统.pojo.Good;
import 工具类.MyMethod;
import java.util.Date;
import java.util.List;
public class GoodController {
private GoodDAO goodDAO = new GoodDaoImpl();
MyMethod method = new MyMethod();
public void Menu() {
method.myMenu(this, "===商品进货系统===", "a:显示商品库存", "b:增加商品", "c:删除商品", "d:查找商品", "e:修改商品", "f:退出");
}
public void a() {
List<Good> goodList = goodDAO.getGoodList();
System.out.println("编号\t\t名字\t\t价格\t\t数量\t\t总价\t\t联系人\t\t日期");
for (Good good : goodList) {
System.out.println(good);
}
}
public void b() {
System.out.println("请输入商品名字");
String gname = MyMethod.getString();
System.out.println("请输入商品单价");
double price = MyMethod.getDouble();
System.out.println("请输入商品数量");
int num = MyMethod.getNum();
double money = price * num;
System.out.println("请输入商品联系人");
String pname = MyMethod.getString();
Date date = new Date();
boolean flag = goodDAO.addGood(new Good(0, gname, price, num, money, pname, date));
if (flag)
System.out.println("添加成功");
else
System.out.println("添加失败");
}
public void c() {
System.out.println("请输入要删除商品的编号");
int id = MyMethod.getNum();
MyMethod.getChoice();
goodDAO.delGood(id);
System.out.println("删除成功");
}
public void d(){
System.out.println("请输入关键词");
String keyword=MyMethod.getString();
List<Good> goodList=goodDAO.getGoodList(keyword);
for (Good good :goodList) {
System.out.println(good);
}
System.out.println("查找完毕");
}
public void e(){
System.out.println("请输入商品编号");
int id = MyMethod.getNum();
System.out.println("请输入商品名字");
String gname = MyMethod.getString();
System.out.println("请输入商品单价");
double price = MyMethod.getDouble();
System.out.println("请输入商品数量");
int num = MyMethod.getNum();
double money = price * num;
System.out.println("请输入商品联系人");
String pname = MyMethod.getString();
Date date = new Date();
Good good=goodDAO.getGoodById(id);
goodDAO.editGood(new Good(id,gname,price,num,money,pname,date),id);
}
public void f(){
System.out.println("确定要退出吗?");
String s=MyMethod.getChoice();
if (s.equals("Y"))
System.exit(0);
else
System.out.println("回到系统");
}
}
使用到的工具类
MyMethod(自制)
package 工具类;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.Scanner;
public class MyMethod {
static Scanner scanner = new Scanner(System.in);
//菜单方法
public void myMenu(Object obj, String... a) {
// obj是反射用的,a是想要打印的菜单
do {
System.out.println();//单纯空个行
for (Object o : a) {
System.out.println(o);
}
System.out.println("请输入你的选择:");
String key = getString();
Method[] methods = obj.getClass().getDeclaredMethods();//获取方法名字
for (Method method : methods) {
//遍历方法
String name = method.getName();
if (key.equals(name)) {
//根据输入来匹配方法名字
try {
method.invoke(obj);//反射调用方法
} catch (IllegalAccessException | InvocationTargetException e) {
e.printStackTrace();
}
}
}
} while (true);
}
//接收正数
public static double getDouble() {
double a;
while (true) {
try {
a = scanner.nextDouble();
if (a < 0) throw new RuntimeException();
else break;
} catch (Exception e) {
System.out.print(scanner.nextLine() + " 不是合法的数,请重新输入:");
}
}
return a;
}
//接收正整数
public static int getNum() {
int a;
while (true) {
try {
a = scanner.nextInt();
MyMethod.getString();
if (a < 0) throw new RuntimeException();
else break;
} catch (Exception e) {
System.out.print(scanner.nextLine() + " 不是合法的数,请重新输入:");
}
}
return a;
}
//常规接收
public static String getString() {
return scanner.nextLine();
}
//接收选择
public static String getChoice() {
System.out.println("请输入你的选择 Y or N");
String a;
while (true) {
a = scanner.nextLine();
if (a.equals("Y") || a.equals("N")) {
break;
} else {
System.out.print("输入错误,请重新输入:");
}
}
return a;
}
}
BaseDAO(会用但暂时不是很懂)
package myssm.basedao;
import java.lang.reflect.Field;
import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;
import java.sql.*;
import java.util.ArrayList;
import java.util.List;
public abstract class BaseDAO<T> {
public final String DRIVER = "com.mysql.jdbc.Driver" ;
public final String URL = "jdbc:mysql://localhost:3306/homework?useUnicode=true&characterEncoding=utf-8&useSSL=false";
public final String USER = "root";
public final String PWD = "123456" ;
protected Connection conn ;
protected PreparedStatement psmt ;
protected ResultSet rs ;
//T的Class对象
private Class entityClass ;
public BaseDAO(){
//getClass() 获取Class对象,当前我们执行的是new FruitDAOImpl() , 创建的是FruitDAOImpl的实例
//那么子类构造方法内部首先会调用父类(BaseDAO)的无参构造方法
//因此此处的getClass()会被执行,但是getClass获取的是FruitDAOImpl的Class
//所以getGenericSuperclass()获取到的是BaseDAO的Class
Type genericType = getClass().getGenericSuperclass();
//ParameterizedType 参数化类型
Type[] actualTypeArguments = ((ParameterizedType) genericType).getActualTypeArguments();
//获取到的<T>中的T的真实的类型
Type actualType = actualTypeArguments[0];
try {
entityClass = Class.forName(actualType.getTypeName());
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
protected Connection getConn(){
try {
//1.加载驱动
Class.forName(DRIVER);
//2.通过驱动管理器获取连接对象
return DriverManager.getConnection(URL, USER, PWD);
} catch (ClassNotFoundException | SQLException e) {
e.printStackTrace();
}
return null ;
}
protected void close(ResultSet rs , PreparedStatement psmt , Connection conn){
try {
if (rs != null) {
rs.close();
}
if(psmt!=null){
psmt.close();
}
if(conn!=null && !conn.isClosed()){
conn.close();
}
} catch (SQLException e) {
e.printStackTrace();
}
}
//给预处理命令对象设置参数
private void setParams(PreparedStatement psmt , Object... params) throws SQLException {
if(params!=null && params.length>0){
for (int i = 0; i < params.length; i++) {
psmt.setObject(i+1,params[i]);
}
}
}
//执行更新,返回影响行数
protected int executeUpdate(String sql , Object... params){
boolean insertFlag = false ;
insertFlag = sql.trim().toUpperCase().startsWith("INSERT");
try {
conn = getConn();
if(insertFlag){
psmt = conn.prepareStatement(sql,Statement.RETURN_GENERATED_KEYS);
}else {
psmt = conn.prepareStatement(sql);
}
setParams(psmt,params);
int count = psmt.executeUpdate() ;
if(insertFlag){
rs = psmt.getGeneratedKeys();
if(rs.next()){
return ((Long)rs.getLong(1)).intValue();
}
}
return count ;
} catch (SQLException e) {
e.printStackTrace();
}finally {
close(rs,psmt,conn);
}
return 0;
}
//通过反射技术给obj对象的property属性赋propertyValue值
private void setValue(Object obj , String property , Object propertyValue){
Class clazz = obj.getClass();
try {
//获取property这个字符串对应的属性名 , 比如 "fid" 去找 obj对象中的 fid 属性
Field field = clazz.getDeclaredField(property);
if(field!=null){
field.setAccessible(true);
field.set(obj,propertyValue);
}
} catch (NoSuchFieldException | IllegalAccessException e) {
e.printStackTrace();
}
}
//执行复杂查询,返回例如统计结果
protected Object[] executeComplexQuery(String sql , Object... params){
try {
conn = getConn() ;
psmt = conn.prepareStatement(sql);
setParams(psmt,params);
rs = psmt.executeQuery();
//通过rs可以获取结果集的元数据
//元数据:描述结果集数据的数据 , 简单讲,就是这个结果集有哪些列,什么类型等等
ResultSetMetaData rsmd = rs.getMetaData();
//获取结果集的列数
int columnCount = rsmd.getColumnCount();
Object[] columnValueArr = new Object[columnCount];
//6.解析rs
if(rs.next()){
for(int i = 0 ; i<columnCount;i++){
Object columnValue = rs.getObject(i+1); //33 苹果 5
columnValueArr[i]=columnValue;
}
return columnValueArr ;
}
} catch (SQLException e) {
e.printStackTrace();
} finally {
close(rs,psmt,conn);
}
return null ;
}
//执行查询,返回单个实体对象
protected T load(String sql , Object... params){
try {
conn = getConn() ;
psmt = conn.prepareStatement(sql);
setParams(psmt,params);
rs = psmt.executeQuery();
//通过rs可以获取结果集的元数据
//元数据:描述结果集数据的数据 , 简单讲,就是这个结果集有哪些列,什么类型等等
ResultSetMetaData rsmd = rs.getMetaData();
//获取结果集的列数
int columnCount = rsmd.getColumnCount();
//6.解析rs
if(rs.next()){
T entity = (T)entityClass.newInstance();
for(int i = 0 ; i<columnCount;i++){
String columnName = rsmd.getColumnName(i+1); //fid fname price
Object columnValue = rs.getObject(i+1); //33 苹果 5
setValue(entity,columnName,columnValue);
}
return entity ;
}
} catch (SQLException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InstantiationException e) {
e.printStackTrace();
} finally {
close(rs,psmt,conn);
}
return null ;
}
//执行查询,返回List
protected List<T> executeQuery(String sql , Object... params){
List<T> list = new ArrayList<>();
try {
conn = getConn() ;
psmt = conn.prepareStatement(sql);
setParams(psmt,params);
rs = psmt.executeQuery();
//通过rs可以获取结果集的元数据
//元数据:描述结果集数据的数据 , 简单讲,就是这个结果集有哪些列,什么类型等等
ResultSetMetaData rsmd = rs.getMetaData();
//获取结果集的列数
int columnCount = rsmd.getColumnCount();
//6.解析rs
while(rs.next()){
T entity = (T)entityClass.newInstance();
for(int i = 0 ; i<columnCount;i++){
String columnName = rsmd.getColumnName(i+1); //fid fname price
Object columnValue = rs.getObject(i+1); //33 苹果 5
setValue(entity,columnName,columnValue);
}
list.add(entity);
}
} catch (SQLException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InstantiationException e) {
e.printStackTrace();
} finally {
close(rs,psmt,conn);
}
return list ;
}
}