Java项目 超市管理系统(五)工具类的创建和分析


这篇博客的主要内容是关于工具类的代码和分析。

如果将计算功能、查询&&打印功能、字符获取功能都放在主函数里面的话会导致主函数代码啊太多了,所以项目的设计人将上面的三个功能抽取出来,并封装在工具包中,用来调用。

1、Arith

package lyons.tools;

import java.math.BigDecimal;

/**  
 * 由于Java的简单类型不能够精确的对浮点数进行运算,这个工具类提供精  
 * 确的浮点数运算,包括加减乘除和四舍五入.
 * 
 * 注意:此代码将加减乘除四舍五入方法已实现,但本项目中并未全部使用.
 * @author lyons(zhanglei)
 */  

public class Arith
{
	private static final int DEF_DIV_SCALE = 2; //默认除法运算精度
	private Arith(){} 
	
	/**  
	* 提供精确的加法运算。  
	* @param v1 被加数  
	* @param v2 加数  
	* @return 两个参数的和  
	*/  
	public static double add(double v1,double v2)
	{   
		BigDecimal b1 = new BigDecimal(Double.toString(v1));   
		BigDecimal b2 = new BigDecimal(Double.toString(v2));   
		return b1.add(b2).doubleValue();   
	} 
	
	/**  
	* 提供精确的减法运算。  
	* @param v1 被减数  
	* @param v2 减数  
	* @return 两个参数的差  
	*/  
	public static double sub(double v1,double v2)
	{   
		BigDecimal b1 = new BigDecimal(Double.toString(v1));   
		BigDecimal b2 = new BigDecimal(Double.toString(v2));   
		return b1.subtract(b2).doubleValue();   
	}   
	
	/**  
	* 提供精确的乘法运算。  
	* @param v1 被乘数  
	* @param v2 乘数  
	* @return 两个参数的积  
	*/  
	public static double mul(double v1,double v2)
	{   
		BigDecimal b1 = new BigDecimal(Double.toString(v1));   
		BigDecimal b2 = new BigDecimal(Double.toString(v2));   
		return b1.multiply(b2).doubleValue();   
	}   
	
	/**  
	* 提供(相对)精确的除法运算,当发生除不尽的情况时,精确到  
	* 小数点以后2位,以后的数字四舍五入。  
	* @param v1 被除数  
	* @param v2 除数  
	* @return 两个参数的商  
	*/  
	public static double div(double v1,double v2)
	{   
		return div(v1,v2,DEF_DIV_SCALE);   
	}   
	
	/**  
	* 提供(相对)精确的除法运算。当发生除不尽的情况时,由scale参数指  
	* 定精度,以后的数字四舍五入。  
	* @param v1 被除数  
	* @param v2 除数  
	* @param scale 表示表示需要精确到小数点以后几位。  
	* @return 两个参数的商  
	*/  
	public static double div(double v1,double v2,int scale)
	{   
		if(scale<0)
		{   
			throw new IllegalArgumentException(   
			"The scale must be a positive integer or zero");   
		}   
		BigDecimal b1 = new BigDecimal(Double.toString(v1));   
		BigDecimal b2 = new BigDecimal(Double.toString(v2));   
		return b1.divide(b2,scale,BigDecimal.ROUND_HALF_UP).doubleValue(); //BigDecimal.ROUND_HALF_UP 向“最接近的”数字舍入,如果与两个相邻数字的距离相等,则为向上舍入的舍入模式。 
	}   
	
	/**  
	* 提供精确的小数位四舍五入处理。  
	* @param v 需要四舍五入的数字  
	* @param scale 小数点后保留几位  
	* @return 四舍五入后的结果  
	*/  
	public static double round(double v,int scale)
	{   
		if(scale<0)
		{   
			throw new IllegalArgumentException("The scale must be a positive integer or zero");   
		}   
		BigDecimal b = new BigDecimal(Double.toString(v));   
		BigDecimal one = new BigDecimal("1");   
		return b.divide(one,scale,BigDecimal.ROUND_HALF_UP).doubleValue();   
	}   
}

2、QueryPrint

package lyons.tools;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;

import lyons.dao.GoodsDao;
import lyons.db.DbClose;
import lyons.db.DbConn;
import lyons.entity.Goods;
import lyons.entity.SalesMan;

/**
 * 查询&&打印 函数工具(后期优化可能会删)
 *@author lyons(zhanglei)
 */

public final class QueryPrint
{
		Connection        conn  = null;
		PreparedStatement pstmt = null;
		ResultSet 		rs 	 	 = null;
	
