JavaWeb连接(JDBC)数据库实现增删改查

JavaWeb连接(JDBC)数据库实现增删改查

1、数据库结构

(1)、创建数据库(source_db)

(2)、创建数据表(tb_source),结构如下

字段名说明字段类型长度备注
id编号int主键,自增,增量为 1
name名称varchar50不能为空
type类型varchar20不能为空
uploadDate上传日期date不能为空

(3)、MySQL数据库创建表语句

# 新建表
CREATE TABLE `tb_source` (`id` int(11) NOT NULL AUTO_INCREMENT COMMENT '编号',`name` varchar(50) NOT NULL COMMENT '名称',`type` varchar(20) NOT NULL COMMENT '类型',`uploadDate` date NOT NULL COMMENT '上传日期',PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=9 DEFAULT CHARSET=utf8;# 添加测试数据
INSERT INTO `tb_source` VALUES (1, '二次元', '视频', '2023-04-25');
INSERT INTO `tb_source` VALUES (2, '国际新闻', '文件', '2023-04-24');
INSERT INTO `tb_source` VALUES (3, '军事热点', '视频', '2023-05-01');
INSERT INTO `tb_source` VALUES (4, '国际新闻', '视频', '2023-04-11');
INSERT INTO `tb_source` VALUES (5, '精选小说', '文件', '2023-04-05');
INSERT INTO `tb_source` VALUES (6, '搞笑趣事', '视频', '2023-04-01');
INSERT INTO `tb_source` VALUES (7, '八卦闲谈', '文件', '2023-04-16');
INSERT INTO `tb_source` VALUES (8, '美女热舞', '视频', '2023-04-25');
INSERT INTO `tb_source` VALUES (9, '美女热舞', '文件', '2023-04-25');
2、新建JavaWeb项目详细步骤

(1)、设置项目名称和项目路径

在这里插入图片描述

在这里插入图片描述

(2)、完成新建一个空项目,目录结构

在这里插入图片描述

(3)、为新建的项目添加Web工程容器

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

(4)、添加Tomcat工具用于启动Web项目

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

(5)、运行结果

在这里插入图片描述

3、项目文件目录结构(重点了解)

(1)、目录介绍

在这里插入图片描述

(2)、引入jar包步骤:https://blog.csdn.net/qq_54693844/article/details/134259335

4、创建JDBC数据库访问类:FactoryDB

(1)、创建FactoryDB类

  • 注意点留意存放位置(package com.item.source.common.jdbc)
package com.item.source.common.jdbc;import java.sql.*;/*** @author 为一道彩虹*/
public class FactoryDB
{private static final String URL = "jdbc:mysql://localhost:3306/source_db?characterEncoding=utf-8";private static final String USER = "root";private static final String PASSWORD = "123456";/** 1.加载驱动 */static{try{Class.forName("com.mysql.cj.jdbc.Driver");}catch (ClassNotFoundException e){e.printStackTrace();}}/** 2.获取数据库连接 */public static Connection GetConnection(){try{return DriverManager.getConnection(URL, USER, PASSWORD);}catch (SQLException throwables){throwables.printStackTrace();}return null;}/** 3.关闭资源 */public static void Close(Connection connection, PreparedStatement preparedStatement, ResultSet resultSet){try{if (resultSet != null){resultSet.close();}if (preparedStatement != null){preparedStatement.close();}if (connection != null){connection.close();}}catch (SQLException e){e.printStackTrace();}}/** 4.测试是否连接成功 */public static void main(String[] args){System.out.println(GetConnection());}
}

(2)、测试连接是否成功

在这里插入图片描述

5、创建实体类:Source

(1)、创建Source实体类

package com.item.source.model.entity;/*** 描述:Source实体类** @author 为一道彩虹*/
public class Source
{/** 编号 */private int id;/** 名称 */private String name;/** 类型 */private String type;/** 上传日期 */private String uploadDate;/** 无参构成方法 */public Source(){}/** 有参构成方法(初始化) */public Source(int id, String name, String type, String uploadDate){this.id = id;this.name = name;this.type = type;this.uploadDate = uploadDate;}/** get和set方法 */public int getId() {return id;}public void setId(int id){this.id = id;}public String getName() {return name;}public void setName(String name) {this.name = name;}public String getType(){return type;}public void setType(String type) {this.type = type;}public String getUploadDate(){return uploadDate;}public void setUploadDate(String uploadDate) {this.uploadDate = uploadDate;}
}
6、创建数据访问层:SourceManageDAOByJDBCImpl(重点复习)

(1)、首先创建对应的接口

package com.item.source.dao;import com.item.source.model.entity.Source;
import java.util.List;/*** 课程 Source DAO层* @author 为一道彩虹*/
public interface SourceManageDAOByJDBC
{/*** 查询所有Source数据* @return 多条数据才用List<Source>接收数据*/List<Source> QueryAllSource();
}

(2)、创建SourceManageDAOByJDBCImpl实现类

package com.item.source.dao.impl;import com.item.source.common.jdbc.FactoryDB;
import com.item.source.dao.SourceManageDAOByJDBC;
import com.item.source.model.entity.Source;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.ArrayList;
import java.util.List;/*** 描述:Source DAO实现层** @author 为一道彩虹*/
public class SourceManageDAOByJDBCImpl implements SourceManageDAOByJDBC
{/*** 查询所有Source数据* @return 多条数据才用List<Source>接收数据*/@Overridepublic List<Source> QueryAllSource(){// 获取数据库连接Connection connection = FactoryDB.getConnection();PreparedStatement preparedStatement = null;ResultSet resultSet = null;List<Source> sourceList = new ArrayList<>();try{// SQL 语句String SQL = "SELECT * FROM  tb_source";// 执行 SQL 语句preparedStatement = connection.prepareStatement(SQL);// executeQuery 执行查询操作   得到查询结果集合resultSetresultSet = preparedStatement.executeQuery();while (resultSet.next()){// 创建 Source 实体接收对应数据Source source = new Source();source.setId(resultSet.getInt("id"));source.setName(resultSet.getString("name"));source.setType(resultSet.getString("type"));source.setUploadDate(resultSet.getString("uploadDate"));// 添加到sourceList,用于返回数据sourceList.add(source);}}catch (Exception e){e.printStackTrace();}finally{// 关闭连接数据库对象,防止资源重复调用FactoryDB.Close(connection,preparedStatement,resultSet);}return sourceList;}/** 测试对应操作是否成功 */public static void main(String[] args){// 创建SourceManageDAOByJDBCImpl对象SourceManageDAOByJDBCImpl daoImp = new SourceManageDAOByJDBCImpl();// 调用 QueryAllSource 方法List<Source> sourceList = daoImp.QueryAllSource();// 循环输出for (Source source : sourceList){System.out.print(source.getId() + "\t");System.out.print(source.getName() + "\t");System.out.print(source.getType() + "\t");System.out.println(source.getUploadDate());}}
}

(3)、测试对应操作是否成功

在这里插入图片描述

在这里插入图片描述

7、条件查询、模糊查询和增删改查操作(重点复习)
1、条件查询

(1)、SourceManageDAOByJDBC接口实现

/*** 课程 Source DAO层* @author 为一道彩虹*/
public interface SourceManageDAOByJDBC
{/*** 查询所有Source数据* @return 多条数据才用List<Source>接收数据*/List<Source> QueryAllSource();/*** Source条件查询* @param name 名称* @return Source数据有一条的时候*/Source conditionalQuery(String name);/*** Source条件查询* @param name 名称* @return  List<Source>数据有多条的时候*/List<Source> conditionalQueryList(String name);
}

(2)、SourceManageDAOByJDBCImpl类实现

/*** 描述:Source DAO实现层** @author 为一道彩虹*/
public class SourceManageDAOByJDBCImpl implements SourceManageDAOByJDBC
{/*** 查询所有Source数据* @return 多条数据才用List<Source>接收数据*/@Overridepublic List<Source> QueryAllSource(){// 获取数据库连接Connection connection = FactoryDB.getConnection();PreparedStatement preparedStatement = null;ResultSet resultSet = null;List<Source> sourceList = new ArrayList<>();try{// SQL 语句String SQL = "SELECT * FROM  tb_source";// 执行 SQL 语句preparedStatement = connection.prepareStatement(SQL);// executeQuery 执行查询操作   得到查询结果集合resultSetresultSet = preparedStatement.executeQuery();while (resultSet.next()){// 创建 Source 实体接收对应数据Source source = new Source();source.setId(resultSet.getInt("id"));source.setName(resultSet.getString("name"));source.setType(resultSet.getString("type"));source.setUploadDate(resultSet.getString("uploadDate"));// 添加到sourceList,用于返回数据sourceList.add(source);}}catch (Exception e){e.printStackTrace();}finally{// 关闭连接数据库对象,防止资源重复调用FactoryDB.Close(connection,preparedStatement,resultSet);}return sourceList;}/*** Source条件查询* @param name 名称* @return Source数据有一条的时候*/@Overridepublic Source conditionalQuery(String name){// 获取数据库连接Connection connection = FactoryDB.getConnection();PreparedStatement preparedStatement = null;ResultSet resultSet = null;Source source = null;try{// SQL 语句String SQL = "SELECT * FROM tb_source WHERE name = ?";// 执行 SQL 语句preparedStatement = connection.prepareStatement(SQL);// 装入参数preparedStatement.setString(1, name);// executeQuery 执行查询操作   得到查询结果集合resultSetresultSet = preparedStatement.executeQuery();while (resultSet.next()){// 创建 Source 实体接收对应数据source = new Source();source.setId(resultSet.getInt("id"));source.setName(resultSet.getString("name"));source.setType(resultSet.getString("type"));source.setUploadDate(resultSet.getString("uploadDate"));}}catch (Exception e){e.printStackTrace();}finally{// 关闭连接数据库对象,防止资源重复调用FactoryDB.Close(connection,preparedStatement,resultSet);}return source;}/*** Source条件查询* @param name 名称* @return  List<Source>数据有多条的时候*/@Overridepublic List<Source> conditionalQueryList(String name){// 获取数据库连接Connection connection = FactoryDB.getConnection();PreparedStatement preparedStatement = null;ResultSet resultSet = null;List<Source> sourceList = new ArrayList<>();try{String SQL = "SELECT * FROM tb_source WHERE name = ?";preparedStatement = connection.prepareStatement(SQL);preparedStatement.setString(1, name);// executeQuery 执行查询操作   得到查询结果集合resultSetresultSet = preparedStatement.executeQuery();while (resultSet.next()){// 创建 Source 实体接收对应数据Source source = new Source();source.setId(resultSet.getInt("id"));source.setName(resultSet.getString("name"));source.setType(resultSet.getString("type"));source.setUploadDate(resultSet.getString("uploadDate"));// 添加到sourceList,用于返回数据sourceList.add(source);}}catch (Exception e){e.printStackTrace();}finally{// 关闭连接数据库对象,防止资源重复调用FactoryDB.Close(connection,preparedStatement,resultSet);}return sourceList;}/** 测试对应操作是否成功 */public static void main(String[] args){// 创建SourceManageDAOByJDBCImpl对象SourceManageDAOByJDBCImpl daoImp = new SourceManageDAOByJDBCImpl();System.out.println("--------------有一条数据时------------------");// 调用 conditionalQuery 方法,Source条件查询Source source1 = daoImp.conditionalQuery("搞笑趣事");System.out.print(source1.getId() + "\t");System.out.print(source1.getName() + "\t");System.out.print(source1.getType() + "\t");System.out.println(source1.getUploadDate());System.out.println("--------------有多条数据时------------------");// 调用 conditionalQuery 方法,Source条件查询List<Source> sourceList = daoImp.conditionalQueryList("美女热舞");// 循环输出for (Source source : sourceList){System.out.print(source.getId() + "\t");System.out.print(source.getName() + "\t");System.out.print(source.getType() + "\t");System.out.println(source.getUploadDate());}}
}

(3)、测试对应操作是否成功

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

2、模糊查询

(1)、SourceManageDAOByJDBC接口实现

/*** Source模糊查询* @param name 名称* @return List<Source>模糊查询存在多条和单条数据情况使用List存储*/
List<Source> sourceFuzzyQuery(String name);

(2)、SourceManageDAOByJDBCImpl类实现

/*** Source模糊查询* @param name 名称* @return List<Source>模糊查询存在多条和单条数据情况使用List存储*/
@Override
public List<Source> sourceFuzzyQuery(String name)
{// 获取数据库连接Connection connection = FactoryDB.getConnection();PreparedStatement preparedStatement = null;ResultSet resultSet = null;List<Source> sourceList = new ArrayList<>();try{String SQL = "SELECT * FROM tb_source WHERE name LIKE ?";preparedStatement = connection.prepareStatement(SQL);preparedStatement.setString(1, "%" + name + "%");// executeQuery 执行查询操作   得到查询结果集合resultSetresultSet = preparedStatement.executeQuery();while (resultSet.next()){// 创建 Source 实体接收对应数据Source source = new Source();source.setId(resultSet.getInt("id"));source.setName(resultSet.getString("name"));source.setType(resultSet.getString("type"));source.setUploadDate(resultSet.getString("uploadDate"));// 添加到sourceList,用于返回数据sourceList.add(source);}}catch (Exception e){e.printStackTrace();}finally{// 关闭连接数据库对象,防止资源重复调用FactoryDB.Close(connection,preparedStatement,resultSet);}return sourceList;
}/** 测试对应操作是否成功 */
public static void main(String[] args)
{// 创建SourceManageDAOByJDBCImpl对象SourceManageDAOByJDBCImpl daoImp = new SourceManageDAOByJDBCImpl();// 调用 sourceFuzzyQuery 方法,Source模糊查询List<Source> sourceList = daoImp.sourceFuzzyQuery("美女");// 循环输出for (Source source : sourceList){System.out.print(source.getId() + "\t");System.out.print(source.getName() + "\t");System.out.print(source.getType() + "\t");System.out.println(source.getUploadDate());}
}

(3)、测试对应操作是否成功

在这里插入图片描述

在这里插入图片描述

3、添加数据

(1)、SourceManageDAOByJDBC接口实现

/*** 添加Source数据* @param source Source实体对象数据* @return 影响行数,因为添加数据是插入操作 数据库返回的是影响了几行(int数据)*/
int AddSourceData(Source source);

(2)、SourceManageDAOByJDBCImpl类实现

/*** 添加Source数据* @param source Source实体对象数据* @return 影响行数,因为添加数据是插入操作 数据库返回的是影响了几行(int数据)*/
@Override
public int AddSourceData(Source source)
{// 获取数据库连接Connection connection = FactoryDB.getConnection();PreparedStatement preparedStatement = null;int result = 0;try{// SQL 语句String sql = "INSERT INTO tb_source(name, type, uploadDate) VALUES (?, ?, ?)";// 执行 SQL 语句preparedStatement = connection.prepareStatement(sql);// 装入参数preparedStatement.setString(1, source.getName());preparedStatement.setString(2, source.getType());preparedStatement.setString(3, source.getUploadDate());result = preparedStatement.executeUpdate();}catch (Exception e){e.printStackTrace();}finally{// 关闭连接数据库对象,防止资源重复调用FactoryDB.Close(connection, preparedStatement, null);}return result;
}/** 测试对应操作是否成功 */
public static void main(String[] args)
{// 创建SourceManageDAOByJDBCImpl对象SourceManageDAOByJDBCImpl daoImp = new SourceManageDAOByJDBCImpl();// 创建Source对象,并且初始化数据(id设置自增)Source source = new Source();source.setName("贸易新闻");source.setType("视频");source.setUploadDate("2023-05-20");// 调用 AddSourceData 方法,Source添加数据int result = daoImp.AddSourceData(source);// 判断是否添加成功if (result != 0){System.out.println("添加Source数据成功");}else{System.out.println("添加Source数据失败!!!");}}

(3)、测试对应操作是否成功
在这里插入图片描述

在这里插入图片描述

4、修改数据

(1)、SourceManageDAOByJDBC接口实现

/*** 编辑Source数据(根据ID修改)* @param source Source实体对象数据* @param id 编号* @return 影响行数,和添加数据同理*/
int EditSourceData(Source source, int id);

(2)、SourceManageDAOByJDBCImpl类实现

/*** 编辑Source数据(根据ID修改)* @param source Source实体对象数据* @param id 编号* @return 影响行数,和添加数据同理*/
@Override
public int EditSourceData(Source source, int id)
{// 获取数据库连接Connection connection = FactoryDB.getConnection();PreparedStatement preparedStatement = null;int result = 0;try{// SQL 语句String sql = "UPDATE tb_source SET name = ?, type = ?, uploadDate = ? WHERE id = ?";// 执行 SQL 语句preparedStatement = connection.prepareStatement(sql);// 装入参数preparedStatement.setString(1, source.getName());preparedStatement.setString(2, source.getType());preparedStatement.setString(3, source.getUploadDate());preparedStatement.setInt(4, id);result = preparedStatement.executeUpdate();}catch (Exception e){e.printStackTrace();}finally{// 关闭连接数据库对象,防止资源重复调用FactoryDB.Close(connection, preparedStatement, null);}return result;
}/** 测试对应操作是否成功 */
public static void main(String[] args)
{// 创建SourceManageDAOByJDBCImpl对象SourceManageDAOByJDBCImpl daoImp = new SourceManageDAOByJDBCImpl();// 创建Source对象,并且初始化数据(id设置自增)Source source = new Source();source.setName("美女礼仪");source.setType("视频");source.setUploadDate("2023-05-24");// 调用 EditSourceData 方法,Source修改数据int result = daoImp.EditSourceData(source, 9);// 判断是否添加成功if (result != 0){System.out.println("修改Source数据成功");}else{System.out.println("修改Source数据失败!!!");}
}

(3)、测试对应操作是否成功

在这里插入图片描述

在这里插入图片描述

5、删除数据

(1)、SourceManageDAOByJDBC接口实现

/*** 删除Source数据(根据ID删除)* @param id 编号* @return 影响行数,和添加数据同理*/
int DeleteSourceData(int id);

(2)、SourceManageDAOByJDBCImpl类实现

/*** 删除Source数据(根据ID删除)* @param id 编号* @return 影响行数,和添加数据同理*/
@Override
public int DeleteSourceData(int id)
{// 获取数据库连接Connection connection = FactoryDB.getConnection();PreparedStatement preparedStatement = null;int result = 0;try{// SQL 语句String sql = "DELETE FROM tb_source WHERE id = ?";// 执行 SQL 语句preparedStatement = connection.prepareStatement(sql);// 装入参数preparedStatement.setInt(1, id);result = preparedStatement.executeUpdate();}catch (Exception e){e.printStackTrace();}finally{// 关闭连接数据库对象,防止资源重复调用FactoryDB.Close(connection, preparedStatement, null);}return result;
}/** 测试对应操作是否成功 */
public static void main(String[] args)
{// 创建SourceManageDAOByJDBCImpl对象SourceManageDAOByJDBCImpl daoImp = new SourceManageDAOByJDBCImpl();// 调用 DeleteSourceData 方法,Source删除数据int result = daoImp.DeleteSourceData( 9);// 判断是否添加成功if (result != 0){System.out.println("删除Source数据成功");}else{System.out.println("删除Source数据失败!!!");}
}

(3)、测试对应操作是否成功

在这里插入图片描述

在这里插入图片描述

先赞后看,养成习惯!!!^ _ ^ ❤️ ❤️ ❤️
码字不易,大家的支持就是我的坚持下去的动力。点赞后不要忘了关注我哦!

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

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

相关文章

前端面试 vue 按钮级的权限控制

方案一 按钮权限也可以用v-if判断 但是如果页面过多&#xff0c;每个页面页面都要获取用户权限role和路由表里的meta.btnPermissions&#xff0c;然后再做判断 这种方式就不展开举例了 方案二 使用自定义指令实现 按钮级的权限控制 思维导图 心就是自定义指令的书写 首先…

【算法】TopK问题超详解

TopK算法 TopK问题基本框架就是&#xff1a; 从n个数中&#xff0c;找出最大&#xff08;或最小&#xff09;的前k个数。 在我们生活中&#xff0c;经常会遇到TopK问题 比如大众点评的必吃榜&#xff1b;成绩单的前十名&#xff1b;各种数据的最值筛选&#xff1b; [外链图片…

【人工智能】Transformers之Pipeline(四):零样本音频分类(zero-shot-audio-classification)

​​​​​​​ 目录 一、引言 二、零样本音频分类&#xff08;zero-shot-audio-classification&#xff09; 2.1 概述 2.2 意义 2.3 应用场景 2.4 pipeline参数 2.4.1 pipeline对象实例化参数​​​​​​​ 2.4.2 pipeline对象使用参数 2.4 pipeline实战 2.5 模…

【MySQL】:对库和表的基本操作方法

数据库使用的介绍 什么是SQL 学习数据库的使用——>基于 SQL编程语言 来对数据库进行操作 重点表述的是“需求”&#xff0c;期望得到什么结果。&#xff08;至于结果是如何得到的&#xff0c;并不关键&#xff0c;都是数据库服务器在背后做好了&#xff09; 重点表述的是…

线程之间的通信

第一题 #include <stdio.h> #include <string.h> #include <stdlib.h> #include <stdarg.h> #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> #include <unistd.h> #include <dirent.h> #include <…

蔡司小乐圆:护航青少年视力健康,专业应对近视挑战

在科技日新月异的今天&#xff0c;电子产品已深度融入青少年的日常&#xff0c;为生活带来便利的同时&#xff0c;也悄然间对他们的视力构成了威胁。近视&#xff0c;这一日益严峻的健康问题&#xff0c;正牵动着无数家庭的心弦。蔡司眼镜&#xff0c;作为眼镜行业的领军者&…

7月21日,贪心练习

大家好呀&#xff0c;今天带来一些贪心算法的应用解题、 一&#xff0c;柠檬水找零 . - 力扣&#xff08;LeetCode&#xff09; 解析&#xff1a; 本题的贪心体现在对于20美元的处理上&#xff0c;我们总是优先把功能较少的10元作为找零&#xff0c;这样可以让5元用处更大 …

代码随想录算法训练营第35天|LeetCode 01背包问题 二维、01背包问题 一维、416. 分割等和子集

1. LeetCode 01背包问题 二维 题目链接&#xff1a;https://kamacoder.com/problempage.php?pid1046 文章链接&#xff1a;https://programmercarl.com/背包理论基础01背包-1.html#算法公开课 视频链接&#xff1a;https://www.bilibili.com/video/BV1cg411g7Y6/ 思路&#xf…

面向对象三大特征及其优劣接口的特点、抽象类的特点

简单介绍下面向对象三大特征&#xff1f; 封装&#xff1a;封装指的就是把对象的属性隐藏在内部&#xff0c;不允许外部对象直接访问内部信息&#xff0c;但是可以提供一些被外界访问的方法来访问属性。优点在于数据隐藏&#xff08;通过定义私有属性&#xff0c;避免直接访问…

JavaScript银行卡实名核验接口集成 代码详解

银行卡实名核验接口是一种用于验证银行卡持有人身份的服务&#xff0c;通常应用于金融机构或第三方支付平台。这种接口允许应用程序或服务发送请求&#xff0c;以验证银行卡所有者的身份信息是否与银行记录相匹配。 应对市场发展需求&#xff0c;翔云提供了银行卡实名认证接口…

压缩pdf大小的方法 指定大小软件且清晰

在数字化时代&#xff0c;pdf文件因其良好的兼容性和稳定性&#xff0c;已成为文档分享的主流格式。然而&#xff0c;高版本的pdf文件往往体积较大&#xff0c;传输和存储都相对困难。本文将为您详细介绍几种简单有效的方法&#xff0c;帮助您减小pdf文件的大小&#xff0c;让您…

Gradle构建配置包:一键生成构建脚本的秘籍

标题&#xff1a;Gradle构建配置包&#xff1a;一键生成构建脚本的秘籍 在软件开发过程中&#xff0c;构建系统是项目自动化构建的核心。Gradle&#xff0c;作为一种流行的构建自动化工具&#xff0c;以其灵活性和强大的扩展性而广受开发者欢迎。Gradle构建配置包&#xff08;…

任务3 git基础知识(主要是pr的笔记)

任务要求 https://github.com/InternLM/Tutorial/blob/camp3/docs/L0/Git/task.md 文档 https://github.com/InternLM/Tutorial/blob/camp3/docs/L0/Git/readme.md 任务 任务1&#xff1a;提交PR https://github.com/InternLM/Tutorial/pull/1242 任务2&#xff1a;实践…

UML的六大关系---泛化、实现、关联、聚合、组合、依赖

文章目录 前言1. 泛化关系(Generalization)2. 实现关系(Realization)3. ‌关联关系(Association)4. 聚合关系(Aggregation)5. 组合关系(Composition)6. 依赖关系(Dependency)总结 前言 讲到设计模式&#xff0c;就会有 U M L UML UML类图这个东西。 一开始就很难理解各种线啥意…

Android RSA 加解密

文章目录 一、RSA简介二、RSA 原理介绍三、RSA 秘钥对生成1. 密钥对生成2. 获取公钥3. 获取私钥 四、PublicKey 和PrivateKey 的保存1. 获取公钥十六进制字符串1. 获取私钥十六进制字符串 五、PublicKey 和 PrivateKey 加载1. 加载公钥2. 加载私钥 六、 RSA加解密1. RSA 支持三…

selenium.common.exceptions.NoAlertPresentException: Message:

这个错误 selenium.common.exceptions.NoAlertPresentException 表示在尝试访问警告框时&#xff0c;当前页面上并没有活动的警告框。这通常发生在两种情况下&#xff1a; 警告框实际上并没有出现&#xff0c;或者在你尝试访问它之前已经被自动处理或关闭了。你的代码在警告框…

CTF-Web习题:2019强网杯 UPLOAD

题目链接&#xff1a;2019强网杯 UPLOAD 解题思路 打开靶场如下图所示&#xff0c;是一个注册和登录界面 那就注册登录一下&#xff0c;发现是一个提交头像的页面&#xff1a; 试了一下只有能正确显示的png图片才能提交成功&#xff0c;同时F12拿到cookie&#xff0c;base6…

树形背包问题

一些题目给定了树形结构&#xff0c;在这个树形结构中选取一定数量的点或边&#xff08;也可能是其他属性&#xff09;&#xff0c;使得某种与点权或者边权相关的花费最大或者最小。解决这类问题&#xff0c;一般要考虑使用树上背包。 树上背包&#xff0c;顾名思义&#xff0c…

Linux 基础开发工具 : Vim编辑器

Vim 是 Linux 和其他类 Unix 系统上广泛使用的文本编辑器之一。它基于更早的 vi 编辑器&#xff0c;但添加了许多增强功能和扩展。Vim 是“Vi IMproved”的缩写&#xff0c;意为“改进的 Vi”&#xff0c;我们常使用Vim编辑器编写c/c代码。 ps&#xff1a;该篇介绍均为最基础介…

驱动开发系列07 - 驱动程序如何分配内存

一:概述 Linux 内核提供了丰富的内存分配函数、在本文中,我们将介绍在设备驱动程序中分配和使用内存的方法,以及如何优化系统的内存资源。由于内核为驱动程序提供了统一的内存管理接口。所以我们不会去讨论不同架构是如何管理内存的,文本不涉及分段、分页等问题,此外在本文…