简易商品管理系统

  • 一、功能介绍
  • 二、开发背景
  • 三、项目结构
  • 四、file.properties
  • 五、DBUtils工具类
  • 六、GoodsView(用户界面)
  • 七、GoodsModel(业务模型)
  • 八、GoodsController(控制器)
  • 九、Good商品类
  • 十、数据库


一、功能介绍

1、程序运行时,首先显示所有的商品信息,然后提示操作菜单,运行效果图如下:

java数据源事务关闭_java数据源事务关闭

2、如果选择菜单A则可以根据用户输入的商品名称的关键字搜索商品,如果有符合条件的数据则显示对应的商品信息,没有符合条件的数据提示相应的信息,效果图如下:

java数据源事务关闭_java数据源事务关闭_02

3、如果选择菜单B则提示用户输入要添加的商品名称、商品类型、销售数量以及单价,注意此处需要做数据验证,商品的名称不能为空,商品的类型必须是数据库中已经存在的类型,销售数量大于等于0,价格必须大于0,如果用户输入的数据符合上述条件则可以进行添加,否则提示相应的错误信息,商品的编号自动生成,不需要用户输入,运行效果图如下:

java数据源事务关闭_SQL_03

4、如果选择菜单C,则根据用户输入的商品编号来删除商品,运行效果图如下:

java数据源事务关闭_sql_04

5、选择D则结束程序。

二、开发背景

  • 开发工具为mysql+IDEA。
  • 使用经典MVC模式。

M是指业务模型,V是指用户界面,C则是控制器,使用MVC的目的是将M和V的实现代码分离,从而使同一个程序可以使用不同的表现形式。
V即View视图是指用户看到并与之交互的界面。比如由html元素组成的网页界面,或者软件的客户端界面。MVC的好处之一在于它能为应用程序处理很多不同的视图。在视图中其实没有真正的处理发生,它只是作为一种输出数据并允许用户操纵的方式。
M即model模型是指模型表示业务规则。在MVC的三个部件中,模型拥有最多的处理任务。被模型返回的数据是中立的,模型与数据格式无关,这样一个模型能为多个视图提供数据,由于应用于模型的代码只需写一次就可以被多个视图重用,所以减少了代码的重复性。
C即controller控制器是指控制器接受用户的输入并调用模型和视图去完成用户的需求,控制器本身不输出任何东西和做任何处理。它只是接收请求并决定调用哪个模型构件去处理请求,然后再确定用哪个视图来显示返回的数据。

三、项目结构

java数据源事务关闭_sql_05


java数据源事务关闭_SQL_06

四、file.properties

DRIVER = com.mysql.jdbc.Driver
URL = jdbc:mysql://127.0.0.1:3306/test?useUnicode=true&characterEncoding=UTF-8
USER = root
PWD = root

五、DBUtils工具类

package goodsmanagesystem.utils;


import com.alibaba.druid.pool.DruidDataSource;
import org.apache.commons.dbutils.BasicRowProcessor;
import org.apache.commons.dbutils.GenerousBeanProcessor;
import org.apache.commons.dbutils.QueryRunner;
import org.apache.commons.dbutils.handlers.BeanHandler;
import org.apache.commons.dbutils.handlers.BeanListHandler;
import org.apache.commons.dbutils.handlers.MapHandler;
import org.apache.commons.dbutils.handlers.MapListHandler;

import java.io.File;
import java.io.FileInputStream;
import java.sql.SQLException;
import java.util.List;
import java.util.Map;
import java.util.Properties;

public class DBUtils {
	//	要连接的驱动类型
	private static String DRIVER = null;
	//要连接的URL
	private static String URL = null;
	//	要连接的数据库的用户名
	private static String USER = null;
	//	要连接的数据库的密码
	private static String PWD = null;

	private static QueryRunner runner ;


	static {
		//建立连接器
		File f = new File("novexam/src/goodsmanagesystem/file.properties");
		Properties p = new Properties();
		FileInputStream fis = null;
		try {
			fis = new FileInputStream(f);
			p.load(fis);
			DRIVER = p.getProperty("DRIVER");
			URL = p.getProperty("URL");
			USER = p.getProperty("USER");
			PWD = p.getProperty("PWD");
			fis.close();
		} catch (Exception e) {
			e.printStackTrace();
		}

		//连接数据库
		DruidDataSource ds = new DruidDataSource();
		ds.setUrl(URL);
		ds.setUsername(USER);
		ds.setPassword(PWD);
		ds.setDriverClassName(DRIVER);
		runner = new QueryRunner(ds);
	}

	/**
	 * 进行新增、修改、删除操作
	 * @param sql  进行操作的SQL语句
	 * @param param 操作对应的参数,替代SQL中的占位符
	 * @return SQL执行后受影响的行
	 */
	public static int udpate(String sql ,Object... param ){
		try {
			return runner.update(sql, param);
		} catch (SQLException e) {
			e.printStackTrace();
		}
		return 0 ;
	}