	/**
	 * 模糊查询并陈列查询信息函数小工具
	 * @param oper 调用者
	 * @return 查询到的信息的gid,如果返回值等于-1,则代表查询异常。	  
	 */
		public static int query(String oper)
		{
			int gid = -1;
			String shopping = ScannerChoice.ScannerInfoString(); //键盘获取商品名字
			ArrayList<Goods> goodsList = new QueryPrint().queryGoodsKey(-1,shopping);  //根据键盘获取的商品名字調用 精确查询函数,確定用戶所要操作的数据
			    if (goodsList == null || goodsList.size() <= 0)
				{
						System.err.println("\t!!查无此商品 !!");
						
						//調用选择下一步函数
						ScannerChoice.changedInfoNext(oper);
						
				}else	//查到有此商品,实现进行 更改商品 信息操作!
					{		
						Goods goods = goodsList.get(0);
						
						System.out.println("\t\t\t\t\t商品列表\n\n");
						System.out.println("\t商品编号\t\t商品名称\t\t商品价格\t\t商品数量\t\t备注\n");
						System.out.print("\t"+goods.getGid()+"\t\t"+goods.getGname()+"\t\t"+goods.getGprice()+"\t\t"+goods.getGnum());
						if (goods.getGnum()==0)
						{
							System.out.println("\t\t该商品已售空");
						}else if (goods.getGnum()<10)
								{
									System.out.println("\t\t该商品已不足10件");
								}else 
									{
										System.out.println("\t\t-");
									}
						gid = goods.getGid(); //将商品编号返回给调用者
					}
		 return gid;
		} 
	
	/**
	 * 模糊查询函数小工具
	 * @return int 当商品件数有且只有一件时返回商品gid号,商品已售空时返回 -1. >1件时返回-2 . 查无此商品时返回-3
	 * 					  
	 */
		public static int querySettlement() 
		{
			int gid = -1;
			ArrayList<Goods> goodsSettlement = new GoodsDao().queryGoods(3);//調用 关键字查询函数
		    if (goodsSettlement == null || goodsSettlement.size() <= 0)
			{
					System.err.println("\t!!查无此商品 !!\n");
					gid = -3;	
			}else	//查到有此商品,实现进行 更改商品 信息操作!
				{	
					System.out.println("\t\t\t\t\t商品列表\n\n");
					System.out.println("\t商品编号\t\t商品名称\t\t商品价格\t\t商品数量\t\t备注\n");
					for (int i = 0; i < goodsSettlement.size(); i++)
					{
						Goods goods = goodsSettlement.get(i);
						if (goods.getGnum() > 0)
						{
							System.out.print("\t"+goods.getGid()+"\t\t"+goods.getGname()+"\t\t"+goods.getGprice()+"\t\t"+goods.getGnum());
								
							if (goods.getGnum()==0)
							{
								System.out.println("\t\t该商品已售空");
							}else if (goods.getGnum()<10)
									{
										System.out.println("\t\t该商品已不足10件");
									}else 
										{
											System.out.println("\t\t-");
										}
								if (goodsSettlement.size()==1)
								{
									gid = goods.getGid(); //将商品编号返回给调用者
								}else 
									{
										gid = -2;
									}
						}
					}
				}
		 return gid; 
		} 
	

	/**
	 * 根据商品 gid or gName查询商品
	 * @param 商品id,商品名称
	 * @return 商品信息
	 */
		public ArrayList<Goods> queryGoodsKey(int gId,String gName) 
		{										
			ArrayList<Goods> goodsList = new ArrayList<Goods>();
			conn = DbConn.getconn();	
			
			String sql = "SELECT * FROM GOODS WHERE GID=? OR GNAME=?"; 
			   try
			   {
					pstmt = conn.prepareStatement(sql);
					pstmt.setInt(1, gId);
					pstmt.setString(2, gName);
					rs = pstmt.executeQuery();
					while (rs.next())
					{
						int gid = rs.getInt("gid");
						String gname = rs.getString(2);
						double gprice = rs.getDouble(3);
						int gnum = rs.getInt(4);
						
						Goods goods = new Goods(gid,gname,gprice,gnum);
						goodsList.add(goods);
					}
				} catch (SQLException e)
				{
					e.printStackTrace();
				}finally
						{
							DbClose.queryClose(pstmt, rs, conn);
						}
		  return goodsList;
		}	
		
	/**
	 * 精确查询售货员信息
	 * @param 售货员名字
	 * @return 
	 */
	public ArrayList<SalesMan> querySalesMan(String sName)
	{
		ArrayList<SalesMan> SalesManList = new ArrayList<SalesMan>();
		conn = DbConn.getconn();	
		String sql = "SELECT * FROM SALESMAN WHERE SNAME=?";
		   try
		   {
				pstmt = conn.prepareStatement(sql);
				pstmt.setString(1, sName);
				rs = pstmt.executeQuery();
				while (rs.next())
				{
					int sid = rs.getInt("sid");
					String sname = rs.getString(2);
					String sPassWord = rs.getString(3);
					
					SalesMan salesMan = new SalesMan(sid,sname,sPassWord);
					SalesManList.add(salesMan);
				}
			} catch (SQLException e)
			{
				e.printStackTrace();
			}finally
					{
						DbClose.queryClose(pstmt, rs, conn);
					}
		return SalesManList;
	}
}

