财务记账业务
项目描述
财务记账系统是日常生活中对财务流水控制的常用工具,通过该工具可实现对账目支出,收入,转账,借出,借入,还出,还入记录进行新增,删除,模糊查询,修改,排序功能操作。该项目是运行在 windows 操作系统下,数据存储在 mysql 数据库中。操作显示在控制台中
项目思维导图
项目环境搭建
apache 的 commons 组件:
commons-dbutils-1.4.jar:封装并简化了 JDBC;
commons-dbcp-1.4.jar:apache commons提供的数据库连接池组件,命名为DBCP;
commons.pool-1.3.jar:DBCP 连接池依赖该 jar 包;
mysql-connector-java-5.1.28-bin.jar:MySQL 的 JDBC 驱动包,用 JDBC 连接 MySQL
数据库必须使用该 JAR 包。
数据库准备
表一:
表名 bills 中文表名 账单信息表
主键 id
序号 字段名称 字段说明 类型 长度 属性 备注
1 id 账单 id number 10 主键 序列增长
2 title 账单标题 varchar2 50 非空
3 bill_time 记账时间 date 非空
4 type_id 账单类别 number 10 非空 引 用bill_type 表 主键
5 price 账单金额 number 10,2 非空
6 explain 账单说明 varchar2 500
表二
表名 bill_type 中文表名 账单类别表
主键 id
序号 字段名称 字段说明 类型 长度 属性 备注
1 id 类型 id number 10 主键 序列增长
2 name 类型名称 varchar2 50 非空
用到的技术点
JDK 版本为 1.8
1.键盘输入 Scanner 类
2.正则表达式 Pattern 类
3.集合 List/Map 类
4.对字符串的操作 String 类 StringBuffer 类
5.字符串与整型的转换 Integer 类
6.排序方式(比较器排序)Comparator 接口,Collections 类和 sql 排序。
7.数据库连接操作使用 dbcp 或 c3p0 连接池
8.严格按照分层
工程创建及包管理
- 使用 Eclipse创建 Java 工程,命名为 gjp
- 创建工程包
cn.it.zw.app: 存放 main 方法类;
cn.it.zw.domain/bean: 存放 JavaBean;
cn.it.zw.view: 存放界面,及表现层类;
cn.it.zw.service: 存放业务层类;
cn.it.zw.dao: 存放数据访问层类;
cn.it.zw.tools:存放工具类 - 创建 lib 文件夹,用来存储使用的 jar 包
基本流程
账目新增
描述:当账目产生收入(反对应支出) ,借入(反对应还入),借出(反对应还出)等账单时可通过该页面进行记录操作。当金额填写为非数字格式时不可提交,弹出警告框金额需填写正确格式。
账目删除
账目删除也是需要先从数据库中查询数据,根据数据的序号进行删除
账目修改
账目修改首先要从数据库中按照分页查询数据每页 5 条数据,计算总页数,使用↑选择上页使用↓查询下页数据,在任何输入时输入 0 则跳出查询,显示菜单。输入查询出的序号可进行修改。
账目查询
账目的查询可按照类型(类型需要通过查询数据库后显示然后选择)
按照用户名查询:可通过用户名进行模糊查询。
按照日期:可通过输入日期范围进行查询
按照标题名:可通过输入标题进行模糊查询
可查询所有
账目排序
账目排序指代使用数据库查询时(或者使用程序)进行排序
排序可按照标题,用户名称,时间,金额进行排序。
部分代码展示
规则验证视角
package cn.it.zw.view;
import java.util.Scanner;
public class RegexView {
static Scanner sc = new Scanner(System.in);
//------------------------------------------------验证-------------------------------------------
//对菜单输入选项的
public static int menuRegex (int min, int max){
int flag ;
do {
int num = sc.nextInt();
if(num>=min&&num<=max) {
flag = 1;
return num;
}else {
flag = 0;
System.out.println("输入有误,请重新输入!");
}
}while(flag == 0);
return -1;
}
//日期验证
public static String timeRegex(String time) {
int flag;
do {
if(time.matches("^((\\d{2}(([02468][048])|([13579][26]))[\\-\\/\\s]?((((0?[13578])|(1[02]))[\\-\\/\\s]?((0?[1-9])|([1-2][0-9])|(3[01])))|(((0?[469])|(11))[\\-\\/\\s]?((0?[1-9])|([1-2][0-9])|(30)))|(0?2[\\-\\/\\s]?((0?[1-9])|([1-2][0-9])))))|(\\d{2}(([02468][1235679])|([13579][01345789]))[\\-\\/\\s]?((((0?[13578])|(1[02]))[\\-\\/\\s]?((0?[1-9])|([1-2][0-9])|(3[01])))|(((0?[469])|(11))[\\-\\/\\s]?((0?[1-9])|([1-2][0-9])|(30)))|(0?2[\\-\\/\\s]?((0?[1-9])|(1[0-9])|(2[0-8]))))))?$")) {
flag=1;
return time;
}else {
flag = 0;
System.out.println("输入日期有误请按照2020-05-06格式输入");
}
}while(flag == 0);
return null;
}
//金额验证
public static double priceRegex() {
int flag;
do {
double price = sc.nextDouble();
if((price+"").matches("^(([1-9][0-9]*)|(([0]\\.\\d{1,2}|[1-9][0-9]*\\.\\d{1,2})))$")) {
flag = 1;
return price;
}else {
flag = 0;
System.out.println("请输入正确数字,如3.6");
}
}while(flag == 0);
return 0;
}
//翻页验证
public static String udRegex() {
int flag;
do {
String zm = sc.next();
if(zm.matches("[ud0]")) {
flag = 1;
return zm;
}else {
flag = 0;
System.out.println("请输入正确的格式,u或者d或者0");
}
}while(flag == 0);
return null;
}
}
分页的实现
//分页查找全部
@Override
public List<ZhangWu> selectForPage(int currentPage,String[] condition,String []value,boolean flag) {
// TODO Auto-generated method stub
String sql="SELECT bills.`id`,bills.`yname`,bills.`title`,bills.`bill_time`,bills.`price`,bills.`explains`,bill_type.`NAME`\r\n" +
"FROM bill_type,bills\r\n" +
"WHERE bills.`type_id`=bill_type.`id`";
if(condition != null && condition.length != 0) {
sql += " and ";
for (int i = 0; i < condition.length; i++) {
sql += (condition[i]+"=?");
}
}
sql += "limit "+currentPage * 5 + ",5";
try {
return qr.query(sql,new BeanListHandler<ZhangWu>(ZhangWu.class));
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
throw new RuntimeException("查询无结果");
}finally {
//归还连接
try {
JDBCUtils.getDataSource().getConnection().close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
``
```java
static ZhangWu zw = new ZhangWu();
static ZhangWuService zws = new ZhangWuServicesImpl();
static Scanner sc = new Scanner(System.in);
static Bills bills = new Bills();
// 总条数
public static void findBillType() {
BillType billtype = new BillType();
List<BillType> list = zws.findBillType(billtype);
for (int i = 0; i < list.size(); i++) {
System.out.print((i+1)+"."+list.get(i).getNAME());
}
System.out.println("");
}
public static void all() {
int total = zws.count();
int totalPage = (int) Math.ceil((double) total / 5);
int currentPage = 0;
boolean flag = true;
while (true) {
if (flag) {
if (total == 0) {
System.out.println("没有数据!");
break;
} else {
List<ZhangWu> ZahngwuList = zws.selectForPage(currentPage, null, null, false);
print(ZahngwuList);
flag = false;
}
System.out.println(
"共计:" + totalPage + "页 当前页:" + (currentPage + 1) + "输入u查看上一页,输入d查看下一页,输入0返回上一级");
}
String choose = udRegex();
if (choose.equalsIgnoreCase("u")) {
if (currentPage == 0) {
System.out.println("当前页为首页");
flag = false;
} else {
currentPage--;
flag = true;
}
}
if (choose.equalsIgnoreCase("d")) {
if (currentPage == totalPage - 1) {
System.out.println("当前页为尾页");
flag = false;
} else {
currentPage++;
flag = true;
}
}
if (choose.equals("0")) {
break;
}
if (choose.equalsIgnoreCase("s")) {
break;
}
}
}