	/**
	 * 查询1个对象封装成Bean对象
	 * @param sql 进行操作的SQL语句
	 * @param clazz 结果封装的Bean类型
	 * @param param 操作对应的参数,替代SQL中的占位符
	 * @return SQL操作后的Bean对象,如果异常则返回null
	 */
	public static<T> T queryOneToBean(String sql, Class<T> clazz,Object... param  ){
		try {
			BasicRowProcessor brp = new BasicRowProcessor(new GenerousBeanProcessor());
			return runner.query(sql, new BeanHandler<T>(clazz,brp),param);
		} catch (SQLException e) {
			e.printStackTrace();
		}
		return null;
	}

	/**
	 * 查询只有1行结果的操作,结果封装成Map
	 * @param sql 进行操作的SQL语句
	 * @param param 操作对应的参数,替代SQL中的占位符
	 * @return SQL操作后的1行内容封装到Map中,如果异常则返回null
	 */
	public static Map<String,Object> queryOneToMap(String sql, Object... param  ){
		try {
			return  runner.query(sql,new MapHandler(),param);
		} catch (SQLException e) {
			e.printStackTrace();
		}
		return null;
	}

	/**
	 * 有多行结果的查询操作,结果封装成List,元素为bean类型
	 * @param sql sql 进行操作的SQL语句
	 * @param clazz 结果封装的Bean类型
	 * @param param 操作对应的参数,替代SQL中的占位符
	 * @return SQL操作后的多行内容封装到List中,如果异常则返回null
	 */
	public static<T> List<T> queryAllList(String sql, Class<T> clazz,Object... param ){
		try {
			BasicRowProcessor brp = new BasicRowProcessor(new GenerousBeanProcessor());
			return runner.query(sql, new BeanListHandler<T>(clazz,brp),param);
		} catch (SQLException e) {
			e.printStackTrace();
		}
		return null;
	}

	/**
	 * 查询有多行结果的操作,结果封装成List中,元素为map类型
	 * @param sql 进行操作的SQL语句
	 * @param param 操作对应的参数,替代SQL中的占位符
	 * @return SQL操作后的多行内容封装到List中,如果异常则返回null
	 */
	public static List<Map<String,Object>> queryAllMap(String sql, Object... param ){
		try {
			return runner.query(sql,new MapListHandler(),param );
		} catch (SQLException e) {
			e.printStackTrace();
		}
		return null;
	}

}

六、GoodsView(用户界面)

package goodsmanagesystem.view;


import goodsmanagesystem.beans.Good;

import java.util.List;
import java.util.Map;
import java.util.Scanner;

// 用户界面:用于用户交互
public class GoodsView {

    //创建Scanner对象
    private Scanner sc = new Scanner(System.in);

    //显示所有的商品信息
    public void showGoods(){
        System.out.println("商品信息如下:");
        System.out.println("序号\t"+"名称\t"+"类型\t"+"销售数量\t"+"价格\t");
    }

    //主界面
    public String showMenu(){
        System.out.println();
        System.out.println("操作菜单如下:");
        System.out.println("A.按关键字搜索商品");
        System.out.println("B.添加商品");
        System.out.println("C.根据商品编号删除商品");
        System.out.println("D.退出");
        System.out.print("请选择:");
        return sc.next();
    }

    //A.按关键字搜索商品
    public String searchGood(){
        System.out.print("请输入搜索的关键字:");
        return sc.next();
    }
    public void searchResult(List<Map<String, Object>> maps){
        if (maps.isEmpty()){
            System.out.println("对不起!没有符合条件的信息!");
        }else {
            maps.forEach(System.out::println);
        }
    }

    //B添加商品
    public Good insertGood(){
        System.out.print("请输入商品的名称:");
        String goods_name = sc.next();
        System.out.print("请输入商品的类型:");
        String goods_type = sc.next();
        System.out.print("请输入商品的销售数量:");
        int goods_salesnum = sc.nextInt();
        System.out.print("请输入商品的销售价格:");
        double goods_price = sc.nextDouble();
        return new Good(goods_name,goods_type,goods_salesnum,goods_price);
    }
    public void insertResult(int a){
        if (a>0){
            System.out.println("恭喜您!商品添加成功!");
        }else{
            System.out.println("添加失败!");
        }
    }


    //C根据商品编号删除商品
    public int dleGoods(){
        System.out.print("请输入要删除的商品编号:");
        return sc.nextInt();
    }
    public void delResult(int a){
        if (a>0){
            System.out.println("恭喜您!商品删除成功!");
        }else {
            System.out.println("对不起!没有找到,删除失败!");
        }

    }
    
