Java基础之账本小项目

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图形界面化,运用时间类记录操作时间等等。

  • 4
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
java语言写的android系统,用于个人账目管理,课程设计上写的欢迎下载 package moneymanager.moneymanager; import android.content.ContentValues; import android.content.Context; import android.database.Cursor; import android.database.SQLException; import android.database.sqlite.SQLiteDatabase; import android.database.sqlite.SQLiteOpenHelper; import android.util.Log; /* * * 데이터베이스를 관리하는 클래스입니다. * */ public class DBAdapter { private static final String TAG = "NotesDbAdapter"; private DatabaseHelper mDbHelper; private SQLiteDatabase mDb; // 데이터베이스이름과 테블이름들을 정의 private static final String DATABASE_NAME = "MoneyManagerDB"; private static final int DATABASE_VERSION = 2; private static final String DATABASE_SETTING_TABLE = "SettingTbl"; private static final String DATABASE_BADGET_TABLE = "BadgetTbl"; private static final String DATABASE_PAYMENT_TABLE = "PaymentTbl"; // 테블안의 항목들을 정의 public static final String KEY_SETTINGTBL_ID = "ID"; public static final String KEY_SETTINGTBL_NAME = "Name"; public static final String KEY_SETTINGTBL_VALUE = "Value"; public static final String KEY_BADGETTBL_ID = "ID"; public static final String KEY_BADGETTBL_ITEM = "Item"; public static final String KEY_BADGETTBL_MONEY = "Money"; public static final String KEY_PAYMENTTBL_ID = "ID"; public static final String KEY_PAYMENTTBL_BADGETID = "BadgetID"; public static final String KEY_PAYMENTTBL_OUTDATE = "OutDate"; public static final String KEY_PAYMENTTBL_MONEY = "Money"; public static final String KEY_PAYMENTTBL_NOTE = "Note"; private final Context mCtx; private static class DatabaseHelper extends SQLiteOpenHelper { DatabaseHelper(Context context) { super(context, DATABASE_NAME, null, DATABASE_VERSION); } @Override public void onCreate(SQLiteDatabase db) { String strCreateTbl; // SettingTbl생성 strCreateTbl = "CREATE TABLE " + DATABASE_SETTING_TABLE + " (" + KEY_SETTINGTBL_ID + " INTEGER PRIMARY KEY AUTOINCREMENT, " + KEY_SETTINGTBL_NAME + " TEXT NOT NULL, " + KEY_SETTINGTBL_VALUE + " TEXT NOT NULL);"; db.execSQL(strCreateTbl); // BadgetTbl생성 strCreateTbl = "CREATE TABLE " + DATABASE_BADGET_TABLE + " (" + KEY_BADGETTBL_ID + " INTEGER PRIMARY KEY AUTOINCREMENT, " + KEY_BADGETTBL_ITEM + " TEXT NOT NULL, " + KEY_BADGETTBL_MONEY + " INTEGER NOT NULL);"; db.execSQL(strCreateTbl); // PaymentTbl생성 strCreateTbl = "CREATE TABLE " + DATABASE_PAYMENT_TABLE + " (" + KEY_PAYMENTTBL_ID + " INTEGER PRIMARY KEY AUTOINCREMENT, " + KEY_PAYMENTTBL_BADGETID + " INTEGER NOT NULL, " + KEY_PAYMENTTBL_OUTDATE + " TEXT NOT NULL, " + KEY_PAYMENTTBL_MONEY + " INTEGER NOT NULL, " + KEY_PAYMENTTBL_NOTE + " TEXT);"; db.execSQL(strCreateTbl); } ......

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值