MySQL阶段_DAY17-DAY19(附笔记)

这篇具有很好参考价值的文章主要介绍了MySQL阶段_DAY17-DAY19(附笔记)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

 【注意】:管家婆知识的目录结构,一个针对于CRUD的小案例,也就是后端的CRUD

MySQL阶段_DAY17-DAY19(附笔记),MYSQL,笔记

 


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连接池技术

MySQL阶段_DAY17-DAY19(附笔记),MYSQL,笔记
 

 

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)文章来源地址https://www.toymoban.com/news/detail-548915.html

到了这里,关于MySQL阶段_DAY17-DAY19(附笔记)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • MySQL入门阶段这一篇就够了-学习笔记(手敲1.5万字)

    虽然在大一下学期,就已经接触到了MySQL,但是那个时候只是会用MySQL进行增删改查,在大三上学期,尝试投简历寻找实习时,对方公司对于程序员的MySQL水平有很高的要求,所以我开始系统化的学习MySQL。顺便将整理出的笔记逐步写入博客中,日积月累,准备发表一篇长篇博

    2024年02月15日
    浏览(45)
  • MySQL 8.0 Reference Manual(读书笔记19节-- 日期与计算)

    为什么设计的时候,存放的是出生日期而不是年龄呢?这个问题简单,细想很有意思,也包含着智慧,来自生产生活的思考。下面的解释很到位。 How about age? That might be of interest, but it is not a good thing to store in a database. Age changes as time passes, which means you\\\'d have to update your records

    2024年04月11日
    浏览(70)
  • MySQL笔记-第17章_触发器

    视频链接:【MySQL数据库入门到大牛,mysql安装到优化,百科全书级,全网天花板】 讲师:尚硅谷-宋红康(江湖人称:康师傅) 官网:http://www.atguigu.com 在实际开发中,我们经常会遇到这样的情况:有 2 个或者多个相互关联的表,如 商品信息 和 库存信息 分别存放在 2 个不同

    2024年02月05日
    浏览(41)
  • 读高性能MySQL(第4版)笔记19_云端和合规性

    5.2.2.1. (CPU核的数量×95%CPU总使用量)×2 5.2.2.2. 建议将50%作为常规的使用率目标,最高可达到65%~70% 5.2.2.3. 如果维持在70%或更高的CPU使用率,将可能会看到延迟增加,此时应该考虑添加更多的CPU 5.6.1.1. 被视为仅用于短暂数据的磁盘 5.6.2.1. 网络连接的磁盘可能会遇到本地

    2024年02月08日
    浏览(47)
  • 读高性能MySQL(第4版)笔记17_复制(下)

    1.3.1.1. 安全补丁 1.3.1.2. 内核更新 1.3.1.3. 一些配置选项更改后需要重新启动才能生效 1.3.2.1. 确定将哪个副本切换为新的源 1.3.2.1.1. 一个包含所有数据的副本 1.3.2.2. 检查延时,确保延时在秒级别 1.3.2.3. 通过设置super_read_only停止数据写入源服务器 1.3.2.4. 等待副本与目标完

    2024年02月08日
    浏览(48)
  • LiangGaRy-学习笔记-Day19

    1、回顾知识 1.1、文件系统说明 xfs与ext4文件系统 CentOS7以上:默认的就是XFS文件系统 xfs 使用的就是restore、dump等工具 CentOS6默认的就是ext4文件系统 extundelete工具就是用于ext4系统 1.2、回顾Linux文件系统 Linux文件系统是由三个部分组成 inode 文件名 block块 Linux:文件系统类型 ex

    2024年02月08日
    浏览(46)
  • 浅析 mysql 两阶段提交

    目录 前言 对流程图主要模块解释 连接器 查询缓存 分析器 优化器 执行器 日志模块 两阶段提交 前言 在业务上,对数据的更新是非常频繁的,mysql 来说就是一条update 语句。大家有没有感觉update 语句对普通索引的更新总是很快,这是为啥呢?是不是很好奇更新语句的执行流程

    2024年04月12日
    浏览(27)
  • 阶段小作业:基于docker安装mysql

    1.在docker hub 搜索Mysql镜像 2.拉取Mysql 5.7 镜像 注意mysql是小写哦 3.创建mysql容器,主机3306端口号映射到容器3306端口  这里我在复制老师给的代码的问题是   注意--name也是变颜色的 代码的意思是 -d 后台守护进程 -p 3306:3306 端口映射,宿主机端口与容器端口的映射 –privilege

    2024年02月12日
    浏览(41)
  • MySQL-5.7.19版本安装详解

    Mysql5.7地址:https://dev.mysql.com/get/Downloads/MySQL-5.7/mysql-5.7.19-winx64.zip 2.1 第一步:解压 下载后会得到mysql-5.7.19-winx64的zip 安装文件,先将其解压 解压的路径最好不要有中文和空格,防止后面安装失败 这里我解压到 F:MySQLmysql-5.7.19-winx64 目录下 【根据自己的情况来指定目录,尽量

    2024年02月07日
    浏览(32)
  • 玩转Mysql系列 - 第19篇:游标详解

    这是Mysql系列第19篇。 环境:mysql5.7.25,cmd命令中进行演示。 代码中被[]包含的表示可选,|符号分开的表示可选其一。 需求背景 当我们需要对一个select的查询结果进行遍历处理的时候,如何实现呢? 此时我们需要使用游标,通过游标的方式来遍历select查询的结果集,然后对

    2024年02月09日
    浏览(41)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包