JavaSE综合案例——管家婆家庭记账软件

2023-11-11 22:10

本文主要是介绍JavaSE综合案例——管家婆家庭记账软件,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

用JavaSE实现一个控制台记账软件:

5个功能模块:1.添加账务、2.编辑账务、3.删除账务、4.查询账务(全部查询、条件查询)、5.退出系统

使用到了Apache commons项目下的3个工具类和mysql数据库驱动:


整个工程分为7个层:view层、controller层、service层、dao层、database层、tools层、test层

test层:

/** 主程序类,作用:开启软件程序*/
public class MainApp {public static void main(String[] args) {new MainView().run();}
}

view层:

/** 视图层,用户看到和操作的界面(用控制台去模拟)* 数据传递给controller层实现*/
public class MainView {private ZhangWuController controller = new ZhangWuController();/** 实现界面效果* 接收用户的输入* 根据输入,调用不同的功能方法*/public void run() {//创建Scanner类对象,反复进行键盘输入Scanner sc = new Scanner(System.in);while(true) {System.out.println("---------------管家婆家庭记账软件---------------");System.out.println("1.添加账务 2.编辑账务 3.删除账务 4.查询账务 5.退出系统");System.out.println("请输入要操作的功能序号[1-5]:");//接收用户的菜单选择int choose = sc.nextInt();switch(choose) {case 1://选择添加账务,调用添加账务的方法addZhangWu();break;case 2://选择的编辑账务,调用编辑账务的方法editZhangWu();break;case 3://选择的删除账务,调用删除账务的方法deleteZhangWu();break;case 4://选择的查询账务,调用查询方法selectZhangWu();break;case 5:System.exit(0);break;}}}/** 定义方法,实现账务删除* 实现思想:* 	接收用户的输入,输入一个主键数据* 	调用控制层方法,传递一个主键*/public void deleteZhangWu() {//调用查询所有账务数据的功能,显示出来//看到所有数据,从中选择一项,进行删除selectAll();System.out.println("选择的是删除功能,输入序号");int zwid = new Scanner(System.in).nextInt();//调用控制层方法,传递主键id即可controller.deleteZhangWu(zwid);System.out.println("删除账务成功");}/** 定义方法,实现对账务的编辑功能* 实现思想:* 	接收用户输入* 	数据的信息,封装成ZhangWu对象* 	调用控制层的方法,传递ZhangWu对象,实现编辑*/public void editZhangWu() {//调用查询所有账务数据的功能,显示出来//看到所有数据,从中选择一项,进行修改selectAll();System.out.println("选择的是编辑功能,请输入数据:");Scanner sc = new Scanner(System.in);//接收用户的数据System.out.print("输入ID:");int zwid = sc.nextInt();System.out.println("输入分类名称");String flname = sc.next();System.out.println("输入金额");double money = sc.nextDouble();System.out.println("输入账户");String zhanghu = sc.next();System.out.println("输入日期:格式 XXXX-XX-XX");String createtime = sc.next();System.out.println("输入具体描述");String description = sc.next();//将所有用户输入的数据,封装到ZhangWu对象中//输入的ID,必须封装到对象中ZhangWu zw = new ZhangWu(zwid, flname, money, zhanghu, createtime, description);//调用controller层中的方法,实现编辑账务controller.editZhangWu(zw);System.out.println("账务编辑成功");}/** 定义方法,addZhangWu* 添加账务的方法,用户在界面中选择菜单1的时候调用* 实现思想:* 	接收键盘输入,5项输入,调用controller层方法*/public void addZhangWu() {System.out.println("选择的添加账务功能,请输入以下内容");Scanner sc = new  Scanner(System.in);System.out.println("输入分类名称");String flname = sc.next();System.out.println("输入金额");double money = sc.nextDouble();System.out.println("输入账户");String zhanghu = sc.next();System.out.println("输入日期:格式 XXXX-XX-XX");String createtime = sc.next();System.out.println("输入具体描述");String description = sc.next();//将接收到的数据,调用controller层方法,传递参数//将用户输入的所有参数,封装成ZhangWu对象ZhangWu zw = new ZhangWu(0, flname, money, zhanghu, createtime, description);controller.addZhangWu(zw);System.out.println("添加账务成功");}/** 定义方法selectZhangWu()* 显示查询的方式 1 所有查询 2 条件查询* 接收用户的选择*/public void selectZhangWu() {System.out.println("1.查询所有     2.条件查询");Scanner sc = new Scanner(System.in);int selectChooser = sc.nextInt();//根据用户的选择,调用不同的功能switch(selectChooser) {case 1://选择的是查询所有,调用查询所有的方法selectAll();break;case 2://选择的是条件查询,调用带有查询条件的方法select();break;}}/** 定义方法,实现查询所有的账务数据*/public void selectAll() {//调用控制层中的方法,查询所有账务数据List<ZhangWu> list = controller.selectAll();//输出表头if(list.size() != 0)print(list);else {System.out.println("没有查询到数据");}}/** 定义方法,实现条件查询账务数据* 提供用户输入日期,开始日期、结束日期* 将2个日期,传递到controller层* 调用controller层的方法,传递2个日期参数* 获取到controller层查询的结果集,打印出来*/public void select() {System.out.println("选择条件查询,输入日期格式:XXXX-XX-XX");Scanner sc = new Scanner(System.in);System.out.print("请输入开始日期:");String startDate = sc.nextLine();System.out.print("请输入结束日期:");String endDate = sc.nextLine();//调用controller层的方法,传递日期,获取查询结果集List<ZhangWu> list = controller.select(startDate, endDate);if(list.size() != 0)print(list);else {System.out.println("没有查询到数据");}}/** 输出账务数据方法,接收List集合,遍历集合,输出表格*/private void print(List<ZhangWu> list) {System.out.println("ID\t\t类别\t\t账户\t\t金额\t\t时间\t\t说明");//遍历集合,将结果输出控制台for(ZhangWu zw : list) {System.out.println(zw.getZwid()+"\t\t"+zw.getFlname()+"\t\t"+zw.getZhanghu()+"\t\t"+zw.getMoney()+"\t\t"+zw.getCreatetime()+"\t"+zw.getDescription());}}
}

controller层:

/** 控制器层* 接收视图层的数据,数据传递给service层* 成员位置,创建service对象*/
public class ZhangWuController {private ZhangWuService service = new ZhangWuService();/** 定义方法,实现删除账务功能* 视图层调用,传递int类型主键* 调用service层方法,传递int主键*/public void deleteZhangWu(int zwid) {service.deleteZhangWu(zwid);}/** 定义方法,实现编辑账务功能* 由视图层调用,传递参数,也是ZhangWu对象* 调用service层方法,传递ZhangWu对象*/public void editZhangWu(ZhangWu zw) {service.editZhangWu(zw);}/** 定义方法,实现账户添加功能* 由视图层调用,传递参数(传递过来的参数不能是5个数据,传递的1个ZhangWu类型的对象)* 方法调用service层的方法,传递ZhangWu对象,获取到添加后的结果集(添加成功的行数,int)*/public void addZhangWu(ZhangWu zw) {service.addZhangWu(zw);}/** 定义方法,实现条件查询账务* 方法由视图层调用,传递两个日期的字符串* 调用service层的方法,传递两个日期字符串,获取结果集* 结果集返回给视图*/public List<ZhangWu> select(String startDate,String endDate){return service.select(startDate, endDate);}/** 控制层类定义方法,实现查询所有的账务数据* 方法由视图层调用,方法调用service层*/public List<ZhangWu> selectAll() {return service.selectAll();}
}

service层:

/** 业务层类* 接收上一层,控制层controller的数据* 经过计算,传递给dao层,操作数据库* 调用dao层中的方法,类的成员位置,创建dao类的对象*/
public class ZhangWuService {private ZhangWuDao dao = new ZhangWuDao();/** 定义方法,实现删除账务功能* 由控制层调用,传递主键id* 调用dao层方法,传递主键id*/public void deleteZhangWu(int zwid) {dao.deleteZhangWu(zwid);}/** 定义方法,实现编辑账务* 由控制层调用,传递ZhangWu对象* 调用dao层的方法,传递ZhangWu对象*/public void editZhangWu(ZhangWu zw) {dao.editZhangWu(zw);}/** 定义方法,实现添加账户功能* 是由控制层去调用,传递ZhangWu类型对象* 调用dao层方法,传递ZhangWu对象*/public void addZhangWu(ZhangWu zw) {dao.addZhangWu(zw);}/** 定义方法,实现条件查询账务* 方法由控制层调用,传递2个日期字符串* 调用dao层的方法,传递2个日期字符串* 获取到查询结果集*/public List<ZhangWu> select(String startDate,String endDate){return dao.select(startDate, endDate);}/** 定义方法,实现查询所有的账务数据* 此方法,由控制层调用,去调用dao层的方法* 返回存储ZhangWu对象的List集合*/public List<ZhangWu> selectAll() {return dao.selectAll();}}

dao层:

/** 实现对数据表gjp_zhangwu 数据的增删改查操作* 使用DbUtils工具类完成,在类的成员创建QueryRunner对象,指定数据源*/
public class ZhangWuDao {private QueryRunner qr = new QueryRunner(JDBCUtils.getDataSource());/** 定义方法,实现删除账务* 业务层调用,传递主键id值*/public void deleteZhangWu(int zwid) {try {//拼写删除数据SQLString sql = "DELETE FROM gjp_zhangwu WHERE zwid = ?";qr.update(sql,zwid);}catch(SQLException ex) {System.out.println(ex);throw new RuntimeException("删除账务失败");}}/** 定义方法,实现编辑账务功能* 由业务层调用,传递ZhangWu对象* 将对象中的数据更新到数据表*/public void editZhangWu(ZhangWu zw) {try {String sql = "UPDATE gjp_zhangwu SET flname=? ,money=?,zhanghu=?,createtime=?,description=? WHERE zwid = ?";Object[] params = {zw.getFlname(),zw.getMoney(),zw.getZhanghu(),zw.getCreatetime(),zw.getDescription(),zw.getZwid()};//调用qr对象的方法update执行更新qr.update(sql, params);}catch(SQLException ex) {System.out.println(ex);throw new RuntimeException("账务编辑失败");}}/** 定义方法,实现添加账务功能* 由业务层调用,传递ZhangWu对象* 将ZhangWu对象中的数据,添加到数据表*/public void addZhangWu(ZhangWu zw) {try {//拼写添加数据的SQLString sql = "INSERT INTO gjp_zhangwu (flname,money,zhanghu,createtime,description) VALUES (?,?,?,?,?)";//创建对象数组,存储5个问号占位符的实际参数//实际参数来源是,传递过来的ZhangWuObject[] params = {zw.getFlname(),zw.getMoney(),zw.getZhanghu(),zw.getCreatetime(),zw.getDescription()};//调用qr对象中的方法update执行添加qr.update(sql, params);}catch(SQLException ex) {System.out.println(ex);throw new RuntimeException("账务添加失败");}}/** 定义方法,查询数据库,带有条件去查询账务表* 由业务层调用,查询结果存储到Bean对象,存储到List集合* 调用者传递2个日期字符串*/public List<ZhangWu> select(String startDate,String endDate){try {//拼写条件查询的SQL语句String sql = "SELECT * FROM gjp_zhangwu WHERE createtime BETWEEN ? AND ?";//定义对象数组,存储?占位符Object[] params = {startDate,endDate};//调用qr对象的方法query查询数据表,获取结果集return qr.query(sql, new BeanListHandler<ZhangWu>(ZhangWu.class), params);}catch(SQLException ex) {System.out.println(ex);throw new RuntimeException("条件查询失败");}}/** 定义方法,查询数据库,获取所有的账务信息* 此方法,由业务层调用	* 结果集,将所有的账务数据,存储到Bean对象中,再将Bean对象存储到集合中	*/public List<ZhangWu> selectAll() {try {//查询账务数据的SQL语句String sql = "SELECT * FROM gjp_zhangwu";//调用qr对象的方法,query方法,结果集BeanListHandlerList<ZhangWu> list = qr.query(sql, new BeanListHandler<ZhangWu>(ZhangWu.class));return list;}catch(SQLException ex) {System.out.println(ex);throw new RuntimeException("查询所有账务失败");}}
}

tools层:

/** 获取数据库连接的工具类* 实现连接池,dbcp连接池*/
public class JDBCUtils {//创建BasicDataSource对象private static BasicDataSource dataSource = new BasicDataSource();//使用静态代码块,实现必要的参数设置static {dataSource.setDriverClassName("com.mysql.jdbc.Driver");dataSource.setUrl("jdbc:mysql://127.0.0.1:3306/gjp");dataSource.setUsername("root");dataSource.setPassword("root");dataSource.setMaxActive(10);dataSource.setMaxIdle(5);dataSource.setMinIdle(2);dataSource.setInitialSize(10);}public static DataSource getDataSource() {return dataSource;}
}

JavaBean包(domain包):

public class ZhangWu {private int zwid;private String flname;private double money;private String zhanghu;private String createtime;private String description;public ZhangWu(int zwid, String flname, double money, String zhanghu, String createtime, String description) {super();this.zwid = zwid;this.flname = flname;this.money = money;this.zhanghu = zhanghu;this.createtime = createtime;this.description = description;}public ZhangWu() {super();}@Overridepublic String toString() {return "ZhangWu [zwid=" + zwid + ", flname=" + flname + ", money=" + money + ", zhanghu=" + zhanghu+ ", createtime=" + createtime + ", description=" + description + "]";}public int getZwid() {return zwid;}public void setZwid(int zwid) {this.zwid = zwid;}public String getFlname() {return flname;}public void setFlname(String flname) {this.flname = flname;}public double getMoney() {return money;}public void setMoney(double money) {this.money = money;}public String getZhanghu() {return zhanghu;}public void setZhanghu(String zhanghu) {this.zhanghu = zhanghu;}public String getCreatetime() {return createtime;}public void setCreatetime(String createtime) {this.createtime = createtime;}public String getDescription() {return description;}public void setDescription(String description) {this.description = description;}
}

这篇关于JavaSE综合案例——管家婆家庭记账软件的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/393145

相关文章

SpringBoot中四种AOP实战应用场景及代码实现

《SpringBoot中四种AOP实战应用场景及代码实现》面向切面编程(AOP)是Spring框架的核心功能之一,它通过预编译和运行期动态代理实现程序功能的统一维护,在SpringBoot应用中,AO... 目录引言场景一:日志记录与性能监控业务需求实现方案使用示例扩展:MDC实现请求跟踪场景二:权限控制与

Java NoClassDefFoundError运行时错误分析解决

《JavaNoClassDefFoundError运行时错误分析解决》在Java开发中,NoClassDefFoundError是一种常见的运行时错误,它通常表明Java虚拟机在尝试加载一个类时未能... 目录前言一、问题分析二、报错原因三、解决思路检查类路径配置检查依赖库检查类文件调试类加载器问题四、常见

Java注解之超越Javadoc的元数据利器详解

《Java注解之超越Javadoc的元数据利器详解》本文将深入探讨Java注解的定义、类型、内置注解、自定义注解、保留策略、实际应用场景及最佳实践,无论是初学者还是资深开发者,都能通过本文了解如何利用... 目录什么是注解?注解的类型内置注编程解自定义注解注解的保留策略实际用例最佳实践总结在 Java 编程

Java 实用工具类Spring 的 AnnotationUtils详解

《Java实用工具类Spring的AnnotationUtils详解》Spring框架提供了一个强大的注解工具类org.springframework.core.annotation.Annot... 目录前言一、AnnotationUtils 的常用方法二、常见应用场景三、与 JDK 原生注解 API 的

Java controller接口出入参时间序列化转换操作方法(两种)

《Javacontroller接口出入参时间序列化转换操作方法(两种)》:本文主要介绍Javacontroller接口出入参时间序列化转换操作方法,本文给大家列举两种简单方法,感兴趣的朋友一起看... 目录方式一、使用注解方式二、统一配置场景:在controller编写的接口,在前后端交互过程中一般都会涉及

Java中的StringBuilder之如何高效构建字符串

《Java中的StringBuilder之如何高效构建字符串》本文将深入浅出地介绍StringBuilder的使用方法、性能优势以及相关字符串处理技术,结合代码示例帮助读者更好地理解和应用,希望对大家... 目录关键点什么是 StringBuilder?为什么需要 StringBuilder?如何使用 St

使用Java将各种数据写入Excel表格的操作示例

《使用Java将各种数据写入Excel表格的操作示例》在数据处理与管理领域,Excel凭借其强大的功能和广泛的应用,成为了数据存储与展示的重要工具,在Java开发过程中,常常需要将不同类型的数据,本文... 目录前言安装免费Java库1. 写入文本、或数值到 Excel单元格2. 写入数组到 Excel表格

Java并发编程之如何优雅关闭钩子Shutdown Hook

《Java并发编程之如何优雅关闭钩子ShutdownHook》这篇文章主要为大家详细介绍了Java如何实现优雅关闭钩子ShutdownHook,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起... 目录关闭钩子简介关闭钩子应用场景数据库连接实战演示使用关闭钩子的注意事项开源框架中的关闭钩子机制1.

利用Python打造一个Excel记账模板

《利用Python打造一个Excel记账模板》这篇文章主要为大家详细介绍了如何使用Python打造一个超实用的Excel记账模板,可以帮助大家高效管理财务,迈向财富自由之路,感兴趣的小伙伴快跟随小编一... 目录设置预算百分比超支标红预警记账模板功能介绍基础记账预算管理可视化分析摸鱼时间理财法碎片时间利用财

Maven中引入 springboot 相关依赖的方式(最新推荐)

《Maven中引入springboot相关依赖的方式(最新推荐)》:本文主要介绍Maven中引入springboot相关依赖的方式(最新推荐),本文给大家介绍的非常详细,对大家的学习或工作具有... 目录Maven中引入 springboot 相关依赖的方式1. 不使用版本管理(不推荐)2、使用版本管理(推