    //退出
    public void logOff(){
        System.out.println("您选择的是退出功能");
        System.out.println("即将退出....");
    }
    
}

七、GoodsModel(业务模型)

package goodsmanagesystem.model;


import goodsmanagesystem.beans.Good;
import goodsmanagesystem.utils.DBUtils;

import java.util.List;
import java.util.Map;

//业务模型:数据处理 跟数据库相关,sql语句、调用增删改查的方法
public class GoodsModel {

    //显示所有的商品信息
    public void showGoods(){
        List<Map<String, Object>> showGoodsMaps = DBUtils.queryAllMap("SELECT * from goods;");
        for (Map m:showGoodsMaps
             ) {
            System.out.println(m.get("goods_id")+"\t"+m.get("goods_name")+"\t"+m.get("goods_type")+"\t"+m.get("goods_salesnum")+"\t"+m.get("goods_price"));
        }
    }

    //A.按关键字搜索商品
    public List<Map<String, Object>> searchGood(String name){
         return DBUtils.queryAllMap("SELECT * from goods where goods_name like \"%\"?\"%\"", name);
    }

    //B添加商品
    public int  insertGood(Good g){
        String sql = "INSERT into goods VALUES (NULL,?,?,?,?);";
        return DBUtils.udpate(sql, g.getGoods_name(), g.getGoods_type(), g.getGoods_salesnum(), g.getGoods_price());
    }

    //C根据商品编号删除商品
    public int delGood(int id){
        return DBUtils.udpate("DELETE from goods where goods_id = ?;", id);
    }
    
}

八、GoodsController(控制器)

package goodsmanagesystem.controller;


import goodsmanagesystem.model.GoodsModel;
import goodsmanagesystem.view.GoodsView;

import java.util.List;
import java.util.Map;

//控制器:调用方法
public class GoodsController {
    private static GoodsView view = new GoodsView();
    private static GoodsModel model = new GoodsModel();

    public static void main(String[] args) {
        boolean isWork=true;//管理系统退出控制器
        //1.显示所有的商品信息
        view.showGoods();
        model.showGoods();
        while (isWork){

        //2.主界面
        String result = view.showMenu();

        //退出
        if(result.equals("D") ){
                view.logOff();
                isWork=false;

        //A.按关键字搜索商品
        }else if(result.equals("A") ){

            List<Map<String, Object>> maps = model.searchGood(view.searchGood());
            view.searchResult(maps);

            //B添加商品
        }else if(result.equals("B") ){
            int insertGoodNum = model.insertGood(view.insertGood());
            view.insertResult(insertGoodNum);

            //C根据商品编号删除商品
        }else if(result.equals("C") ){
            int delGoodNum = model.delGood(view.dleGoods());
            view.delResult(delGoodNum);
        }
        }
    }
}

九、Good商品类

package goodsmanagesystem.beans;
//商品类:名称、类型、销售数量、价格
public class Good {
    private  String goods_name ;
    private String goods_type;
    private int goods_salesnum;
    private double goods_price;

    public Good() {
    }

    public Good(String goods_name, String goods_type, int goods_salesnum, double goods_price) {
        this.goods_name = goods_name;
        this.goods_type = goods_type;
        this.goods_salesnum = goods_salesnum;
        this.goods_price = goods_price;
    }

    public String getGoods_name() {
        return goods_name;
    }

    public void setGoods_name(String goods_name) {
        this.goods_name = goods_name;
    }

    public String getGoods_type() {
        return goods_type;
    }

    public void setGoods_type(String goods_type) {
        this.goods_type = goods_type;
    }

    public int getGoods_salesnum() {
        return goods_salesnum;
    }

    public void setGoods_salesnum(int goods_salesnum) {
        this.goods_salesnum = goods_salesnum;
    }

    public double getGoods_price() {
        return goods_price;
    }

    public void setGoods_price(double goods_price) {
        this.goods_price = goods_price;
    }
}

十、数据库

简易商品管理系统:
创建表
create table goods(
goods_id int PRIMARY key auto_increment,
goods_name VARCHAR(20),
goods_type VARCHAR(20),
goods_salesnum int,
goods_price DOUBLE
);


新增数据
INSERT into goods VALUES (NULL,'小米MIX2','手机',520,2999.00);
INSERT into goods VALUES (NULL,'iPhone8','手机',400,6888.00);
INSERT into goods VALUES (NULL,'联想R720','电脑',380,6399.00);
INSERT into goods VALUES (NULL,'华硕FX60','电脑',370,6999.00);
INSERT into goods VALUES (NULL,'惠普P1106','打印机',300,829.00);



查看数据
SELECT * from goods;

SELECT * from goods where goods_name like "%小米%"

删除数据
DELETE from goods where goods_id = 6;