$3 : 水项目实战 - 水果库存系统
javase知识点复习:
final关键字:http://t.csdn.cn/bvFgu
接口的定义,特性,实现,继承:http://t.csdn.cn/tbXl3
异常:http://t.csdn.cn/VlS0Z
DAO的概念和角色(设计理念): DAO-称之为数据访问对象,其中的方法都是单精度方法。
单精度指的是这个方法的粒度不能再分了,已经非常细了(因此也称之为细粒度)
fruit --- controller --- Menu.class
fruit --- dao --- FruitDAO.interface
/ impl --- FruitDAOImpl.class
/base --- BaseDAO.class
fruit --- pojo --- Fruit.class
fruit --- view --- Client.class
Menu.class
package com.atguigu.fruit.controller;import com.atguigu.fruit.dao.FruitDAO;
import com.atguigu.fruit.dao.impl.FruitDAOImpl;
import com.atguigu.fruit.pojo.Fruit;import java.util.List;
import java.util.Scanner;//菜单类
public class Menu {Scanner input = new Scanner(System.in);FruitDAO fruitDAO = new FruitDAOImpl();//显示主菜单public int showMainMenu(){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("======================================================");System.out.print("请选择:");int slt = input.nextInt();return slt ;}//查看水果库存列表public void showFruitList(){List<Fruit> fruitList = fruitDAO.getFruitList();System.out.println("------------------------------------------------------");System.out.println("编号\t\t名称\t\t单价\t\t库存\t\t备注");if(fruitList==null || fruitList.size()<=0){System.out.println("对不起,库存为空!");}else{for (int i = 0; i < fruitList.size(); i++) {Fruit fruit = fruitList.get(i);System.out.println(fruit);}}System.out.println("------------------------------------------------------");}//添加水果库存信息 -- 业务方法:添加库存记录public void addFruit(){System.out.print("请输入水果名称:");String fname = input.next() ;Fruit fruit = fruitDAO.getFruitByFname(fname);if(fruit==null){ //说明库存中没有这个名称的水果 - 添加System.out.print("请输入水果单价:");int price = input.nextInt() ;System.out.print("请输入水果库存量:");int fcount = input.nextInt() ;System.out.print("请输入水果备注:");String remark = input.next() ;//封装成一个新的fruit对象fruit = new Fruit(0,fname , price , fcount , remark ) ;//调用DAO的添加方法fruitDAO.addFruit(fruit);}else{ // 说明库存中有这个名称的水果 - 修改System.out.print("请输入追加的库存量:");int fcount = input.nextInt() ;fruit.setFcount(fruit.getFcount()+fcount);//调用DAO的修改方法fruitDAO.updateFruit(fruit);}System.out.println("添加成功!");}//查看指定水果库存信息public void showFruitInfo(){System.out.print("请输入水果名称:");String fname = input.next() ;Fruit fruit = fruitDAO.getFruitByFname(fname);if(fruit==null){System.out.println("对不起,没有找到指定的水果库存记录!");}else{System.out.println("------------------------------------------------------");System.out.println("编号\t\t名称\t\t单价\t\t库存\t\t备注");System.out.println(fruit);System.out.println("------------------------------------------------------");}}//水果下架public void delFruit(){System.out.print("请输入水果名称:");String fname = input.next() ;Fruit fruit = fruitDAO.getFruitByFname(fname);if(fruit==null){System.out.println("对不起,没有找到需要下架的水果信息!");}else{System.out.print("是否确认下架?(Y/N)");String slt = input.next() ;if("y".equalsIgnoreCase(slt)){fruitDAO.delFruit(fname);System.out.println("下架成功!");}}}//退出public boolean exit(){System.out.print("是否确认退出?(Y/N)");String slt = input.next();return !"Y".equalsIgnoreCase(slt);//equalsIgnoreCase('Y') ---> true !取反}}
BaseDAO.class
package com.atguigu.fruit.dao.base;import com.atguigu.fruit.pojo.Fruit;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;//抽象方法不能直接new 必须只能继承 允许有构造方法
public abstract class BaseDAO<T> {//向上提取通用常量,多个DAO可用public final String DRIVER = "com.mysql.jdbc.Driver";public final String URL = "jdbc:mysql://localhost:3306/fruitdb?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的ClassType 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() ;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.解析rsif(rs.next()){for(int i = 0 ; i<columnCount;i++){Object columnValue = rs.getObject(i+1); //33 苹果 5columnValueArr[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.解析rsif(rs.next()){T entity = (T)entityClass.newInstance();for(int i = 0 ; i<columnCount;i++){String columnName = rsmd.getColumnName(i+1); //fid fname priceObject columnValue = rs.getObject(i+1); //33 苹果 5setValue(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 ;}//执行查询,返回Listprotected 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.解析rswhile(rs.next()){T entity = (T)entityClass.newInstance();for(int i = 0 ; i<columnCount;i++){String columnName = rsmd.getColumnName(i+1); //fid fname priceObject columnValue = rs.getObject(i+1); //33 苹果 5setValue(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 ;}
}
FruitDAOImpl.class
package com.atguigu.fruit.dao.impl;import com.atguigu.fruit.dao.FruitDAO;
import com.atguigu.fruit.dao.base.BaseDAO;
import com.atguigu.fruit.pojo.Fruit;import java.sql.*;
import java.util.ArrayList;
import java.util.List;
//接口实现类
public class FruitDAOImpl extends BaseDAO<Fruit> implements FruitDAO {//查询库存列表@Overridepublic List<Fruit> getFruitList() {return super.executeQuery("select * from t_fruit");}//新增库存@Overridepublic boolean addFruit(Fruit fruit) {String sql = "insert into t_fruit values(0,?,?,?,?)";return super.executeUpdate(sql,fruit.getFname(),fruit.getPrice(),fruit.getFcount(),fruit.getRemark())>0;}//修改库存@Overridepublic boolean updateFruit(Fruit fruit) {String sql = "update t_fruit set fcount = ? where fid = ? " ;return super.executeUpdate(sql,fruit.getFcount(),fruit.getFid())>0;}//根据名称查询特定库存@Overridepublic Fruit getFruitByFname(String fname) {return super.load("select * from t_fruit where fname like ? ",fname);}//删除特定库存记录@Overridepublic boolean delFruit(String fname) {String sql = "delete from t_fruit where fname like ? " ;return super.executeUpdate(sql,fname) > 0;}
}
FruitDAO.interface
package com.atguigu.fruit.dao;import com.atguigu.fruit.pojo.Fruit;import java.util.List;public interface FruitDAO {//查询库存列表List<Fruit> getFruitList();//新增库存boolean addFruit(Fruit fruit);//修改库存boolean updateFruit(Fruit fruit);//根据名称查询特定库存Fruit getFruitByFname(String fname);//删除特定库存记录boolean delFruit(String fname);
}
Fruit.class
package com.atguigu.fruit.pojo;public class Fruit {private Integer fid ;private String fname ;private Integer price ;private Integer fcount ;private String remark ;public Fruit(){}public Fruit(Integer fid, String fname, Integer price, Integer fcount, String remark) {this.fid = fid;this.fname = fname;this.price = price;this.fcount = fcount;this.remark = remark;}public Integer getFid() {return fid;}public void setFid(Integer fid) {this.fid = fid;}public String getFname() {return fname;}public void setFname(String fname) {this.fname = fname;}public Integer getPrice() {return price;}public void setPrice(Integer price) {this.price = price;}public Integer getFcount() {return fcount;}public void setFcount(Integer fcount) {this.fcount = fcount;}public String getRemark() {return remark;}public void setRemark(String remark) {this.remark = remark;}@Overridepublic String toString() {return fid + "\t\t" + fname + "\t\t" + price +"\t\t" + fcount +"\t\t" + remark ;}
}
Client.class
package com.atguigu.fruit.view;import com.atguigu.fruit.controller.Menu;public class Client {public static void main(String[] args) {Menu m = new Menu() ;boolean flag = true ;while(flag){//调用显示主菜单的方法int slt = m.showMainMenu();switch(slt){case 1://显示库存列表m.showFruitList();break;case 2:m.addFruit();break;case 3:m.showFruitInfo();break;case 4:m.delFruit();break;case 5:flag=m.exit();break;default:System.out.println("你不按套路出牌!");break;}}System.out.println("谢谢使用!再见!");}
}
导成jar包

Build Artifacts…

相关文章:
$3 : 水项目实战 - 水果库存系统
javase知识点复习: final关键字:http://t.csdn.cn/bvFgu 接口的定义,特性,实现,继承:http://t.csdn.cn/tbXl3 异常:http://t.csdn.cn/VlS0Z DAO的概念和角色(设计理念)&a…...
毕业设计 基于STM32单片机无线ZIGBEE智能大棚土壤湿度光照检测
基于STM32单片机无线ZIGBEE智能大棚土壤湿度光照检测1、项目简介1.1 系统构成1.2 系统功能2、部分电路设计2.1 STM32F103C8T6核心系统电路设计2.2 光敏采集电路设计2.3 温度采集电路设计3、部分代码展示3.1 读取DS18B20温度值3.2 定时器初始化1、项目简介 选题指导,…...
华为OD机试真题Java实现【相对开音节】真题+解题思路+代码(20222023)
相对开音节 题目 相对开音节构成的结构为辅音+元音(aeiou)+辅音(r除外)+e,常见的单词有bike、cake等。 给定一个字符串,以空格为分隔符,反转每个单词中的字母,若单词中包含如数字等其他非字母时不进行反转。 反转后计算其中含有相对开音节结构的子串个数(连续的子串…...
【C++】30h速成C++从入门到精通(STL容器listvector)
listlist的介绍list是可以在常数范围内在任意位置进行插入和删除的序列式容器,并且该容器可以前后双向迭代。list的底层是双向链表结构,双向链表中每个元素存储在互不相关的独立节点中,在节点中通过指针指向其前一个元素和后一个元素。list与…...
操作系统---存储管理
存储管理 操作系统将外存的文件调入到内存中,以便CPU调用,如果调用的内容不在内存中,则会产生缺页中断;产生缺页中断后,这事需要从外存调数据到内存中,然后CPU接着从断点继续调用内存中的数据;在…...
华为OD机试题 - 好朋友(JavaScript)| 含思路
华为OD机试题 最近更新的博客使用说明本篇题解:好朋友题目输入输出示例一输入输出说明示例二输入输出说明Code解题思路华为OD其它语言版本最近更新的博客 华为od 2023 | 什么是华为od,od 薪资待遇,od机试题清单华为OD机试真题大全,用 Python 解华为机试题 | 机试宝典...
socket本地多进程通信基本使用方法和示例
目录 前言: socket是什么 socket基本原理框图 socket基本函数 1 socket() 函数 2 bind()函数 3 connect()函数 4 listen() 函数 5 accept() 函数 6 read() write() send() recv()函数 7 close()函数 8 字节序转换(hton) 示例代码 …...
Python 算法交易实验51 Step2 Signals 信号生成
说明 不可不读书 先从经典的一些超简单信号开始 使用移动平均指标SMA(算术) 给出了信号的产生方法,还有一些测算结果,反正看起来都是盈利的 首先使用离线方法实验一组结果,然后就使用ADBS来进行类似的处理。 内容 1 原理分析…...
app上架专用软著认证电子版权在主流应用商店的使用说明2023年最新版
软著认证电子版权在主流应用商店的使用说明 目录 一、 华为应用商店 二、 腾讯应用宝 三、 小米开放平台 小米应用提交: 小米游戏提交: 四、 OPPO开放平台 OPPO应用提交: OPPO游戏(App)提交: OPPO小游戏(快应…...
[Mybatis2]Mapper代理开发
文章目录 问题情境 代理开发 遵循的三条原则 1.定义与SQL映射文件同名的Mapper接口,并且将Mapper接口和SQL映射文件放置在同一目录下 2.设置SQL映射文件的namespace属性为Mapper接口的全限定名 3.在Mapper接口中定义方法,方法名就是SQL映射文件中sql…...
第十一届蓝桥杯大赛青少组国赛Python真题2
第十一届蓝桥杯大赛青少组Python 真题 第二题 提示信息: 杨辉三角形,是二项式系数在三角形中的一种几何排列。中国南宋数学家杨辉在 1261 年所著的《详 解九章算法》一书有明确记载。欧洲数学家帕斯卡在 1654 年发现这一规律,所以又叫做帕斯卡…...
创建springboot项目文件报红
目录 一、遇到问题 二、出现这个问题的原因 三、解决办法 三种方法 四、操作步骤 一、遇到问题 创建springboot项目的时候,会发现一些重要文件都变成红色了,但是不影响程序的运行。只是看起来会有点不舒服。 二、出现这个问题的原因 因为这个spr…...
gma 地理空间绘图:(1) 绘制简单的世界地图-3.设置地图框
内容回顾 gma 地理空间绘图:(1) 绘制简单的世界地图-1.地图绘制与细节调整 gma 地理空间绘图:(1) 绘制简单的世界地图-2.设置经纬网 方法 SetFrame(FrameColor ‘black’, FrameWidth 0.6, ShowFrame True, ShowLeft True, ShowBottom True, Sho…...
Java Web 实战 03 - 多线程基础(2)
Java Web 实战 03 - 多线程基础篇 2二 . Thread类常见方法2.1 Thread 的常见构造方法2.2 Thread 的几个常见属性getId()getName()getState()getPriority()isDaemon()案例 : 实现 getId()、getName()、 getState()、getPriority()、isDaemon()、isAlive()2.3 启动一个线程-start…...
Linux命令·cat
cat命令的用途是连接文件或标准输入并打印。这个命令常用来显示文件内容,或者将几个文件连接起来显示,或者从标准输入读取内容并显示,它常与重定向符号配合使用。 1.命令格式:cat [选项] [文件]...2.命令功…...
WPF WrapPanel、UniformGrid、DockPanel介绍
WPF WrapPanel、UniformGrid、DockPanel介绍 WrapPanel WrapPanel , 具有在有限的容器范围内, 可以自动换行, 或者换列处理。具体则取决于WrapPanel的排列方式 (Orientation)。 Orientation"Horizontal"时各控件从左至右罗列,当面板长度不够时ÿ…...
华为OD机试题 - TLV 编码(JavaScript)| 含思路
华为OD机试题 最近更新的博客使用说明本篇题解:TLV 编码题目输入输出描述示例一输入输出说明Code解题思路华为OD其它语言版本最近更新的博客 华为od 2023 | 什么是华为od,od 薪资待遇,od机试题清单华为OD机试真题大全,用 Python 解华为机试题 | 机试宝典【华为OD机试】全流…...
【华为OD机试真题java、python、c++】开心消消乐【2022 Q4 100分】(100%通过)
代码请进行一定修改后使用,本代码保证100%通过率。本文章提供java、python、c++三种代码 题目描述 给定一个N行M列的二维矩阵,矩阵中每个位置的数字取值为0或1。矩阵示例如: 1100 0001 0011 1111 现需要将矩阵中所有的1进行反转为0,规则如下: 1) 当点击一个1时,该1便被…...
IDEA搭建vue-cli | vue-router | 排错思路、Webpack、Axios、周期、路由、异步、重定向
💗wei_shuo的个人主页 💫wei_shuo的学习社区 🌐Hello World ! Vue.js概述 Vue 是一套用于构建用户界面的渐进式JavaScript框架。 与其它大型框架不同的是,Vue 被设计为可以自底向上逐层应用。Vue 的核心库只关注视图层…...
HashSet原理
HashSet原理HashSet原理1.概述2.底层代码3.原理图解4.总结4.1: 1.7原理总结4.2: 1.8原理总结HashSet原理 1.概述 HashSet 实现 Set 接口,由哈希表(实际上是一个 HashMap 实例)支持。它不保证 set 的 迭代顺序;特别是它不保证…...
安宝特方案丨XRSOP人员作业标准化管理平台:AR智慧点检验收套件
在选煤厂、化工厂、钢铁厂等过程生产型企业,其生产设备的运行效率和非计划停机对工业制造效益有较大影响。 随着企业自动化和智能化建设的推进,需提前预防假检、错检、漏检,推动智慧生产运维系统数据的流动和现场赋能应用。同时,…...
关于iview组件中使用 table , 绑定序号分页后序号从1开始的解决方案
问题描述:iview使用table 中type: "index",分页之后 ,索引还是从1开始,试过绑定后台返回数据的id, 这种方法可行,就是后台返回数据的每个页面id都不完全是按照从1开始的升序,因此百度了下,找到了…...
spring:实例工厂方法获取bean
spring处理使用静态工厂方法获取bean实例,也可以通过实例工厂方法获取bean实例。 实例工厂方法步骤如下: 定义实例工厂类(Java代码),定义实例工厂(xml),定义调用实例工厂ÿ…...
Xen Server服务器释放磁盘空间
disk.sh #!/bin/bashcd /run/sr-mount/e54f0646-ae11-0457-b64f-eba4673b824c # 全部虚拟机物理磁盘文件存储 a$(ls -l | awk {print $NF} | cut -d. -f1) # 使用中的虚拟机物理磁盘文件 b$(xe vm-disk-list --multiple | grep uuid | awk {print $NF})printf "%s\n"…...
AI病理诊断七剑下天山,医疗未来触手可及
一、病理诊断困局:刀尖上的医学艺术 1.1 金标准背后的隐痛 病理诊断被誉为"诊断的诊断",医生需通过显微镜观察组织切片,在细胞迷宫中捕捉癌变信号。某省病理质控报告显示,基层医院误诊率达12%-15%,专家会诊…...
Python Ovito统计金刚石结构数量
大家好,我是小马老师。 本文介绍python ovito方法统计金刚石结构的方法。 Ovito Identify diamond structure命令可以识别和统计金刚石结构,但是无法直接输出结构的变化情况。 本文使用python调用ovito包的方法,可以持续统计各步的金刚石结构,具体代码如下: from ovito…...
掌握 HTTP 请求:理解 cURL GET 语法
cURL 是一个强大的命令行工具,用于发送 HTTP 请求和与 Web 服务器交互。在 Web 开发和测试中,cURL 经常用于发送 GET 请求来获取服务器资源。本文将详细介绍 cURL GET 请求的语法和使用方法。 一、cURL 基本概念 cURL 是 "Client URL" 的缩写…...
wpf在image控件上快速显示内存图像
wpf在image控件上快速显示内存图像https://www.cnblogs.com/haodafeng/p/10431387.html 如果你在寻找能够快速在image控件刷新大图像(比如分辨率3000*3000的图像)的办法,尤其是想把内存中的裸数据(只有图像的数据,不包…...
如何应对敏捷转型中的团队阻力
应对敏捷转型中的团队阻力需要明确沟通敏捷转型目的、提升团队参与感、提供充分的培训与支持、逐步推进敏捷实践、建立清晰的奖励和反馈机制。其中,明确沟通敏捷转型目的尤为关键,团队成员只有清晰理解转型背后的原因和利益,才能降低对变化的…...
五子棋测试用例
一.项目背景 1.1 项目简介 传统棋类文化的推广 五子棋是一种古老的棋类游戏,有着深厚的文化底蕴。通过将五子棋制作成网页游戏,可以让更多的人了解和接触到这一传统棋类文化。无论是国内还是国外的玩家,都可以通过网页五子棋感受到东方棋类…...
