水果库存系统(进阶版)
Posted Guarding and trust
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了水果库存系统(进阶版)相关的知识,希望对你有一定的参考价值。
不为失败找理由,只为成功找方法。所有的不甘,因为还心存梦想,所以在你放弃之前,好好拼一把,只怕心老,不怕路长。
文章目录
前言
本系统是基于之前写的水果库存基础版的基础上进行技术迭代,如果想了解基础版小伙伴可点击此:水果库存系统(基础版)。本次为水果库存系统的进阶版,那么和基础版有何不同呢?接下来介绍一下:
1. 使用Spring中IOC思想,把创建对象交给Spring(框架)管理。
2. 使用Spring里的模板JdbcTemplate实现与持久化技术的交接。
3. 使用MySQL来存储数据,真正关闭系统数据依旧存在的持久化效果。
以上就是本次升级后的系统与基础版的最大区别,那么废话不多说,先演示,后分析。
一、项目演示
以上就是本系统的全部功能,看效果的话和基础版的差别不是很大,如果真看表面效果的话,那么就是退出系统,再开启系统,里面保存的数据会一直存在,除非手动删除。那么接下来我们的来看看这个系统的内部结构。
二、项目分析
首先先聊聊本次系统使用到了什么技术。先说说项目管理功能maven,因为要使用第三方的库,比如Spring、mysql、JDBC驱动,为了版本一致性和管理的灵活性,本次使用maven管理第三方工具包;然后就是编译器使用eclipse(也可以切换为iade);然后技术就是Spring使用的版本是5.x,MySQL使用的是8.x的。最后就是项目结构如下:
这里按照三层架构的模式来编写该系统。三层架构即数据访问层(持久层)、业务逻辑层(业务层)、视图控制层(控制层)。然后其他的就是实体类,工具类(上图也有标注)。那么在上代码之前,我们先做一点准备工具,得把maven环境搭建好。
以上就是使用eclipse创建maven的全部过程,然后在生成的maven项目中找到pom.xml文件,把下面的代码复制上去就完成了:
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.nan</groupId>
<artifactId>fruitSys</artifactId>
<version>0.0.1-SNAPSHOT</version>
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.3.20</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>5.3.20</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-tx</artifactId>
<version>5.3.20</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.29</version>
</dependency>
</dependencies>
</project>
环境准备完毕,但是还有一个重要的点,就是数据库还没准备,接下来就是准备数据库了,数据库的设计如下所示:
准备工作到这里就基本完成了,接下来就是上代码。
三、上代码
我们按照数据库到视图层的顺序一一填充代码。
我们先创建Java映射类,作用是对应数据库中的数据。
package com.pojo;
/**
* @author Ban 水果实体类
*/
public class Fruit
private Integer id; // 水果编号
private String name; // 水果名称
private double price; // 水果价格
private String described; // 描述
/* 构造方法 */
public Fruit(String name, double price, String described)
this.name = name;
this.price = price;
this.described = described;
public Fruit(Integer id, String name, double price, String described)
this.id = id;
this.name = name;
this.price = price;
this.described = described;
public Fruit()
/* get、set方法 */
public Integer getId()
return id;
public void setId(Integer id)
this.id = id;
public String getName()
return name;
public void setName(String name)
this.name = name;
public double getPrice()
return price;
public void setPrice(double price)
this.price = price;
public String getDescribed()
return described;
public void setDescribed(String described)
this.described = described;
/* toString方法 方便打印数据 */
@Override
public String toString()
return "编号=" + id + ", 名称=" + name + ", 价格=" + price + ", 描述=" + described;
这里需要注意的是Java属性名要和数据库里的字段名保持一致,不然会导致找不到而程序执行失败。接下来就是Dao层,持久层的代码。
package com.dao;
import com.pojo.Fruit;
import java.util.List;
/**
* 持久层接口
*/
public interface FruitDao
/*新增库存*/
int addFruit(Fruit fruit);
/*查询库存*/
List<Fruit> selectFruit();
/*根据水果编号查询库存*/
Fruit fruitById(Integer id);
/*修改库存*/
int updateFruit(Fruit newFruit);
/*删除库存*/
int deleteFruit(Integer id);
dao实现类
package com.dao;
import com.pojo.Fruit;
import org.springframework.dao.EmptyResultDataAccessException;
import org.springframework.jdbc.core.BeanPropertyRowMapper;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.core.RowMapper;
import java.util.List;
public class FruitDaoImpl implements FruitDao
//定义jdbcTemplate模板
private JdbcTemplate jdbcTemplate;
//在spring容器里获取jdbcTemplate
public void setJdbcTemplate(JdbcTemplate jdbcTemplate)
this.jdbcTemplate = jdbcTemplate;
/*新增水果*/
@Override
public int addFruit(Fruit fruit)
//准备SQL
String sql = "insert into fruit(name,price,described) values (?,?,?)";
//获取sql参数
Object[] params = new Object[]fruit.getName(),fruit.getPrice(),fruit.getDescribed();
//执行jdbcTemplate 进行新增操作
int num = jdbcTemplate.update(sql, params);
return num;
/*查询水果*/
@Override
public List<Fruit> selectFruit()
//准备SQL
String sql = "select * from fruit";
//映射转换器
RowMapper rowMapper = new BeanPropertyRowMapper<Fruit>(Fruit.class);
//执行查询操作
return jdbcTemplate.query(sql,rowMapper);
/*根据编号id查询水果*/
@Override
public Fruit fruitById(Integer id)
//默认没有查询到
Fruit fruit = null;
try
String sql = "select * from fruit where id =?";
RowMapper<Fruit> rowMapper = new BeanPropertyRowMapper<Fruit>(Fruit.class);
fruit = jdbcTemplate.queryForObject(sql, rowMapper, id);
catch (EmptyResultDataAccessException e)
//没有查询到对应的水果
return fruit;
/*更新水果*/
@Override
public int updateFruit(Fruit newFruit)
String sql = "update fruit set name=?,price=?, described=? where id =?";
//参数
Object[] params = new Object[]newFruit.getName(),newFruit.getPrice(),newFruit.getDescribed(),newFruit.getId();
int num = this.jdbcTemplate.update(sql,params);
return num;
/*根据id删除水果*/
@Override
public int deleteFruit(Integer id)
String sql ="delete from fruit where id =?";
int num = jdbcTemplate.update(sql,id);
return num;
这里使用了面向接口编程,这样写的好处是维护性得到了统一。而这一层就是操作数据库的,使用了Spring框架里面的JdbcTemplate模板,代码里都有注释,这里就不啰嗦了。那么接下来就是业务层了:
package com.service;
import com.pojo.Fruit;
/**
*
* @author Ban
* 水果库存业务层接口
*
*/
public interface FruitService
/*新增库存*/
int addFruit(Fruit fruit);
/*查询库存*/
void selectFruit();
/*根据水果编号查询库存*/
String selectById(Integer id);
/*修改库存*/
void updateFruit(Fruit newFruit);
/*删除库存*/
void deleteFruit(Integer id);
业务层实现类
package com.service;
import com.dao.FruitDaoImpl;
import com.pojo.Fruit;
import com.util.SpringBean;
import java.util.List;
/**
* @author Ban
* 水果库存逻辑类
*/
public class FruitServiceImpl implements FruitService
//获取持久层
private FruitDaoImpl fruitDao;
//水果实体类
private Fruit fruit;
//使用setter方法注入
public void setFruitDaoImpl(FruitDaoImpl fruitDaoImpl)
this.fruitDao = fruitDaoImpl;
/**
* 新增库存
*/
public int addFruit(Fruit fruit)
//在spring容器中获取对象fruitDaoImpl
fruitDao = (FruitDaoImpl)SpringBean.getSpringBean("fruitDaoImpl");
//获取水果信息
Integer id = fruit.getId();
String name = fruit.getName();
double price = fruit.getPrice();
String described = fruit.getDescribed();
//创建一个水果类并生产水果信息
Fruit fruit1 = new Fruit(name, price, described);
//把水果放入仓库 并返回受影响的行数
return fruitDao.addFruit(fruit1);
/**
* 查询库存
*/
public void selectFruit()
FruitDaoImpl fruitDao = (FruitDaoImpl)SpringBean.getSpringBean("fruitDaoImpl");
List<Fruit> fruits = fruitDao.selectFruit();
if (fruits.size() == 0 || fruits == null)
System.out.println("库存空空如也~~~");
return;
//遍历查询
for (Fruit fruit : fruits)
//直接打印
System.out.println(fruit.toString());
/**
* 根据水果编号查询对应的水果库存
*/
public String selectById(Integer id)
Fruit fruit1 = fruitDao.fruitById(id);
//判断
if (null != fruit1)
return "200";
return "-1";
/**
* 根据水果编号修改对应库存信息
*/
public void updateFruit(Fruit newFruit)
int i = fruitDao.updateFruit(newFruit);
if (i > 0)
System.out.println("修改成功");
return;
/**
* 根据水果编号删除对应的库存
*/
public void deleteFruit(Integer id)
//删除水果库存
int i = fruitDao.deleteFruit(id);
if (i > 0)
System.out.println("操作成功");
else
System.out.println("该编号对应的水果不存在!");
return;
关于依赖注入的是需要一个配置文件的,咱们放到后面再说,我们先把整体业务流程捋下来。接下来就是视图层了,也就是controller:
package com.controller;
import com.pojo.Fruit;
import com.service.FruitServiceImpl;
import com.util.SpringBean;
import java.util.Scanner;
/**
* 水果库存系统的视图层
*/
public class View
//创建水果库存逻辑类
private FruitServiceImpl fruitService;
public void setFruitService(FruitServiceImpl fruitService)
this.fruitService = fruitService;
//水果库存系统视图设置
public void getView(Scanner sc, String inputUser)
//从Spring容器中获取fruitServiceImpl对象
fruitService = (FruitServiceImpl)SpringBean.getSpringBean("fruitServiceImpl");
//判断用户输入的信息进行不同场景的设计
switch (inputUser)
case "1": //新增库存
System.out.println("请您根据下面的指示进行操作:");
System.out.print("请输入水果名称:");
String name = sc.next();
System.out.print("请输入水果价格:");
double price = sc.nextDouble();
System.out.print("请输入水果描述:");
String desbriced = sc.next();
//存储水果的对象并把水果信息存入其中
Fruit fruit = new Fruit(name, price, desbriced);
//调用逻辑类添加库存
int count = fruitService.addFruit(fruit);
//判断是否新增成功
if(count <1)
System.out.println("新增失败!");
else
System.out.println("新增成功!");
break;
case "2": //查询库存
System.out.println("正在查询...");
以上是关于水果库存系统(进阶版)的主要内容,如果未能解决你的问题,请参考以下文章
Web实战-Tomcat-Servlet-Thymeleaf -JDBC-MySQL浏览器页面显示数据库数据(水果库存系统)