【注意】:管家婆知识的目录结构,一个针对于CRUD的小案例,也就是后端的CRUD
1、控制层
接收view传递的数据, 向service传递数据(调用service层)
向view返回结果
package controller; import java.util.List; import domain.ZhangWu; import service.ZhangWuService; /* 控制层 接收view传递的数据, 向service传递数据(调用service层) 向view返回结果 */ public class ZhangWuController { // 定义Service对象,调用service层方法,将结果返回给view层 private ZhangWuService service = new ZhangWuService(); //删除账务 public void deleteZhangWu(int id){ service.deleteZhangWu(id); } //编辑账务,调用service层方法,将结果返回给view层 public void editZhangWu(ZhangWu zw){ service.editZhangWu(zw); } //添加账务,调用service层方法,将结果返回给view层 public void addZhangWu(ZhangWu zw){ service.addZhangWu(zw); } // 查询所有账务 ,调用service层方法,将结果返回给view层 public List<ZhangWu> selectAll() { return service.selectAll(); } // 条件查询账务,调用service层方法,将结果返回给view层 public List<ZhangWu> select(String startDate, String endDate) { return service.select(startDate, endDate); } }
2、数据持久层
账务数据层类(dao)
操作Zhangwu表的dao,对数据表进行CRUD操作package dao; import java.sql.SQLException; import java.util.List; import org.apache.commons.dbutils.QueryRunner; import org.apache.commons.dbutils.handlers.BeanListHandler; import domain.ZhangWu; import tools.JDBCUtils; /* * 账务数据层类(dao) 操作Zhangwu表的dao,对数据表进行CRUD操作 */ public class ZhangWuDao { // 定义queryrunner 执行SQL语句的对象。 private QueryRunner queryRunner = new QueryRunner(JDBCUtils.getDataSource()); //删除账务 public void deleteZhangWu(int id){ String sql = "delete from zhangwu where zwid=?"; try { queryRunner.update(sql, id); //单个参数,直接传入update方法了,若是多个参数,则像之前那般先定义一个数组,然后再传入方法 } catch (SQLException e) { throw new RuntimeException(e); } } //编辑账务,执行SQL,操作数据库,返回添加结果给service层 public void editZhangWu(ZhangWu zw) { String sql = "update zhangwu set flname=?, money=?,zhanghu=?,createtime=?,description=? where zwid=?"; try { Object[] params = {zw.getFlname(),zw.getMoney(),zw.getZhanghu(),zw.getCreatetime(),zw.getDescription(),zw.getZwid()}; queryRunner.update(sql, params); } catch (SQLException e) { throw new RuntimeException(e); } } //添加账务 ,执行SQL,操作数据库,返回添加结果给service层 public void addZhangWu(ZhangWu zw) { String sql = "insert into zhangwu(flname,money,zhanghu,createtime,description) values(?,?,?,?,?)"; try { Object[] params = {zw.getFlname(),zw.getMoney(),zw.getZhanghu(),zw.getCreatetime(),zw.getDescription()}; queryRunner.update(sql, params); } catch (SQLException e) { throw new RuntimeException(e); } } // 查询所有账务,执行SQL,操作数据库,返回查询结果给service层 public List<ZhangWu> selectAll() { try { // 定义SQL语句 String sql = "SELECT * FROM zhangwu;"; // 执行语句,封装成bean返回 List<ZhangWu> list = queryRunner.query(sql, new BeanListHandler<>(ZhangWu.class)); // 返回查询的结果 return list; } catch (SQLException e) { e.printStackTrace(); throw new RuntimeException("查询所有失败"); } } // 条件查询账务,执行SQL,操作数据库,返回查询结果给service层 public List<ZhangWu> select(String startDate, String endDate) { try { // 定义SQL String sql = "SELECT * FROM zhangwu WHERE createtime BETWEEN ? AND ?;"; // 定义参数 Object[] params = {startDate, endDate}; // 执行语句 return queryRunner.query(sql, new BeanListHandler<>(ZhangWu.class), params); } catch (SQLException e) { e.printStackTrace(); throw new RuntimeException("条件查询失败"); } } }
3、服务层
账务业务层类(service)
调用dao操作数据
向controller返回数据
package service; import java.util.List; import dao.ZhangWuDao; import domain.ZhangWu; /* * 账务业务层类(service) * 调用dao操作数据 向controller返回数据 */ public class ZhangWuService { //service都依赖dao private ZhangWuDao zhangWuDao = new ZhangWuDao(); //删除账务 public void deleteZhangWu(int id){ zhangWuDao.deleteZhangWu(id); } //编辑账务,调用dao层方法,将结果返回给controller层 public void editZhangWu(ZhangWu zw){ zhangWuDao.editZhangWu(zw); } //添加账务,调用dao层方法,将结果返回给controller层 public void addZhangWu(ZhangWu zw) { zhangWuDao.addZhangWu(zw); } // 查询所有账务,调用dao层方法,将结果返回给controller层 public List<ZhangWu> selectAll() { return zhangWuDao.selectAll(); } // 条件查询账务,调用dao层方法,将结果返回给controller层 public List<ZhangWu> select(String startDate, String endDate) { return zhangWuDao.select(startDate, endDate); } }
4、账务类
对应数据表-zhangwu
package domain; /* * 账务类,对应数据表-zhangwu */ public class ZhangWu { private int zwid; // 账务id, 主键 private String flname; // 分类名称 private double money; // 金额 private String zhanghu; // 消费方式 //实体类中 String 类的日期格式 会在插入数据库中 时转化为 date 格式 private String createtime; // 消费日期 (而且String输入日期的格式可以有多种,需要标注说明写哪种格式,便于程序执行,如XXXX-XX-XX) private String description; //费用描述 public ZhangWu() { super(); } public ZhangWu(int zwid, String flname, double money, String zhanghu, String createtime, String description) { super(); this.zwid = zwid; this.flname = flname; this.money = money; this.zhanghu = zhanghu; 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 + "]"; } }
5、Tools工具类:
JDBC工具类: v3.0 (JDBC_DBUtils项目中已有两个版本的JDBC工具类)
可以读取配置文件
使用DBCP连接池技术
package tools; import java.io.InputStream; import java.util.Properties; import javax.sql.DataSource; import org.apache.commons.dbcp.BasicDataSource; /* JDBC工具类: v3.0 (JDBC_DBUtils项目中已有两个版本的JDBC工具类) 可以读取配置文件 使用DBCP连接池技术 */ public class JDBCUtils { // 声明静态变量 //1.创建连接池对象 BasicDataSource private static BasicDataSource dataSource = new BasicDataSource(); //2.4个基本配置 private static String driver; private static String url; private static String username; private static String password; // 静态代码块进行初始化 static { try { // 读取配置文件 readConfig(); // 设置连接池必选4个配置 dataSource.setDriverClassName(driver); dataSource.setUrl(url); dataSource.setUsername(username); dataSource.setPassword(password); // 设置连接池可选4个配置 dataSource.setInitialSize(10); // 初始连接数 dataSource.setMaxActive(8); // 最大活跃连接数 dataSource.setMaxIdle(5); // 最大空闲连接数 dataSource.setMinIdle(1); // 最小空闲连接数 } catch (Exception e) { e.printStackTrace(); throw new RuntimeException("数据库连接失败"); } } // 私有构造方法 private JDBCUtils() {} // 读取配置文件方法 private static void readConfig() throws Exception { // 使用类加载器加载bin目录下的配置文件, 获取输入流 InputStream in = JDBCUtils.class.getClassLoader().getResourceAsStream("database.properties"); // 创建Properties对象 Properties properties = new Properties(); // 加载数据 properties.load(in); // 通过键获取值 driver = properties.getProperty("driver"); url = properties.getProperty("url"); username = properties.getProperty("user"); password = properties.getProperty("password"); } // 获取连接池数据源对象 public static DataSource getDataSource() { return dataSource; } }
6、View
视图层:用户看到和操作 的 界面
数据传递给controller实现
获取用户输入和显示信息
package view; import java.util.List; import java.util.Scanner; import controller.ZhangWuController; import domain.ZhangWu; /* 视图层:用户看到和操作 的 界面 数据传递给controller实现 获取用户输入和显示信息 */ public class MainView { // 定义Controller对象 private ZhangWuController controller = new ZhangWuController(); // 启动界面显示 public void run() { // 创建键盘录入 Scanner scanner = new Scanner(System.in); // 循环菜单 while (true) { // 打印菜单 System.out.println("----------------管家婆家庭记账软件----------------"); System.out.println("1.添加账务 2.删除账务 3.编辑账务 4.查询账务 5.退出系统"); System.out.println("请输入要操作的功能序号[1-5]:"); // 获取输入选项 int choice = scanner.nextInt(); // 根据选项判断调用方法 switch (choice) { case 1: // 添加账务 addZhangWu(); break; case 2: // 删除账务 deleteZhangWu(); break; case 3: // 编辑账务 editZhangWu(); break; case 4: // 查询账务 selectZhangwu(); break; case 5: // 退出 System.out.println("再见"); System.exit(0); break; default: System.out.println("您输入的选项有误"); break; } } } /* * 删除账务方法 */ public void deleteZhangWu() { selectAll(); /* * 1. 获取用户输入,封装到bean中。 * 2. 调用service的deleteZhangWu()方法完成添加功能 */ Scanner in = new Scanner(System.in); System.out.print("请输入ID:"); controller.deleteZhangWu(in.nextInt()); System.out.println("删除账务成功!"); } /* * 编辑账务方法 * dao层返回添加结果,处理底层返回的结果,展示结果 */ public void editZhangWu() { selectAll(); /* * 1. 获取用户输入,封装到bean中。 * 2. 调用service的editZhangWu()方法完成添加功能 * dao层返回编辑结果,处理底层返回的结果,展示结果 */ Scanner in = new Scanner(System.in); ZhangWu zw = new ZhangWu(); System.out.print("请输入ID:"); zw.setZwid(in.nextInt()); System.out.print("请输入新类别:"); zw.setFlname(in.next()); System.out.print("请输入新账户:"); zw.setZhanghu(in.next()); System.out.print("请输入新金额:"); zw.setMoney(in.nextDouble()); System.out.print("请输入新时间:"); zw.setCreatetime(in.next()); System.out.print("请输入新说明:"); zw.setDescription(in.next()); controller.editZhangWu(zw); System.out.println("编辑账务成功!"); } /* * 添加账务方法 * dao层返回添加结果,处理底层返回的结果,展示结果 */ public void addZhangWu() { /* * 1. 获取用户输入,封装到bean中。 * 2. 调用service的addZhangWu()方法完成添加功能 */ Scanner in = new Scanner(System.in); ZhangWu zw = new ZhangWu(); System.out.print("请输入类别:"); zw.setFlname(in.next()); System.out.print("请输入账户:"); zw.setZhanghu(in.next()); System.out.print("请输入金额:"); zw.setMoney(in.nextDouble()); System.out.print("请输入时间,格式为YYYY-MM-DD:"); //在这里的时间可以是YYYY-MM-DD,也可以是YYYY.MM.DD,还可以是1234/2/15,还可以是1111\12\12,还以是1234,12,15 zw.setCreatetime(in.next());//但是为了方便还是定义格式为 YYYY-MM-DD System.out.print("请输入说明:"); zw.setDescription(in.next()); controller.addZhangWu(zw); System.out.println("添加账务成功!"); } // -------------------------------------------------------------------------------------------- /* 查询账务功能 * 1 查询所有 * 2 条件查询 * * dao层查到返回结果给-->list,处理底层返回的结果,展示结果 * * */ private void selectZhangwu() { // 显示子菜单 Scanner scanner = new Scanner(System.in); System.out.println("1.查询所有 2.条件查询"); int choice = scanner.nextInt(); // 判断选项 switch (choice) { case 1: // 查询所有 selectAll(); break; case 2: // 条件查询 select(); break; default: System.out.println("输入有误"); break; } } // 1.查询所有, 调用controller对象的方法查询所有 ,处理底层返回的结果 private void selectAll() { // 调用controller对象的方法查询所有 ,处理底层返回的结果 List<ZhangWu> list = controller.selectAll(); //dao层查到返回结果给-->list,处理结果,展示结果 // 打印表头 System.out.println("ID\t\t类别\t\t账户\t\t金额\t\t时间\t\t\t说明"); // 遍历 for (ZhangWu zhangwu : list) { //遍历list System.out.println( zhangwu.getZwid() + "\t\t" + zhangwu.getFlname() + "\t\t" + zhangwu.getMoney() + "\t\t" + zhangwu.getZhanghu() + "\t\t" + zhangwu.getCreatetime() + "\t\t" + zhangwu.getDescription() ); } } // 2.条件查询, 调用controller的方法, 传递开始和结束日期 ,处理底层返回的结果 private void select() { // 创建键盘录入 Scanner scanner = new Scanner(System.in); System.out.println("当前是条件查询, 请输入日期, 格式为YYYY-MM-DD"); //这里也可以用多种输入时间方式,为了方便还是要定义格式了 System.out.print("请输入开始日期:"); String startDate = scanner.next(); System.out.print("请输入结束日期:"); String endDate = scanner.next(); // 调用controller的方法, 传递开始和结束日期 ,处理底层返回的结果 List<ZhangWu> list = controller.select(startDate, endDate); //dao层查到返回结果给-->list,处理结果,展示结果 // 打印,调用方法,处理返回结果展示的方法 print(list); } // 2.打印数据 private void print(List<ZhangWu> list) { if (list.size() == 0) { // 提示没有记录 System.out.println("没有账务信息"); } else { // 打印表头 System.out.println("ID\t类别\t账户\t金额\t时间\t\t说明"); // 遍历 for (ZhangWu zhangwu : list) { System.out.println( zhangwu.getZwid() + "\t" + zhangwu.getFlname() + "\t" + zhangwu.getMoney() + "\t" + zhangwu.getZhanghu() + "\t" + zhangwu.getCreatetime() + "\t" + zhangwu.getDescription() ); } } } }
7、Main
程序运行入口,主程序类,开启软件程序
public class MainApp { public static void main(String[] args) { // 启动界面 new MainView().run(); } }
GITEE链接:MySQL: MySQL学习笔记 (gitee.com)