3、ScannerChoice

package lyons.tools;

import java.util.Scanner;

import lyons.page.GoodsPage;
import lyons.page.MainPage;
import lyons.page.SalesManPage;

/**
 * 1.各種完成操作后的 选择下一步
 * 2.界面选择操作
 * @author lyons(zhanglei)
 */

public class ScannerChoice
{
	/**
	 * @return double 键盘获取商品价格,小数点后两位
	 */
	public static double ScannerInfo()
	{
		double num = 0.00;
		do
		{
			Scanner sc = new Scanner(System.in);
			System.out.print("保留小数点后两位,请输入:");
			String info = sc.next();
			
			String regex = "(([1-9][0-9]*)\\.([0-9]{2}))|[0]\\.([0-9]{2})";//保留小数点后2位小数
			if (info.matches(regex))
			{
				num = Double.parseDouble(info);
			}else 
				{
					System.err.println("!输入有误!");
					continue;
				}
			break;
		} while (true);
			
		return num;
	}
	
	/**
	 * @return int 键盘获取商品数量
	 */
	public static int ScannerNum()
	{
		int num = 0;
		String regex = "([1-9])|([1-9][0-9]+)";//商品数量
		do
		{
			Scanner sc = new Scanner(System.in);
			System.out.print("请输入:");
			String nums = sc.next();
			
			if (nums.matches(regex))
			{
				num = Integer.parseInt(nums);
			}else 
				{
					System.err.println("!输入有误!");
					continue;
				}
		 break;
		} while (true);
	 return num;
	}
		
	/**
	 * @return String 获取的键盘输入
	 */
	public static String ScannerInfoString()
	{
		Scanner scanner = new Scanner(System.in);
		System.out.print("请输入:");
		return scanner.next();
	}
		
	/**
	 * 获取用户-更改完商品-下一步
	 * 获取用户-删除完商品-下一步
	 * 获取用户-添加完商品-下一步
	 * @param 调用者
	 */
		public static void changedInfoNext(String oper)
		{		
			do
			{
				System.out.println("是否继续进行-当前操作:(Y/N)");
				String choice = ScannerChoice.ScannerInfoString();
				
				//在JAVA中: Equals比较的是值,==比较的是地址
				 if ("y".equals(choice) || "Y".equals(choice)) 
					{
						//下面的嵌套if-else 是让用户选择继续操作当前步骤所跳转到指定页面。(因为不同函数调用,跳转的指定函数不同)
						if ("upateGoodsPage".equals(oper))
							{
								 GoodsPage.upateGoodsPage();
							}else if ("deleteGoodsPage".equals(oper)) 
									{
										GoodsPage.deleteGoodsPage();
									}else if ("addGoodsPage".equals(oper))
											 {
		 										GoodsPage.addGoodsPage();
	 					 					 }
						//上面的嵌套结束
					}else if ("N".equals(choice) || "n".equals(choice)) 
							{
			 					MainPage.MaintenancePage();
							}
			 	System.out.println("\n输入有误!请重新输入.");
			} while (true);
		}
	
		/**
		 * 获取用户-更改-完售货员-下一步
		 * 获取用户-添加-完售货员-下一步
		 * 获取用户-查询-完售货员-下一步
		 * 获取用户-删除-完售货员-下一步
		 * @param 调用者
		 */
			public static void choiceSalesManNext(String oper)
			{	
				 do
				{		
					System.out.println("是否继续进行-当前操作:(Y/N)");
					String choice = ScannerChoice.ScannerInfoString();
				
					 if ( "y".equals(choice) || "Y".equals(choice) ) 
						{
							//下面的嵌套if-else 是让用户选择继续操作当前步骤所跳转到指定页面。(因为不同函数调用,跳转的指定函数不同)
							if ("updateSalesMan".equals(oper))
								{
									 SalesManPage.updateSalesManPage();
								}else if ("deleteSalesMan".equals(oper)) 
										{
											SalesManPage.deleteSalesManPage();
										}else if ("addSalesMan".equals(oper))
												 {
													SalesManPage.addSalesManPage();
		 					 					 }else if ("querySalesMan".equals(oper)) 
		 					 					 		{
		 					 						 		SalesManPage.querySalesManPage();	
		 					 					 		} 
							//上面的嵌套结束
						}else if ("N".equals(choice) || "n".equals(choice)) 
								{
									MainPage.salesManManagementPage();
								}
				 	System.err.println("\t输入有误!");
				} while (true);
			}	
			
}

工具类没有难理解的代码,功能也都在代码中注释的很详细,所以不难学习。

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

胡小冰

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值