$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 的 迭代顺序;特别是它不保证…...

接口测试中缓存处理策略
在接口测试中,缓存处理策略是一个关键环节,直接影响测试结果的准确性和可靠性。合理的缓存处理策略能够确保测试环境的一致性,避免因缓存数据导致的测试偏差。以下是接口测试中常见的缓存处理策略及其详细说明: 一、缓存处理的核…...
日语学习-日语知识点小记-构建基础-JLPT-N4阶段(33):にする
日语学习-日语知识点小记-构建基础-JLPT-N4阶段(33):にする 1、前言(1)情况说明(2)工程师的信仰2、知识点(1) にする1,接续:名词+にする2,接续:疑问词+にする3,(A)は(B)にする。(2)復習:(1)复习句子(2)ために & ように(3)そう(4)にする3、…...

云启出海,智联未来|阿里云网络「企业出海」系列客户沙龙上海站圆满落地
借阿里云中企出海大会的东风,以**「云启出海,智联未来|打造安全可靠的出海云网络引擎」为主题的阿里云企业出海客户沙龙云网络&安全专场于5.28日下午在上海顺利举办,现场吸引了来自携程、小红书、米哈游、哔哩哔哩、波克城市、…...

江苏艾立泰跨国资源接力:废料变黄金的绿色供应链革命
在华东塑料包装行业面临限塑令深度调整的背景下,江苏艾立泰以一场跨国资源接力的创新实践,重新定义了绿色供应链的边界。 跨国回收网络:废料变黄金的全球棋局 艾立泰在欧洲、东南亚建立再生塑料回收点,将海外废弃包装箱通过标准…...

Nuxt.js 中的路由配置详解
Nuxt.js 通过其内置的路由系统简化了应用的路由配置,使得开发者可以轻松地管理页面导航和 URL 结构。路由配置主要涉及页面组件的组织、动态路由的设置以及路由元信息的配置。 自动路由生成 Nuxt.js 会根据 pages 目录下的文件结构自动生成路由配置。每个文件都会对…...

DIY|Mac 搭建 ESP-IDF 开发环境及编译小智 AI
前一阵子在百度 AI 开发者大会上,看到基于小智 AI DIY 玩具的演示,感觉有点意思,想着自己也来试试。 如果只是想烧录现成的固件,乐鑫官方除了提供了 Windows 版本的 Flash 下载工具 之外,还提供了基于网页版的 ESP LA…...

学习STC51单片机31(芯片为STC89C52RCRC)OLED显示屏1
每日一言 生活的美好,总是藏在那些你咬牙坚持的日子里。 硬件:OLED 以后要用到OLED的时候找到这个文件 OLED的设备地址 SSD1306"SSD" 是品牌缩写,"1306" 是产品编号。 驱动 OLED 屏幕的 IIC 总线数据传输格式 示意图 …...
python如何将word的doc另存为docx
将 DOCX 文件另存为 DOCX 格式(Python 实现) 在 Python 中,你可以使用 python-docx 库来操作 Word 文档。不过需要注意的是,.doc 是旧的 Word 格式,而 .docx 是新的基于 XML 的格式。python-docx 只能处理 .docx 格式…...

初学 pytest 记录
安装 pip install pytest用例可以是函数也可以是类中的方法 def test_func():print()class TestAdd: # def __init__(self): 在 pytest 中不可以使用__init__方法 # self.cc 12345 pytest.mark.api def test_str(self):res add(1, 2)assert res 12def test_int(self):r…...

Springboot社区养老保险系统小程序
一、前言 随着我国经济迅速发展,人们对手机的需求越来越大,各种手机软件也都在被广泛应用,但是对于手机进行数据信息管理,对于手机的各种软件也是备受用户的喜爱,社区养老保险系统小程序被用户普遍使用,为方…...