這個只是我的學習筆記,不是我做的小項目,很詳細,給各位參考,給初學者一個大概做小項目的框架
******管家婆家庭記賬小項目******
1、功能:
- 添加賬務
- 編輯賬務
- 刪除賬務
- 查詢賬務
- 退出系統
2、開發環境:eclipse、SQLyog
3、本項目使用的技術:
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包。
4、項目分層:不允許跨層調用
view視圖層 — controller控制層----service業務層—dao操作數據表-----database domain----tools工具包—test測試包
view視圖層:信息錄入提示
controller控制層:調用接上層數據,傳遞下一層;根據結果,控制view的顯示結果
service業務層:數據,來自控制層很多計算;計算後的數據給下一層,對結果集進行計算,過濾
dao:操作數據表,接到業務層數據;查詢數據
domain:JavaBean,數據存儲到了javabean類對象
tools工具包:DBUtils
test測試包:存放項目功能,測試的代碼
創建管家婆數據庫gjp,創建數據表,表名爲gjp_zhangwu,添加數據,保存爲gjp.sql
/*
創建管家婆的數據庫
名字 gjp
*/
CREATE DATABASE gjp;
USE gjp;
/*
創建數據表,表名賬務
字段,列
主鍵
分類名稱 可變字符
金額 double
賬戶 可變字符 (支付,收入方法)
創建日期 date
賬務描述 可變字符
*/
CREATE TABLE gjp_zhangwu(
-- 主鍵
zwid INT PRIMARY KEY AUTO_INCREMENT ,
-- 分類名稱
flname VARCHAR(200),
-- 金額
money FLOAT,
-- 賬戶
zhanghu VARCHAR(100),
-- 創建日期
createtime DATE,
-- 賬務描述
description VARCHAR(1000)
)
-- 寫入測試的數據
INSERT INTO gjp_zhangwu(zwid,flname,money,zhangHu,createtime,description) VALUES (1,'吃飯支出',247,'交通銀行','2016-03-02','家庭聚餐');
INSERT INTO gjp_zhangwu(zwid,flname,money,zhangHu,createtime,description) VALUES (2,'工資收入',12345,'現金','2016-03-15','開工資了');
INSERT INTO gjp_zhangwu(zwid,flname,money,zhangHu,createtime,description) VALUES (3,'服裝支出',1998,'現金','2016-04-02','買衣服');
INSERT INTO gjp_zhangwu(zwid,flname,money,zhangHu,createtime,description) VALUES (4,'吃飯支出',325,'現金','2016-06-18','朋友聚餐');
INSERT INTO gjp_zhangwu(zwid,flname,money,zhangHu,createtime,description) VALUES (5,'股票收入',8000,'工商銀行','2016-10-28','股票大漲');
INSERT INTO gjp_zhangwu(zwid,flname,money,zhangHu,createtime,description) VALUES (6,'股票收入',5000,'工商銀行','2016-10-28','股票又大漲');
INSERT INTO gjp_zhangwu(zwid,flname,money,zhangHu,createtime,description) VALUES (7,'工資收入',5000,'交通銀行','2016-10-28','又開工資了');
INSERT INTO gjp_zhangwu(zwid,flname,money,zhangHu,createtime,description) VALUES (8,'禮金支出',5000,'現金','2016-10-28','朋友結婚');
INSERT INTO gjp_zhangwu(zwid,flname,money,zhangHu,createtime,description) VALUES (9,'其他支出',1560,'現金','2016-10-29','丟錢了');
INSERT INTO gjp_zhangwu(zwid,flname,money,zhangHu,createtime,description) VALUES (10,'交通支出',2300,'交通銀行','2016-10-29','油價還在漲啊');
INSERT INTO gjp_zhangwu(zwid,flname,money,zhangHu,createtime,description) VALUES (11,'吃飯支出',1000,'工商銀行','2016-10-29','又吃飯');
INSERT INTO gjp_zhangwu(zwid,flname,money,zhangHu,createtime,description) VALUES (12,'工資收入',1000,'現金','2016-10-30','開資');
INSERT INTO gjp_zhangwu(zwid,flname,money,zhangHu,createtime,description) VALUES (13,'交通支出',2000,'現金','2016-10-30','機票好貴');
INSERT INTO gjp_zhangwu(zwid,flname,money,zhangHu,createtime,description) VALUES (14,'工資收入',5000,'現金','2016-10-30','又開資');
SELECT * FROM gjp_zhangwu;
創建JAVA工程,命名爲gjp
**記得導入四個jar包**
1、創建工程包6個
-
cn.itcast.gjp.app
-
cn.itcast.gjp.dao
-
cn.itcast.gjp.domain
-
cn.itcast.gjp.tools
-
cn.itcast.gjp.view
-
cn.itcast.gjp.service
-
cn.itcast.gjp.controller
1、 在domain包下新建Class名爲ZhangWu,用來封裝賬務信息的JavaBean
可以右鍵快捷鍵添加Getter/Setter方法,ToString方法、有參無參構造方法
package cn.itcast.gjp.domain;
public class ZhangWu {
private int zwid;
private String flname;
private double money;
private String zhanghu;
private String createtime;
private String description;
public ZhangWu() {
// 無參構造方法
}
public ZhangWu(int zwid, String flname, double money, String zhanghu,
String createtime, String description) {
//有參構造方法
this.zwid = zwid;
this.flname = flname;
this.money = money;
this.zhanghu = zhanghu;
this.createtime = createtime;
this.description = description;
}
//ToString方法
public String toString() {
return "ZhangWu [zwid=" + zwid + ", flname=" + flname + ", money=" + money
+ ", zhanghu=" + zhanghu + ", createtime=" + createtime
+ ", description=" + description + "]";
}
//Getter/Setter方法
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;
}
}
2、 在tools包下,獲取數據庫連接的工具類DBUtils,實現連接池DBCP連接池
package cn.itcast.gjp.tools;
import javax.sql.DataSource;
import org.apache.commons.dbcp.BasicDataSource;
public class JDBCUtils {
private static BasicDataSource datasource=new BasicDataSource();
static{
datasource.setDriverClassName("com.mysql.jdbc.Driver");
datasource.setUrl("jdbc:mysql://localhost:3306/gjp");
datasource.setUsername("root");
datasource.setPassword("123");
datasource.setMaxActive(10);
datasource.setMaxIdle(5);
datasource.setMinIdle(2);
datasource.setInitialSize(5);
}
public static DataSource getDataSource(){
return datasource;
}
}
3、 在app包下,創建類MainApp.java,編寫main主方法,用來完成本項目的啓動
package cn.itcast.gjp.app;
import cn.itcast.gjp.view.MainView;
public class MainApp {
public static void main(String[] args) {
// TODO 自動生成的方法存根
new MainView().run();
}
}
4、在dao包下,創建類ZhangWuDao.java,給ZhangWuDao類添加一個成員變量QueryRunner對象,因此使用DBUtils來操作數據庫。
package cn.itcast.gjp.dao;
import java.sql.SQLException;
import java.util.List;
import org.apache.commons.dbutils.QueryRunner;
import org.apache.commons.dbutils.handlers.BeanListHandler;
import cn.itcast.gjp.domain.ZhangWu;
import cn.itcast.gjp.tools.JDBCUtils;
public class ZhangWuDao {
private QueryRunner qr=new QueryRunner(JDBCUtils.getDataSource());
/*定義方法,實現賬務添加功能
* 由業務層調用,傳遞ZhangWu對象
* 將ZhangWu對象中的數據添加到數據表
*
* */
public void addZhangWu(ZhangWu zw){
try{
//拼寫添加數據的sql
String sql="INSERT INTO gjp_zhangwu(flname,money,zhanghu,createtime,description) VALUES(?,?,?,?,?)";
//創建對象數組,存儲五個?佔位符的實際參數,實際參數來源是,傳遞過來的對象ZhangWu
Object[] 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對象中,存儲到集合中
public List<ZhangWu> selectAll(){
try{
//查詢賬務的SqL語句
String sql="SELECT * FROM gjp_zhangwu";
//調用qr對象的方法,query方法,結果集BeanListHandler
List<ZhangWu> list=qr.query(sql, new BeanListHandler<>(ZhangWu.class));
return list;
}catch(SQLException ex){
System.out.println(ex);
throw new RuntimeException("查詢所有賬務失敗");
}
}
/*定義方法,查詢數據庫,帶有條件去查詢賬務表
* 由業務層調用,查詢結果集存儲到Bean對象,存儲到List集合
* 調用者傳遞兩個日期字符串
* */
public List<ZhangWu> select(String startDate,String endDate){
try{
String sql="SELECT * FROM gjp_zhangwu WHERE createtime BETWEEN ? AND ?";
//定義對象數組,存儲?佔位符
Object[] params={startDate,endDate};
//調用qr對象的方法query查詢數據表,獲取結果集
return qr.query(sql, new BeanListHandler<>(ZhangWu.class),params);
}catch(SQLException ex){
System.out.println(ex);
throw new RuntimeException("條件查詢失敗");
}
}
/*定義方法,實現編輯賬務功能
* 由業務層調用,傳遞ZhangWu對象
* 將對象中的數據,更新到數據表
* */
public void editZhangWu(ZhangWu zw) {
try{
//更新數據的SQL
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("賬務編輯失敗");
}
}
/*
* 定義方法,實現刪除賬務
* 業務層調用,傳遞主鍵ID值
*
* */
public void deleteZhangWu(int zwid) {
try
{
//拼寫刪除數據的Sql
String sql="DELETE FROM gjp_zhangwu WHERE zwid=?";
qr.update(sql, zwid);
}catch(SQLException ex){
System.out.println(ex);
throw new RuntimeException("賬務刪除失敗");
}
}
}
5、在Service包下,創建類ZhangWuService.java,給ZhangWuService類添加一個類型爲ZhangWuDao的成員變量,因爲Service依賴dao
package cn.itcast.gjp.service;
import java.util.List;
import cn.itcast.gjp.dao.ZhangWuDao;
import cn.itcast.gjp.domain.ZhangWu;
public class ZhangWuService {
private ZhangWuDao dao=new ZhangWuDao();
/*定義方法,實現添加賬務
* 是由控制層調用,傳遞ZhangWu類型對象
* 調用dao層方法,傳遞ZhangWu對象
* */
public void addZhangWu(ZhangWu zw){
dao.addZhangWu(zw);
}
//定義方法,實現查詢所有的賬務數據
//此方法,由控制層擁有,去調用dao層的方法
//返回存儲ZhangWu對象的List集合
public List<ZhangWu> selectAll(){
//List<ZhangWu> list=dao.selectAll();
return dao.selectAll();
}
/*定義方法,實現條件查詢服務
* 方法由控制層調用,傳遞兩個日期的字符串
* 調用dao層的方法,傳遞兩個日期字符串
* 獲取到查詢結果集
*
*
* */
public List<ZhangWu> select(String startDate,String endDate){
return dao.select(startDate, endDate);
}
/*定義方法,實現編輯賬務
* 由控制層調用,傳遞ZhangWu對象
* 調用dao層的方法,傳遞ZhangWu對象
* */
public void editZhangWu(ZhangWu zw) {
dao.editZhangWu(zw);
}
/*
* 定義方法,實現刪除賬務功能
* 由控制層調用,傳遞主鍵id
* 調用dao層方法,傳遞主鍵id
* */
public void deleteZhangWu(int zwid) {
dao.deleteZhangWu(zwid);
}
}
6、在Controller包下,創建ZhangWuController類,接收視圖層的數據,數據傳遞給service層,創建service對象
package cn.itcast.gjp.controller;
import java.util.List;
import cn.itcast.gjp.domain.ZhangWu;
import cn.itcast.gjp.service.ZhangWuService;
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);
}
/*定義方法,實現賬務添加功能
* 由視圖層調用,傳遞參數(傳遞過來的參數是一個賬務類型的對象)
* 方法調用service層的方法,傳遞ZhangWu對象,獲取添加後的結果集(添加成功的行數,int)
*
* */
public void addZhangWu(ZhangWu zw){
service.addZhangWu(zw);
}
//控制層類定義方法,實現查詢所有的賬務數據
//方法由視圖層調用,方法調用service層
public List<ZhangWu> selectAll(){
return service.selectAll();
}
/*定義方法,實現條件查詢服務
* 方法由視圖層調用,傳遞兩個日期的字符串
* 調用service層的方法,傳遞兩個日期字符串
* 結果集返回給試圖
*/
public List<ZhangWu> select(String startDate,String endDate ){
return service.select(startDate,endDate);
}
}
7、在view包下,創建類MainView類,視圖層,數據傳遞給controller層實現,成員位置創建controller對象
package cn.itcast.gjp.view;
import java.util.List;
import java.util.Scanner;
import cn.itcast.gjp.controller.ZhangWuController;
import cn.itcast.gjp.domain.ZhangWu;
public class MainView {
private ZhangWuController controller=new ZhangWuController();
//實現界面效果,接收用戶輸入,根據數據,調用不同的功能方法
public void run(){
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.println("輸入ID:");
int zwid=sc.nextInt();
System.out.print("輸入分類名稱:");
String flname=sc.next();
System.out.print("輸入金額:");
double money=sc.nextDouble();
System.out.print("輸入賬戶:");
String zhanghu=sc.next();
System.out.print("輸入日期:格式XXXX-XX-XX:");
String createtime=sc.next();
System.out.print("輸入具體描述:");
String description=sc.next();
//將所有用戶輸入的數據封裝到賬務的對象中
//用戶輸入的ID必須封裝對象
ZhangWu zw=new ZhangWu(zwid, flname, money, zhanghu, createtime, description);
//調用controller層中的方法編輯賬戶
controller.editZhangWu(zw);
System.out.println("賬務編輯成功");
}
public void addZhangWu() {
System.out.println("選擇的是添加賬務,請輸入一下內容");
Scanner sc=new Scanner(System.in);
System.out.print("輸入分類名稱:");
String flname=sc.next();
System.out.print("輸入金額:");
double money=sc.nextDouble();
System.out.print("輸入賬戶:");
String zhanghu=sc.next();
System.out.print("輸入日期:(格式XXXX-XX-XX):");
String createtime=sc.next();
System.out.print("輸入具體描述:");
String description=sc.next();
//將接收到的數據,調用controller層的方法,傳遞參數
//將用戶輸入的所有參數,封裝成ZhangWu對象
ZhangWu zw=new ZhangWu(0, flname, money, zhanghu, createtime, description);
controller.addZhangWu(zw);
System.out.println("添加賬務成功");
}
//查詢數據,有查詢全部跟條件查詢
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;
default:System.out.println("輸入錯誤!");
}
}
//定義方法,實現查詢所有的賬務數據
public void selectAll(){
//調用控制層中的方法,查詢所有的賬務數據
List<ZhangWu> list= controller.selectAll();
if(list.size()!=0)
print(list);
else
System.out.println("沒有查詢到數據");
}
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();
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());
}
}
}
運行:點擊MainApp.java,因爲它是用來完成本項目的啓動的。