1.所需创建的包和 jar包
2.创建表结构
#生成一些表数据
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','又开资');
3.代码
javabean类
package com.company.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 zhangwu, String createtime, String description) { super(); this.zwid = zwid; this.flname = flname; this.money = money; this.zhanghu = zhangwu; this.createtime = createtime; this.description = description; } 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; } @Override public String toString() { return "ZhangWu [zwid=" + zwid + ", flname=" + flname + ", money=" + money + ", zhanghu=" + zhanghu + ", createtime=" + createtime + ", description=" + description + "]"; } }
数据库连接的工具类,使用连接池的方式
package com.company.gjp.tools; /* * 获取数据库连接的工具类 * 实现连接池,dbcp连接池 */ import javax.sql.DataSource; import org.apache.commons.dbcp.BasicDataSource; public class JDBCUtils { //创建BasicDatasource对象 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("123456"); dataSource.setMaxActive(10); dataSource.setMaxIdle(5); dataSource.setMinIdle(2); dataSource.setInitialSize(10); } public static DataSource getDataSource(){ return dataSource; } }
开启程序的主方法类
package com.company.gjp.app; import com.company.gjp.view.MainView; /* * 主程序,作用:开启软件程序 */ public class MainApp { public static void main(String[] args) { new MainView().run(); } }
主视图类,用于用户的输入输出,以及向controller层请求数据的类
package com.company.gjp.view; /* * 视图层,用户看到和操作的界面 * 数据传递给controller层实现 * 成员位置,创建controller对象 */ import java.util.List; import java.util.Scanner; import com.company.gjp.controller.ZhangWuController; import com.company.gjp.domain.ZhangWu; public class MainView { private ZhangWuController controller=new ZhangWuController(); /* * 实现界面效果 * 接受用户的输入 * 根据数据,调用不同的功能方法 */ public void run(){ //创建Scanner类对象,反复键盘输入 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); } } } /** * 接受键盘输入的账务id * */ public void deleteZhangWu(){ selectAll(); System.out.println("选择的是删除功能,请输入你要删除的账务ID"); Scanner sc=new Scanner(System.in); int zwid=sc.nextInt(); 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("请输入账户:"); String zhanghu=sc.next(); System.out.print("请输入金额:"); Double money=sc.nextDouble(); System.out.print("请输入时间:"); String createtime=sc.next(); System.out.print("请输入说明:"); String description=sc.next(); //将所有用户输入的数据,封装到ZhangWu对象中 //输入的ID,必须封装对象 ZhangWu zw=new ZhangWu(zwid,flname,money,zhanghu,createtime,description); //调用controller层中的方法,编辑账务 controller.editZhangWu(zw); System.out.println("账务编辑成功!"); } /** * 接受键盘输入,5项输入,调用controller层方法 */ public void addZhangWu(){ Scanner sc = new Scanner(System.in); System.out.print("请输入类别:"); String flname=sc.next(); System.out.print("请输入账户:"); String zhanghu=sc.next(); System.out.print("请输入金额:"); Double money=sc.nextDouble(); System.out.print("请输入时间:"); 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("恭喜你添加账务成功"); } /* * 定义方法selectZhangWu() * 显示查询的方式1.所有查询 2.条件查询 * 接受用户的选择 */ public void selectZhangWu(){ System.out.println("1.查询所有 2.条件查询"); Scanner sc=new Scanner(System.in); int selectChoose=sc.nextInt(); //判断根据用户的选择,调用不同的功能 switch(selectChoose){ case 1: selectAll(); break; case 2: select(); break; } } /** * 定义方法,实现查询所有的账务数据 */ public void selectAll(){ //调用控制中的方法,查询账务的数据 List<ZhangWu> list=controller.selectAll(); //输出表头 print(list); } /** * 定义方法,实现条件查询账务数据 * 提供用户的输入日期,开始日期结束日期 * 就2个日期,传递到controller层 * 调用controller的方法,传递2个日期参数 * 获取controller查询的结果集,打印出来 */ public void select(){ System.out.println("选择条件查询,格式xxxx-xx-xx"); Scanner sc=new Scanner(System.in); System.out.println("请输入开始日期:"); String startDate=sc.nextLine(); System.out.println("输入结束的日期:"); String endDate=sc.nextLine(); //调用controller层的方法,传递日期,获取查询结果集 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 类别 账户 金额 时间 说明"); //遍历集合,结果输出控制台 for(ZhangWu zw:list){ System.out.println(zw.getZwid()+" "+zw.getFlname()+" "+zw.getZhanghu() +" "+zw.getMoney()+" "+zw.getCreatetime()+" "+zw.getDescription()); } } }
控制层类,用于向service层请求数据
package com.company.gjp.controller; /* * 控制器层 * 接受视图层的数据,数据传递给service层 * 成员位置,创建service对象 */ import java.util.List; import com.company.gjp.domain.ZhangWu; import com.company.gjp.service.ZhangWuService; public class ZhangWuController{ private ZhangWuService service=new ZhangWuService(); /** * 定义方法,实现删除账务 * */ public int deleteZhangWu(int zwid){ return service.deleteZhangWu(zwid); } /** * 定义方法,实现编辑账务 */ public int editZhangWu(ZhangWu zw){ return service.editZhangWu(zw); } /** * 定义方法,实现增加账务 */ public int addZhangWu(ZhangWu zw){ return service.addZhangWu(zw); } /** * 定义方法,实现条件查询账务 * 方法由试图层调用,传递两个日期的字符串 * 调用Service层的方法,传递两个日期字符串,获取结果集 * 结果返回给试图 */ public List<ZhangWu> select(String startDate,String endDate){ return service.select(startDate,endDate); } /** * 控制层类定义方法,实现查询所有的账务数据 * 方法由视图层调用, * 结果集,将所有的账务数据,存储到Bean对象中,存储到集合中 */ public List<ZhangWu> selectAll(){ return service.selectAll(); } }
业务层类 service向dao层请求数据
package com.company.gjp.service; /* * 业务层类 * 接受上一层,控制层controller的数据 * 经过计算,传递给dao层,操作数据库 * 调用dao层中的类,类成员位置,创建Dao类的对象 */ import java.util.List; import com.company.gjp.dao.ZhangWuDao; import com.company.gjp.domain.ZhangWu; public class ZhangWuService { private ZhangWuDao dao=new ZhangWuDao(); public int deleteZhangWu(int zwid){ return dao.deleteZhangWu(zwid); } public int editZhangWu(ZhangWu zw){ return dao.editZhangWu(zw); } public int addZhangWu(ZhangWu zw){ return dao.addZhangWu(zw); } /** * 定义方法,实现条件查询账务 * 方法由控制层调用,传递2个日期字符串 * 调用dao层的方法,传递2个日期字符串 * 获取到查询结果集 */ public List<ZhangWu> select(String startDate,String endDate){ return dao.select(startDate,endDate); } /** * 定义方法,实现查询所有的账务数据 * 此方法,由控制层调用,去调用dao层的方法 * 返回存储 ZhangWu对象的List集合 */ public List<ZhangWu> selectAll(){ return dao.selectAll(); } }
dao层类,处理数据类,直接向数据库请求数据
package com.company.gjp.dao; import java.sql.SQLException; import java.util.List; import org.apache.commons.dbutils.QueryRunner; import org.apache.commons.dbutils.handlers.BeanListHandler; import com.company.gjp.domain.ZhangWu; import com.company.gjp.tools.JDBCUtils; /* * 实现对数据表gjp_zhangwu 数据增删改查操作, * dbutils工具类完成,类成员创建QueryRunner对象,指定数据源 */ public class ZhangWuDao { private QueryRunner qr=new QueryRunner(JDBCUtils.getDataSource()); /** * 定义方法,实现删除账务 * 传递主键ID即可 */ public int deleteZhangWu(int zwid){ try{ String sql="delete from gjp_zhangwu where zwid=?"; return qr.update(sql,zwid); }catch (SQLException e){ System.out.println(e); throw new RuntimeException(); } } /** * 定义方法,实现编辑账务(即修改账务) * 由业务层调用,传递ZhangWu对象 * 将对象中的数据,更新到数据表 */ public int editZhangWu(ZhangWu zw){ try{ 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()}; return qr.update(sql,params); }catch (SQLException e){ System.out.println(e); throw new RuntimeException("账务编辑失败"); } } /** * 定义方法,实现添加账务功能 * 由业务层调用,传递ZhangWu对象 * 将ZhangWu对象中的数据,添加到数据表 */ public int addZhangWu(ZhangWu zw){ //拼写数据的sql try{ String sql="insert into gjp_zhangwu (flname,money,zhanghu,createtime,description) values" + "(?,?,?,?,?)"; //创建对象数组,存储5个占位符的实际参数 //实际参数来源是,传递过来的对象是ZhangWu Object[] params={zw.getFlname(),zw.getMoney(),zw.getZhanghu(),zw.getCreatetime() ,zw.getDescription()}; return qr.update(sql,params); }catch (Exception e){ System.out.println(e); throw new RuntimeException("账务添加失败"); } } /** * 定义方法,查询数据库,带有条件去查询账务表 * 由业务层调用,查询结果集存储到Bean对象,存储到List集合 * 调用者传递2个日期字符串 */ public List<ZhangWu> select(String startDate,String endDate){ //拼写条件查询的sql语句 try{ String sql="select * from gjp_zhangwu where createtime between ? and ?"; //定义对象数组,存储?占位符 Object[] params={startDate,endDate}; List<ZhangWu> list=qr.query(sql, new BeanListHandler<>(ZhangWu.class),params); return list; }catch (SQLException e){ System.out.println(e); throw new RuntimeException("条件查询失败"); } } /** * 定义方法,查询数据库,获取所有的账务数据 * 方法,由业务层调用 * 结果集,将所有的账务数据,存储到Bean对象中,存储到集合中 */ public List<ZhangWu> selectAll(){ //查询账务数据的SQL语句 try{ String sql="select * from gjp_zhangwu"; //调用qr对象的方法,query方法,结果集BeanListHandler List<ZhangWu> list=qr.query(sql, new BeanListHandler<>(ZhangWu.class)); return list; }catch (SQLException e){ System.out.println(e); throw new RuntimeException("查询所有账务失败"); } } }
4.效果演示