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圖形界面化,運用時間類記錄操作時間等等。