MySQL阶段_DAY17-DAY19(附笔记)

news2024/9/24 7:24:06

 【注意】:管家婆知识的目录结构,一个针对于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)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/732143.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

路径规划算法:基于冠状病毒群体免疫优化的路径规划算法- 附代码

路径规划算法&#xff1a;基于冠状病毒群体免疫优化的路径规划算法- 附代码 文章目录 路径规划算法&#xff1a;基于冠状病毒群体免疫优化的路径规划算法- 附代码1.算法原理1.1 环境设定1.2 约束条件1.3 适应度函数 2.算法结果3.MATLAB代码4.参考文献 摘要&#xff1a;本文主要…

使用信号量Semaphore 实现多线程访问

一 semaphore多线程访问 1.1 代码 public class Xinhaoliang {public static void main(String[] args) {Semaphore semaphorenew Semaphore(3);for(int k1;k<8;k){final int mk;new Thread(new Runnable() {Overridepublic void run() {try {semaphore.acquire();Syste…

使用ResponseBodyAdvice返回值为String出现cannot be cast to java.lang.String异常

使用ResponseBodyAdvice返回值为String出现cannot be cast to java.lang.String异常 背景 由于项目中为了全局返回统一的JSON格式&#xff0c;使用ResponseBodyAdvice进行拦截&#xff0c;拦截的时候会将返回的信息统一一个对象返回到前端。但是有的同事将一个String的响应对象…

【Linux】高级IO(一)

文章目录 高级IO阻塞IO模型非阻塞IO模型多路转接IOselect简介socket 就绪条件select服务器select的优缺点多路转接的使用场景 高级IO 非阻塞IO&#xff0c;记录锁&#xff0c;系统V流机制&#xff0c;I/O多路转接&#xff08;I/O&#xff09;多路复用&#xff0c;readv 和 wri…

English Learning - L3 综合练习 10 口语语法串讲与思维回顾 2023.07.5 周三

English Learning - L3 综合练习 10 口语语法串讲与思维回顾 2023.07.5 周三 [知识点 1] 名词性从句问题&#xff1a;到底什么是名词笥从句&#xff1f;例 1&#xff1a;我的东西你都可以随便用例 2&#xff1a;不管是谁&#xff0c;放你鸽子就是混蛋例 3&#xff1a;说那种话的…

CMU15-445 2022 Fall 通关记录 —— Project 2:B+ Tree(下篇)

Project 2&#xff1a;B Tree Project #2 - BTree | CMU 15-445/645 :: Intro to Database Systems (Fall 2022) NOTE&#xff1a; 记录完成该Pro中&#xff0c;一些可能会遇到的问题&#xff1a; 本实验中&#xff0c;有很多API是需要自己去实现的&#xff0c;因此&#x…

Mycat【Mycat高可用(安装配置HAProxy、安装配置Keepalived)】(八)-全面详解(学习总结---从入门到深化)

目录 Mycat高可用_安装配置HAProxy Mycat高可用_安装配置Keepalived 复习&#xff1a; Mycat高可用_安装配置HAProxy 安装配置HAProxy 查看列表 yum list | grep haproxy yum安装 yum -y install haproxy 修改配置文件 $ vim /etc/haproxy/haproxy.cfg 启动HAProxy …

安全漏洞的检测利用

安全漏洞的检测&利用 一、安全漏洞的基本概念1.1、什么是漏洞1.2、漏洞的简单理解1.3、微软的RPC漏洞与蠕虫病毒1.4、微软经典的蓝屏漏洞1.5、Heartbleed&#xff08;心脏滴血&#xff09;漏洞1.6、破壳漏洞CVE-2014-62711.7、漏洞的危害1.8、漏洞的成因1.9、漏洞的信息的组…

mysql工具sequel pro

一、安装sequel pro 下载地址&#xff1a;https://www.sequelpro.com/ 需要翻墙 二、安装mysql 下载地址&#xff1a;https://www.mysql.com/ 傻瓜式安装即可 记得设置密码 三、配置环境变量 &#xff08;1&#xff09;打开终端 &#xff08;2&#xff09;open ~/.bash_profile…

【送书福利-第十五期】计算机全栈高手到底该怎么发展?

大家好&#xff0c;我是洲洲&#xff0c;欢迎关注&#xff0c;一个爱听周杰伦的程序员。关注公众号【程序员洲洲】即可获得10G学习资料、面试笔记、大厂独家学习体系路线等…还可以加入技术交流群欢迎大家在CSDN后台私信我&#xff01; 本文目录 一、前言二、书籍介绍1、《前端…

0代码训练GPT-5?MIT微软证实GPT-4涌现自我纠错能力迭代

我们都知道&#xff0c;大模型具有自省能力&#xff0c;可以对写出的代码进行自我纠错。 这种自我修复背后的机制&#xff0c;究竟是怎样运作的&#xff1f; 对代码为什么是错误的&#xff0c;模型在多大程度上能提供准确反馈&#xff1f; 近日&#xff0c;MIT和微软的学者发…

【数据分析 - 基础入门之NumPy①】Anaconda安装及使用

知识目录 前言一、 Anaconda是什么二、为什么使用Anaconda三、安装步骤3.1 下载安装3.2 配置conda源 结语 前言 大家好&#xff01;我是向阳花花花花&#xff0c;本期给大家带来的是 Anaconda 安装及使用。 每日金句分享&#xff1a;故事不长&#xff0c;也不难讲。』—— 「…

期望DP入门

期望DP一般步骤&#xff1a; 1.模拟过程&#xff0c;找出线性性质&#xff0c;作为阶段&#xff08;这本质上也是线性DP&#xff09; 2.涉及DP状态 原则&#xff1a; 体现线性性质 体现边权 根据对期望有无贡献来设计状态 一般在状态设计时需要倒着设计 3.转移 根据边…

如何将自定义字体添加到 iOS 应用程序(SwiftUI + 得意黑)

1. 工具 Xcode Version 14.3 (14E222b)SwiftUI得意黑 Smiley Sans 2. Download https://github.com/atelier-anchor/smiley-sans/releases 3. Add Files to xxx 4. Add Test Code Text("Less is more. 朱洪苇 123").font(.custom("SmileySans-Oblique",…

【电子量产工具】4. UI系统

文章目录 前言一、UI界面分析二、结构体描述按钮三、按钮初始化四、默认绘制按键事件函数五、默认按下按键事件函数六、测试程序实验效果总结 前言 最近看了 电子量产工具 这个项目&#xff0c;本专栏是对该项目的一个总结。 一、UI界面分析 UI 是用户界面&#xff08;User In…

GEE:提取地区 NDVI/LST/RVI 并进行时间序列线性插值和SG滤波

作者&#xff1a;CSDN _养乐多_ 本文将介绍使用Landsat数据集&#xff0c;构建时间序列&#xff0c;并使用线性插值算法填补缺失数据&#xff0c;或者去云空洞&#xff0c;并进一步对完整的时间序列数据进行SG滤波处理。 文章目录 一、代码二、代码链接三、需要请私聊 一、代…

OPCUA 的历史数据库/聚合服务器的实现细节

进入了AI 大数据时代&#xff0c;无论是工业自动化系统&#xff0c;还是物联网系统&#xff0c;对大数据的采集&#xff0c;存储和分析都十分重要。大数据被称为工业的石油&#xff0c;未来制造业的持续改善离不开大数据。 传统的应用中&#xff0c;历史数据的存储是特定的数据…

官方外设库SDA安装和验证

第一种方法 1.打开mobaxterm&#xff0c;通过windows浏览器打开https://github.com/orangepi-xunlong/wiringOP下载压缩包&#xff0c;点击上传外设库的压缩包 2.输入命令 unzip 解压 3.输入命令 sudo ./build 安装工具包 4.验证安装完毕用 输入gpio readall 显示下面图片 第二…

数据分析实战(基础篇):从数据探索到模型解释

前言 本文着重介绍数据分析实战的基础知识和技巧&#xff0c;探索从数据探索到建模再到模型解释的完整过程内容包含数据探索、模型建立、调参技巧、SHAP模型解释数据来源于kaggle平台&#xff0c;crab age prediction数据集&#xff0c;数据详情 数据说明 数据背景 螃蟹味道…

【性能设计篇】聊聊异步处理

在性能设计的时候&#xff0c;其实主要的三板斧就是数据库(读写分离、分库分表)&#xff0c;缓存&#xff08;提升读性能&#xff09;&#xff0c;异步处理&#xff08;提升写性能&#xff09;以及相关的秒杀设计以及边缘设计等。 本篇主要介绍异步处理的哪些事&#xff0c;我们…