1.前言
断断续续学习了将近两个月吧。JavaSe基础差不多学完了,感觉看得懂代码,却不知道怎么自己写程序,这几天特意找了些小项目练练手。参考项目链接:https://blog.csdn.net/opera95/article/details/61923495 潜水这么久第一次写博客,如有问题还请多多指教!
2.功能实现效果图
账本为字符版在控制台输出部分功能
Navicat界面的数据库
3.使用技能和软件
1.类和SQL语句的增删减改
2.List集合
3.JDBC
4.常用类:String、Scanner
5.分类模块功能的实现
IntelliJ IDEA19.2+Navicat12+jdk1.8+Mysql5.5
还有项目所需jar包(附百度云盘链接)
链接: https://pan.baidu.com/s/1_oyPMbDtx7nlN9whl8eCOw 提取码: 9917 复制这段内容后打开百度网盘手机App,操作更方便哦
4.UML图
5.代码
/*
主方法类---用于运行程序
*/
public class MainApp {
public static void main(String[] args) {
new MainView().run();
}
}
/*
账务数据层类
*/
public class AccountingDao {
//获取数据连接池,得到操作表数据的对象QueryRunner
QueryRunner qr = new QueryRunner(JDBCUtils.getDataSource());
//查询所有账务
public List<Accounting> selectAll() {
String sql = "select * from gjp_account";
try {
return qr.query(sql, new BeanListHandler<Accounting>(Accounting.class));
} catch (SQLException e) {
throw new RuntimeException(e);
}
}
public List<Accounting> select(String start, String end) {
String sql = "select * from gjp_account where createtime between ? and ?";
Object[] params = {start, end};
try {
return qr.query(sql, new BeanListHandler<Accounting>(Accounting.class), params);
} catch (SQLException e) {
throw new RuntimeException(e);
}
}
public void addAccounting(Accounting accounting){
String sql = "insert into gjp_account values(null,?,?,?,?,?)";
Object[] params = {accounting.getFlname(),accounting.getMoney(),accounting.getAccounting(),accounting.getCreatetime(), accounting.getDescription()
};
try {
qr.update(sql,params);
} catch (SQLException e) {
throw new RuntimeException(e);
}
}
public void editAccounting(Accounting accounting){
String sql = "update gjp_account set flname = ?,money = ?,Accounting = ?,createtime = ?,description = ? where Serialnumber = ?";
Object[] params = {accounting.getSerialnumber(),accounting.getFlname(),accounting.getMoney(),accounting.getAccounting(),accounting.getCreatetime(), accounting.getDescription()
};
try {
qr.update(sql,params);
} catch (SQLException e) {
throw new RuntimeException(e);
}
}
public void deleteAcounting(Accounting accounting){
String sql = "delete from gjp_account where serialnumber = ?";
Object[] params = { accounting.getSerialnumber()};
try {
qr.update(sql,params);
} catch (SQLException e) {
e.printStackTrace();
}
}
}
/*
数据库操作
*/
public class MySQL {
public static void main(String[] args) throws SQLException {
// 创建数据库gjp
String sql = "CREATE DATABASE gjp";
// new Operate().createDataBase("CREATE DATABASE gjp");
// 设置表
String sql1 = "create table gjp_Account(serialnumber INT PRIMARY KEY AUTO_INCREMENT,flname VARCHAR(200)," +
"money DOUBLE,Accounting VARCHAR(100),createtime DATE,description VARCHAR(1000))";
// 导入数据
String sql2 = "INSERT INTO gjp_Account(serialnumber,flname,money,Accounting,createtime,description)VALUES (1,'吃饭支出',247,'交通银行','2016-03-02','家庭聚餐')";
String sql3 = "INSERT INTO gjp_Account VALUES (null,'工资收入',12345,'现金','2016-03-15','开工资了')";
String sql4 = "INSERT INTO gjp_Account VALUES (3,'服装支出',1998,'现金','2016-04-02','买衣服')";
String sql5 = "INSERT INTO gjp_Account VALUES (null,'股票收入',8000,'工商银行','2016-04-28','股票大涨')";
new Operate().createDataBase(sql5);
}
}
//数据库操作
class Operate{
// 创建数据库
public void createDataBase(String sql) {
Connection connection = null;
PreparedStatement ps = null;
// 此处可以用try-catch-resource
try {
// 创建数据库连接对象
DataSource dataSource= JDBCUtils.getDataSource();
// 连接对象转型对接
connection = dataSource.getConnection();
// 创建预编译语句
ps = connection.prepareStatement(sql);
ps.execute();
System.out.println("操作成功!");
} catch (SQLException e) {
e.printStackTrace();
} finally {
// 关闭资源
if(null!=ps){
try {
ps.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if(null!=connection){
try {
connection.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
}
/*
账务类
JavaBean是指的是Java中的类,该类中的成员变量与数据库表中的字段相对
应(变量名对应数据库表字段名、变量数据类型对应数据库表字段类型),并
提供空参数构造方法、set、get方法。
*/
public class Accounting {
private int serialnumber;//流水号
private String flname;//分类
private String Accounting;//账务名称
private double money;//金额
private String createtime;//创建时间
private String description;//说明
@Override
public String toString() {
return
serialnumber + "\t\t"+
flname + "\t\t" +
Accounting + "\t\t" +
money + "\t\t" +
createtime + "\t\t" +
description
;
}
public int getSerialnumber() {
return serialnumber;
}
public void setSerialnumber(int serialnumber) {
this.serialnumber = serialnumber;
}
public String getFlname() {
return flname;
}
public void setFlname(String flname) {
this.flname = flname;
}
public String getAccounting() {
return Accounting;
}
public void setAccounting(String accounting) {
Accounting = accounting;
}
public String getCreatetime() {
return createtime;
}
public void setCreatetime(String createtime) {
this.createtime = createtime;
}
public double getMoney() {
return money;
}
public void setMoney(double money) {
this.money = money;
}
public String getDescription() {
return description;
}
public void setDescription(String description) {
this.description = description;
}
}
/*
账务业务层次类
*/
public class AccountingService {
// service层都依赖于dao层
private AccountingDao accountingDao = new AccountingDao();
// 查询所有
public List<Accounting> selectAll(){
return accountingDao.selectAll();
}
/**
* 按条件查询账务方法
* @param start
* @param end
* @return
*/
public List<Accounting> select(String start, String end) {
return accountingDao.select(start,end);
}
// 增加账务方法
public void addAccounting(Accounting accounting){
accountingDao.addAccounting(accounting);
}
// 编辑功能
public void editAccounting(Accounting accounting){
accountingDao.editAccounting(accounting);
}
// 删除功能
public void deleteAcounting(Accounting accounting){
accountingDao.deleteAcounting(accounting);
}
}
/*
工具类为数据库使用做铺垫
*/
//导入数据类
public class JDBCUtils {
public static final String DRIVER_CLASS_NAME = "com.mysql.jdbc.Driver";//数据库驱动
public static final String URL = "jdbc:mysql://localhost:3306/gjp";//数据库地址
public static final String USERNAME = "root";
public static final String PASSWORD = "root";
private static BasicDataSource dataSource = new BasicDataSource();//连接池--设置参数
static {
dataSource.setDriverClassName(DRIVER_CLASS_NAME);
dataSource.setUrl(URL);
dataSource.setUsername(USERNAME);
dataSource.setPassword(PASSWORD);
}
// 创建数据库连接方法
public static DataSource getDataSource(){//返回连接对象
return dataSource;
}
//连接池不用资源关闭
}
/*
视图框
*/
public class MainView {
// 本项目中view依赖service
private AccountingService accountingService = new AccountingService();
/*
运行方法
*/
public void run(){
// 1,打印菜单 2,获取用户输入3,调用对应方法
boolean flag = true;
Scanner scanner = new Scanner(System.in);
while (flag){
System.out.println("---------------管家婆家庭记账软件---------------");
System.out.println("1.添加账务 2.编辑账务 3.删除账务 4.查询账务 5.退出系统");
System.out.println("请输入要操作的功能序号[1-5]:");
int choose = scanner.nextInt();
switch(choose){
case 1:
addAccounting();
break;
case 2:
editAccounting();
break;
case 3:
deleteAccounting();
break;
case 4:
selectAccounting();
break;
case 5:
System.out.println("欢迎下次使用!拜拜!");
System.exit(-1);
default:
System.out.println("输入有误,功能还在路上。。。");
}
}
}
// 查询账务方法
public void selectAccounting(){
System.out.println("1.查询所有 2.按条件查询");
Scanner scanner = new Scanner(System.in);
int choose = scanner.nextInt();
switch (choose){
case 1:
selectAll();
break;
case 2:
select();
break;
default:
System.out.println("输入错误!");
}
}
// 选择查询全部
public void selectAll(){
List<Accounting> AccountingList = accountingService.selectAll();
print(AccountingList);
}
//打印方法
private void print(List<Accounting> accountingList) {
System.out.println("流水号\t类别\t\t账户\t\t金额\t\t时间\t\t说明");
for (Accounting accounting:accountingList
) {
System.out.println(accounting.toString());
}
}
// 按条件查询
public void select(){
/*
* 1. 获取用户输入查询日期范围。
* 2. 调用service的select()方法完成条件查询功能
*/
Scanner scanner = new Scanner(System.in);
System.out.println("请输入查询起始时间:");
String start = scanner.next();
System.out.println("请输入查询结束时间:");
String end = scanner.next();
List<Accounting> accountingList = accountingService.select(start,end);
print(accountingList);
}
// 添加账务
public void addAccounting(){
Scanner scanner = new Scanner(System.in);
Accounting accounting = new Accounting();
System.out.println("输入类别:");
accounting.setFlname(scanner.next());
System.out.println("输入账务名:");
accounting.setAccounting(scanner.next());
System.out.println("请输入金额:");
accounting.setMoney(scanner.nextDouble());
System.out.println("请输入时间:");
accounting.setCreatetime(scanner.next());
System.out.println("请输入备注说明:");
accounting.setDescription(scanner.next());
//导入账务对象
accountingService.addAccounting(accounting);
System.out.println("添加成功");
}
// 编辑账务
public void editAccounting(){
Scanner scanner = new Scanner(System.in);
Accounting accounting = new Accounting();
System.out.println("输入流水号:");
accounting.setSerialnumber(scanner.nextInt());
System.out.println("输入类别:");
accounting.setFlname(scanner.next());
System.out.println("输入账务名:");
accounting.setAccounting(scanner.next());
System.out.println("请输入金额:");
accounting.setMoney(scanner.nextDouble());
System.out.println("请输入时间:");
accounting.setCreatetime(scanner.next());
System.out.println("请输入备注说明:");
accounting.setDescription(scanner.next());
//导入账务对象
accountingService.editAccounting(accounting);
System.out.println("修改成功");
}
// 删除账务
public void deleteAccounting(){
System.out.println("请输入要删除的流水号");
Scanner scanner = new Scanner(System.in);
Accounting accounting = new Accounting();
accounting.setSerialnumber(scanner.nextInt());
//导入账务对象
accountingService.deleteAcounting(accounting);
System.out.println("删除成功");
}
}
6.总结
经过一天的实训,我在回顾旧知识点的前提下,还了解了开源免费技术的使用方式,并且认识到项目的结构化,框架化。这个项目也使我熟悉了未来工作开发流程,以学会开发项目的逻辑思维。
本项目中,有部分bug。如操作表时输入值的判断。小项目功能比较简单,还可以加入的功能,利用IO流将其打印到文件中,Swing图形界面化,运用时间类记录操作时间等等。