MYSQL阶段_DAY01~DAY11(附笔记)

news2024/9/22 11:32:45

注意:(数据表如下)

sort表:

user表:

zhangwu表:

 

1.Part1

 JDBC操作数据库的步骤
    1.注册驱动
        告知JVM使用的是哪一个数据库的驱动,
        把驱动类的对象交给DriverManager管理,用于后面创建连接等使用。
    
    2.获得连接
    使用JDBC中的类,完成对MySOL数据库的连接
    
    3.获得语句执行平台
    通过连接对象获取对SQL语句的执行者对象
    
    4.执行sq1语句
    使用执行者对象,向我们数据库执行SOL语句
    获取到数据库的执行后的结果
    
    5.处理结果
    
    6.释放资源 一堆close()

public class JDBCDemo01 {

	public static void main(String[] args) throws Exception {
		// TODO Auto-generated method stub
		// 1.注册驱动 ,使用反射的方式(注册驱动,把驱动类的对象交给DriverManager管理,用于后面创建连接等使用。
		Class.forName("com.mysql.cj.jdbc.Driver");

		// 2.获得数据库连接
		String url = "jdbc:mysql://localhost:3306/hanstudy";
		String user = "root";
		String password = "123456";

		Connection con = DriverManager.getConnection(url, user, password);

		System.out.println("con:" + con);

		// 3.获取执行sql语句对象(获得语句执行平台,即通过连接对象获取对SQL语句的执行者对象)
		Statement state = con.createStatement();

		// 4.执行sq1语句 与 处理结果
		/*
		 *  增删改:int executeUpdate(String sql); --执行insert update delete语句.
		 * 
		 *  查询:ResultSet executeQuery(String sql); --执行select语句.
		 * 
		 */

		// (1)增加
		// int i = state.executeUpdate("insert into sort values(7,'汽车用品',766)");//以这个为例,注意是单引号
		// System.out.println("i:"+i);

		// (2)查询
		String sql = "SELECT * FROM sort;";
		ResultSet resultSet = state.executeQuery(sql);
		//注意: 没有调用该方法之前, ResultSet的光标在第一条记录之前, 只有调用一次next方法后, 指针才会查询下一条记录
		while (resultSet.next()) { // 当查询到的结果集有下一内容,则输出如下格式的内容...

			// int sid = resultSet.getInt(1);//第一列的数据,因为他是整型,所以要对应才可以
			String sid = resultSet.getString("sid"); // 或者直接String

			String sname = resultSet.getString("sname");

			// float sprice = resultSet.getFloat(3);//第三列的数据,因为他是浮点型
			String sprice = resultSet.getString("price");

			System.out.println(sid + "\t" + sname + "\t" + sprice);
		}

		// 6.关闭资源
		resultSet.close();
		state.close();
		con.close();

	}

}

 2.Part2

SQL演示注入攻击  
 *         statement的弊端!

public class JDBCDemo02 {
	 public static void main(String[] args) throws ClassNotFoundException, SQLException {
	        // 1.注册驱动, 使用反射的方式
	        Class.forName("com.mysql.cj.jdbc.Driver");
	        // 2.获取连接对象
	        String url = "jdbc:mysql://localhost:3306/hanstudy";
	        String user = "root";
	        String password = "123456";
	        Connection connection = DriverManager.getConnection(url, user, password);
	        // 3.通过Connection对象获取Statement对象
	        Statement statement = connection.createStatement();

	        Scanner sc = new Scanner(System.in);
	        
	        String name = sc.nextLine();
	        String pwd = sc.nextLine();  //输入:ahj' or '1=1
	        
	        // 执行查询
	        String sql = "select * from user where name= '"+name+"' and password ='"+pwd+"'";
	        
	        
	        System.out.println(sql);
	        ResultSet resultSet = statement.executeQuery(sql);
	        while (resultSet.next()) {
	            String sid = resultSet.getString("id");
	            String sname = resultSet.getString("name");
	            String pawd = resultSet.getString("password");
	         
	            System.out.println(sid + "\t" + sname + "\t" + pawd );
	        }
	        System.out.println("输出完成...");

	        // 6. 释放资源
	        resultSet.close();
	        statement.close();
	        connection.close();
	    }
}

3.Part3

 * 预编译处理对象 ,防止注入攻击!
 * 
 *         preparedstatement的查询功能

public class JDBCDemo03 {
	public static void main(String[] args) throws ClassNotFoundException, SQLException {
		// 1.注册驱动, 使用反射的方式
		Class.forName("com.mysql.cj.jdbc.Driver");
		// 2.获取连接对象
		String url = "jdbc:mysql://localhost:3306/hanstudy";
		String user = "root";
		String password = "123456";
		Connection connection = DriverManager.getConnection(url, user, password);

		// 查询所有记录
		Scanner sc = new Scanner(System.in);
		String name = sc.nextLine();
		String pwd = sc.nextLine(); // 输入:ahj' or '1=1

		// 执行查询
		String sql = "select * from user where name= ? AND password = ? ";
		

		//1.创建preparedStatement对象,预编译处理
		PreparedStatement prepareStatement = connection.prepareStatement(sql);
		
		
		//2.预编译处理对象传递参数
		prepareStatement.setObject(1, name); //注意这个方法是setXX
		prepareStatement.setObject(2, pwd);  //注意这个方法是setXX
		
		
		//3.预编译处理对象调用方法
		ResultSet resultSet = prepareStatement.executeQuery();
		
		while (resultSet.next()) {
			String sid = resultSet.getString("id");
			String sname = resultSet.getString("name");
			String pawd = resultSet.getString("password");

			System.out.println(sid + "\t" + sname + "\t" + pawd);
		}
		
		System.out.println("输出完成...");

		// 6. 释放资源
		resultSet.close();
		prepareStatement.close();
		connection.close();
	}
}

4.Part4

 预编译处理对象的增删改方法!

public class JDBCDemo04 {

	public static void main(String[] args) throws Exception {

//		demo01();
//		demo02();
		demo03();

	}

	// 增加
	public static void demo01() throws Exception {
		// 1注册驱动
		Class.forName("com.mysql.cj.jdbc.Driver");
		// 2获取连接
		Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/hanstudy", "root", "123456");
		// 3获得预处理对象
		String sql = "insert into sort(sname) values(?)";
		PreparedStatement stat = conn.prepareStatement(sql);
		// 4 SQL语句占位符设置实际参数
		stat.setString(1, "奢侈品");  //注意这个方法是setXX

		// 5执行SQL语句
		int line = stat.executeUpdate();

		System.out.println("新添加记录数:" + line);
		// 6释放资源
		stat.close();
		conn.close();
	}

	// 修改
	public static void demo02() throws Exception {
		// 1注册驱动
		Class.forName("com.mysql.cj.jdbc.Driver");
		// 2获取连接
		Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/hanstudy", "root", "123456");
		// 3获得预处理对象中
		String sql = "update sort set sname=? where sid=?";
		PreparedStatement stat = conn.prepareStatement(sql);
		// 4 SQL语句占位符设置实际参数
		stat.setString(1, "数码产品");  //注意这个方法是setXX
		stat.setInt(2, 1);
		// 5执行SQL语句
		int line = stat.executeUpdate();
		System.out.println("更新记录数:" + line);
		// 6释放资源
		stat.close();
		conn.close();
	}

	// 删除
	public static void demo03() throws Exception {
		// 1注册驱动
		Class.forName("com.mysql.cj.jdbc.Driver");
		// 2获取连接
		Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/hanstudy", "root", "123456");
		// 3获得预处理对象
		String sql = "delete from sort where sid=?";
		PreparedStatement stat = conn.prepareStatement(sql);
		// 4 SQL语句占位符设置实际参数
		stat.setInt(1, 10);  //注意这个方法是setXX
		// 5执行SQL语句
		int line = stat.executeUpdate();
		System.out.println("删除记录数:" + line);
		// 6释放资源
		stat.close();
		conn.close();
	}

}

5.Part5

 * 预编译处理对象的查询方法

public class JDBCDemo05 {

	public static void main(String[] args) throws Exception {

		demo04();
		System.out.println("--------------");
		demo05();
		
	}

	public static void demo04() throws Exception {
		// 1注册驱动
		Class.forName("com.mysql.cj.jdbc.Driver");
		// 2获取连接
		Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/hanstudy", "root", "123456");
		// 3获得预处理对象
		String sql = "select * from sort";
		PreparedStatement stat = conn.prepareStatement(sql);
		// 4 SQL语句占位符设置实际参数
		// 5执行SQL语句
		ResultSet rs = stat.executeQuery();
		// 6处理结果集(遍历结果集合)
		while (rs.next()) {
			// 获取当前行的分类ID
			String sid = rs.getString("sid");// 方法参数为数据库表中的列名
			// 获取当前行的分类名称
			String sname = rs.getString("sname");
			// 获取当前行的分类价格
			String sprice = rs.getString("price");
			// 显示数据
			System.out.println(sid + "-----" + sname + "-----" + sprice);
		}
		// 7释放资源
		rs.close();
		stat.close();
		conn.close();
	}

	public static void demo05() throws Exception {
		// 1注册驱动
		Class.forName("com.mysql.cj.jdbc.Driver");
		// 2获取连接
		Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/hanstudy", "root", "123456");
		// 3获得预处理对象
		String sql = "select * from sort where sname=?";
		PreparedStatement stat = conn.prepareStatement(sql);
		// 4 SQL语句占位符设置实际参数
		stat.setString(1, "汽车用品");
		// 5执行SQL语句
		ResultSet rs = stat.executeQuery();
		// 6处理结果集(遍历结果集合)
		while (rs.next()) {
			// 获取当前行的分类ID
			String sid = rs.getString("sid");// 方法参数为数据库表中的列名
			// 获取当前行的分类名称
			String sname = rs.getString("sname");
			
			// 获取当前行的分类价格
			String sprice = rs.getString("price");
			
			// 显示数据
			System.out.println(sid + "-----" + sname + "-----" + sprice);
		}
		// 7释放资源
		rs.close();
		stat.close();
		conn.close();
	}

}

6.Part6

 * 编写JDBC工具类JDBCUtils
 *         将注册驱动和获取连接等代码编写后封装到此

public class JDBCUtils {
	// 私有构造方法
    private JDBCUtils() {}

    // 定义静态的连接对象作为成员变量
    private static Connection connection;

    // 使用静态代码块执行注册驱动和获取连接
    static {
        try {
            // 注册驱动
            Class.forName("com.mysql.cj.jdbc.Driver");
            // 获取连接
            String url = "jdbc:mysql://localhost:3306/hanstudy";
            String user = "root";
            String password = "123456";
            connection = DriverManager.getConnection(url, user, password);
        } catch (Exception e) {
            e.printStackTrace();
            throw new RuntimeException(e+"数据库连接失败");
        }
    }

    // 获取连接
    public static Connection getConnection() {
        return connection;
    }

    // 释放资源  判断不为空就关闭资源
    public static void close(Connection connection, Statement statement, ResultSet resultSet) {
        if (resultSet != null) {
            try {
                resultSet.close();
            } catch (SQLException e) {}
        }
        if (statement != null) {
            try {
                statement.close();
            } catch (SQLException e) {}
        }
        if (connection != null) {
            try {
                connection.close();
            } catch (SQLException e) {}
        }
    }
}

 * 测试JDBC工具类
 *         执行增删改查操作

public class TestJDBCUtils {
	public static void main(String[] args) throws Exception {
		// 加载、注册驱动, 使用工具类获取连接
		Connection connection = JDBCUtils.getConnection();

		demo04(connection);
		
//		demo05(connection);

//		demo01(connection);
		
//		demo02(connection);
		
//		demo03(connection);

	}

	// 增加
	public static void demo01(Connection connection) throws Exception {
		// 3获得预处理对象
		String sql = "insert into sort(sname) values(?)";
		PreparedStatement stat = connection.prepareStatement(sql);
		// 4 SQL语句占位符设置实际参数
		stat.setString(1, "护肤品"); // 注意这个方法是setXX

		// 5执行SQL语句
		int line = stat.executeUpdate();

		System.out.println("新添加记录数:" + line);
		// 6释放资源
		JDBCUtils.close(connection, stat, null);
	}

	// 修改
	public static void demo02(Connection connection) throws Exception {

		// 3获得预处理对象中
		String sql = "update sort set sname=? where sid=?";
		PreparedStatement stat = connection.prepareStatement(sql);
		// 4 SQL语句占位符设置实际参数
		stat.setString(1, "数码产品WUWU"); // 注意这个方法是setXX
		stat.setInt(2, 1);
		// 5执行SQL语句
		int line = stat.executeUpdate();
		System.out.println("更新记录数:" + line);
		// 6释放资源
		JDBCUtils.close(connection, stat, null);
	}

	// 删除
	public static void demo03(Connection connection) throws Exception {

		// 3获得预处理对象
		String sql = "delete from sort where sid=?";
		PreparedStatement stat = connection.prepareStatement(sql);
		// 4 SQL语句占位符设置实际参数
		stat.setInt(1, 9); // 注意这个方法是setXX
		// 5执行SQL语句
		int line = stat.executeUpdate();
		System.out.println("删除记录数:" + line);

		// 6释放资源
		JDBCUtils.close(connection, stat, null);
	}
	
	//查询
	public static void demo04(Connection connection) throws Exception {

		// 3获得预处理对象
		String sql = "select * from sort";
		PreparedStatement stat = connection.prepareStatement(sql);
		// 4 SQL语句占位符设置实际参数
		// 5执行SQL语句
		ResultSet rs = stat.executeQuery();
		// 6处理结果集(遍历结果集合)
		while (rs.next()) {
			// 获取当前行的分类ID
			String sid = rs.getString("sid");// 方法参数为数据库表中的列名
			// 获取当前行的分类名称
			String sname = rs.getString("sname");
			// 获取当前行的分类价格
			String sprice = rs.getString("price");
			// 显示数据
			System.out.println(sid + "-----" + sname + "-----" + sprice);
		}
		// 7释放资源
			JDBCUtils.close(connection, stat, rs);
	}
	
	//查询
	public static void demo05(Connection connection) throws Exception {
		
		// 3获得预处理对象
		String sql = "select * from sort where sname=?";
		PreparedStatement stat = connection.prepareStatement(sql);
		// 4 SQL语句占位符设置实际参数
		stat.setString(1, "汽车用品");
		// 5执行SQL语句
		ResultSet rs = stat.executeQuery();
		// 6处理结果集(遍历结果集合)
		while (rs.next()) {
			// 获取当前行的分类ID
			String sid = rs.getString("sid");// 方法参数为数据库表中的列名
			// 获取当前行的分类名称
			String sname = rs.getString("sname");
			
			// 获取当前行的分类价格
			String sprice = rs.getString("price");
			
			// 显示数据
			System.out.println(sid + "-----" + sname + "-----" + sprice);
		}
		// 7释放资源
		JDBCUtils.close(connection, stat, rs);
	}


}

7.Part7

* JDBC读取sort表,封装到sort类中

public class JDBCDemo06 {

	public static void main(String[] args) throws Exception {
		Connection conn = JDBCUtils.getConnection();
		
		//创建预编译对象
		PreparedStatement pst = conn.prepareStatement("select * from sort");
		
		//执行SQL语句
		ResultSet resultSet = pst.executeQuery();
		
		//创建集合对象
		List<Sort> list = new ArrayList<Sort>();  
		
		while(resultSet.next()){
			Sort s = new Sort(resultSet.getInt("sid"),resultSet.getString("sname"),resultSet.getFloat("price"));  //根据名称获取列数据
			
			//添加到集合
			list.add(s);
		}
		JDBCUtils.close(conn, pst, resultSet);
		
		//增强for遍历集合
		for(Sort s: list){
			System.out.println(s);
		}
		
		
		
	}
}

 * 与数据表对应的类,注意属性要和字段名一样!

public class Sort {

	private int sid;
	
	private String sname;
	
	private float price;

	public Sort(int sid, String sname, float price) {
		super();
		this.sid = sid;
		this.sname = sname;
		this.price = price;
	}

	public int getSid() {
		return sid;
	}

	public void setSid(int sid) {
		this.sid = sid;
	}

	public String getSname() {
		return sname;
	}

	public void setSname(String sname) {
		this.sname = sname;
	}

	public float getPrice() {
		return price;
	}

	public void setPrice(float price) {
		this.price = price;
	}

	@Override
	public String toString() {
		return "sort [sid=" + sid + ", sname=" + sname + ", price=" + price + "]";
	}
	
	
	
	
}

8.Part8

配置文件properties

 * 加载properties配置文件,IO流读取文件

public class PropertiesDemo {

	public static void main(String[] args) throws IOException, Exception {
		// 1.获取类加载器: 获取某个类的字节码对象, 通过字节码对象获取类加载器对象
		ClassLoader classLoader = PropertiesDemo.class.getClassLoader();
		// 2.使用类加载器对象加载配置文件, 返回字节输入流
		InputStream in = classLoader.getResourceAsStream("database.properties");
		// 3.使用Properties加载输入流, 获得键值对信息
		Properties properties = new Properties();
		properties.load(in);

		String driver = properties.getProperty("driver");
		String url = properties.getProperty("url");
		String user = properties.getProperty("user");
		String password = properties.getProperty("password");

		Class.forName(driver);
		Connection connection = DriverManager.getConnection(url, user, password);

		System.out.println(connection);
	}
}

 * 使用配置文件的JDBC工具类:JBDCUtilsVersion2

public class JBDCUtilsVersion2 {
	// 声明静态变量
    private static Connection connection;
    private static String driverClass;
    private static String url;
    private static String username;
    private static String password;

    // 静态代码块进行初始化
    static {
        try {
            // 读取配置文件
            readConfig();
            // 注册驱动
            Class.forName(driverClass);
            // 获取连接
            connection = DriverManager.getConnection(url, username, password);
        } catch (Exception e) {
            e.printStackTrace();
            throw new RuntimeException("数据库连接失败");
        }
    }

    // 私有构造方法
    private JBDCUtilsVersion2() {}

    // 读取配置文件方法
    private static void readConfig() throws Exception {
        // 使用类加载器加载bin目录下的配置文件, 获取输入流
        InputStream in = JBDCUtilsVersion2.class.getClassLoader().getResourceAsStream("database.properties");
        // 创建Properties对象
        Properties properties = new Properties();
        // 加载数据
        properties.load(in);
        // 通过键获取值
        driverClass = properties.getProperty("driver");
        url = properties.getProperty("url");
        username = properties.getProperty("user");
        password = properties.getProperty("password");
    }

    // 返回连接对象
    public static Connection getConnection() {
        return connection;
    }
}

  测试JDBC工具类:TestJDBCUtileVersion2

public class TestJDBCUtileVersion2 {
	
	public static void main(String[] args) throws Exception {
		// 加载、注册驱动, 使用工具类获取连接
		Connection connection = JBDCUtilsVersion2.getConnection();

//		demo04(connection);
		
//		demo05(connection);

//		demo01(connection);
		
//		demo02(connection);
		
		demo03(connection);

	}

	// 增加
	public static void demo01(Connection connection) throws Exception {
		// 3获得预处理对象
		String sql = "insert into sort(sname) values(?)";
		PreparedStatement stat = connection.prepareStatement(sql);
		// 4 SQL语句占位符设置实际参数
		stat.setString(1, "保健品"); // 注意这个方法是setXX

		// 5执行SQL语句
		int line = stat.executeUpdate();

		System.out.println("新添加记录数:" + line);
		// 6释放资源
		JBDCUtilsVersion2.close(connection, stat, null);
	}

	// 修改
	public static void demo02(Connection connection) throws Exception {

		// 3获得预处理对象中
		String sql = "update sort set sname=? where sid=?";
		PreparedStatement stat = connection.prepareStatement(sql);
		// 4 SQL语句占位符设置实际参数
		stat.setString(1, "数码产品"); // 注意这个方法是setXX
		stat.setInt(2, 1);
		// 5执行SQL语句
		int line = stat.executeUpdate();
		System.out.println("更新记录数:" + line);
		// 6释放资源
		JBDCUtilsVersion2.close(connection, stat, null);
	}

	// 删除
	public static void demo03(Connection connection) throws Exception {

		// 3获得预处理对象
		String sql = "delete from sort where sid=?";
		PreparedStatement stat = connection.prepareStatement(sql);
		// 4 SQL语句占位符设置实际参数
		stat.setInt(1, 12); // 注意这个方法是setXX
		// 5执行SQL语句
		int line = stat.executeUpdate();
		System.out.println("删除记录数:" + line);

		// 6释放资源
		JBDCUtilsVersion2.close(connection, stat, null);
	}
	
	//查询
	public static void demo04(Connection connection) throws Exception {

		// 3获得预处理对象
		String sql = "select * from sort";
		PreparedStatement stat = connection.prepareStatement(sql);
		// 4 SQL语句占位符设置实际参数
		// 5执行SQL语句
		ResultSet rs = stat.executeQuery();
		// 6处理结果集(遍历结果集合)
		while (rs.next()) {
			// 获取当前行的分类ID
			String sid = rs.getString("sid");// 方法参数为数据库表中的列名
			// 获取当前行的分类名称
			String sname = rs.getString("sname");
			// 获取当前行的分类价格
			String sprice = rs.getString("price");
			// 显示数据
			System.out.println(sid + "-----" + sname + "-----" + sprice);
		}
		// 7释放资源
		JBDCUtilsVersion2.close(connection, stat, rs);
	}
	
	//查询
	public static void demo05(Connection connection) throws Exception {
		
		// 3获得预处理对象
		String sql = "select * from sort where sname=?";
		PreparedStatement stat = connection.prepareStatement(sql);
		// 4 SQL语句占位符设置实际参数
		stat.setString(1, "汽车用品");
		// 5执行SQL语句
		ResultSet rs = stat.executeQuery();
		// 6处理结果集(遍历结果集合)
		while (rs.next()) {
			// 获取当前行的分类ID
			String sid = rs.getString("sid");// 方法参数为数据库表中的列名
			// 获取当前行的分类名称
			String sname = rs.getString("sname");
			
			// 获取当前行的分类价格
			String sprice = rs.getString("price");
			
			// 显示数据
			System.out.println(sid + "-----" + sname + "-----" + sprice);
		}
		// 7释放资源
		JBDCUtilsVersion2.close(connection, stat, rs);
	}


}

Gitee学习笔记:MySQL · 许AX/MySQL - 码云 - 开源中国 (gitee.com)

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

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

相关文章

一文理解MySQL的For Update行级锁

一文理解MySQL的For Update行级锁 引言一、MySQL的For Update简介1.1、For Update的作用1.2、For Update与其他锁定方式的区别 二、For Update的语法2.1、SELECT语句的基本语法2.2、mysql如何开启事务和提交事务&#xff1f;2.3、使用For Update进行数据锁定 三、如何使用For U…

王道计算机网络学习笔记(2)——物理层

前言 文章中的内容来自B站王道考研计算机网络课程&#xff0c;想要完整学习的可以到B站官方看完整版。 二&#xff1a;物理层 2.1.1&#xff1a;物理层基本概念 2.1.2&#xff1a;数据通信基本知识 1、数据通信模型和基本概念 通信目的是为了传递消息&#xff08;消息&…

2022 年第十二届 MathorCup 高校数学建模挑战赛D题思路(移动通信网络站址规划和区域聚类问题)

目录 一、前言 二、问题背景 三、问题 四、解题思路 &#xff08;1&#xff09;针对问题1&#xff1a; &#xff08;2&#xff09;针对问题2&#xff1a; &#xff08;3&#xff09;针对问题3&#xff1a; 五、附上几个典型代码 &#xff08;1&#xff09;K-means算法…

6月16日,企业快成长技术创新论坛厦门站大数据专场开启!

全球大数据规模增长快速&#xff0c;2020年全球新增数据规模为64ZB&#xff0c;是2016年的400%&#xff0c;2035年新增数据将高达2140ZB1&#xff0c;大数据呈现指数级增长。随着数字经济的发展和数字化转型的深入&#xff0c;愈来愈多的数据资源正以数据要素的形态独立存在并参…

STM32F4_DS18B20红外温度传感器

目录 前言 1. 单总线时序结构 2. DS18B20结构 2.1 DS18B20操作流程 2.2 DS18B20数据帧 3. 温度存储格式 4. 硬件分析 5. 实验程序详解 5.1 main.c 5.2 DS18B20.c 5.3 DS18B20.h 前言 STM32F4内部集成了温度传感器。在之前的学习中&#xff0c;我们已经学习了使用AD进…

宁波天一永安杯初赛 wp-AGCTS战队

文章目录 MISCZipSimpleDocumentBeautifulImage WebDeserializationCodeCheck CryptoSecretRsa MobilePeacock pwnwingtip REPolenta MISC Zip ARCHPR 直接数字爆破&#xff0c;得到二进制密码&#xff0c;得 flag SimpleDocument Kali binwalk 发现里面有一 pdf 文件&#…

DRIFTINGBLUES: 3实战演练

文章目录 DRIFTINGBLUES: 3实战演练一、前期准备1、相关信息 二、信息收集1、端口扫描2、访问网站3、访问网页4、翻译内容5、访问网页6、翻译内容8、查看源码9、解密10、访问网页11、写入shell并登录12、连接shell13、查找nc14、反弹shell 三、后渗透1、进入家目录查找文件2、写…

分布式应用 ----- 点对点(p2p)网络

目录 1. 概述 1.1. P2P的概念 1.2. P2P产生的背景 1.3. P2P的优劣势 2. P2P分类 2.1. 根据中央化程度 2.2. 根据网络拓扑结构 3. NAT技术详解 3.1. 概述 3.2. NAT的优劣势 3.3. NAT穿透常见解决方案 3.4. 探针打洞基本原理 3.4.1. 基本原理 3.4.2. 同一个NAT网关内…

2023年企业云盘排行榜,这些产品值得尝试!

在当今信息技术高度发达的时代&#xff0c;企业对于信息的存储和管理需求越来越高。因此&#xff0c;企业云盘逐渐成为了企业存储与管理的重要组成部分。企业云盘能够实现多设备共享、远程控制、安全备份、合作办公等多种功能&#xff0c;方便高效地解决企业内部信息管理问题。…

【AIGC】17、MM-OVOD | 同时使用文本示例和图像示例来指导分类

文章目录 一、背景二、方法2.1 框架总览2.1.1 Text-based classifiers from language descriptions2.1.2 Vision-based Classifiers from Image Exemplars2.1.3 Constructing Classifiers via Multi-Modal Fusion 三、效果3.1 数据集3.2 实现细节3.3 开集目标检测结果 论文&…

双向交错CCM图腾柱无桥单相PFC学习仿真与实现(2)SOGI_PLL学习仿真总结

目录 前言 SOGI基本原理 锁相环基本原理 仿真实现及说明 总结 前言 前面总结了双向交错CCM图腾柱无桥单相PFC系统实现&#xff0c;后面把问题细分&#xff0c;关于SOGI锁相环的应用和学习在这里总结下。 双向交错CCM图腾柱无桥单相PFC学习仿真与实现&#xff08;1&#x…

Collection接口详细介绍(下)

前言&#xff1a; 本篇文章主要讲解Java中的Collection接口以及相关实现类的知识。该专栏比较适合刚入坑Java的小白以及准备秋招的大佬阅读。 如果文章有什么需要改进的地方欢迎大佬提出&#xff0c;对大佬有帮助希望可以支持下哦~ 小威在此先感谢各位小伙伴儿了&#x1f601…

CSDN 周赛 59 期

CSDN 周赛 59 期 前言判断题单选题题目1题目2填空题编程题1、题目名称:坏掉的打字机2、题目名称:布尔零点计数小结前言 由于最近,csdn 每日一练新增了两个题目,按照惯例,那么新增的题目,会就近出现在最近的 CSDN 周赛中,嗯,经常参加周赛,并关注每日一练社区的小伙伴应…

51单片机一个TIMER输出6个PWM

51单片机的timer很少&#xff0c;往往16bit的timer只有一个&#xff0c;可以硬件输出的channel也不多。如我手上这就是这个情况&#xff0c;timer1, 16bit, 只有三个通道。我想输出6个pwm&#xff0c;这个就无法硬件的方式了。只能使用软件模拟了。pwm是1-20ms一个周期&#xf…

Thinking in Java第四版2.8注释和嵌入式文档

文章目录 前言一、注释风格1.单行注释2.多行注释 二、语法三、标签总结 前言 Java8官方在线文档 文档描述对每个系统来说都是必备且重要的&#xff0c;这里将介绍一些javadoc标签&#xff0c;以便加深对文档的理解和编写等。 一、注释风格 1.单行注释 单行注释以一个//起头&a…

JavaWeb之tomcarHTTP

1 DOM4j Xml解析 1.1 JAXP  JDK内置&#xff0c;不需要导入第三方jar包&#xff0c;简单工具优先选择。  支持两种解析方式&#xff1a;DOM、SAX 1.1.1 JAXP—DOM 加载xml 生成一个DOM树。获得整个文档的描述对象Document 解析 api 获得工厂 DocumentBuilderFactory –》 …

【MySql】MySql的事务基础篇

文章目录 CURD加控制什么是事物为什么会出现事务事务的版本支持事务的提交方式 CURD加控制 模拟一个买票系统的场景如下所示&#xff1a; MySQL注定会被多个客户端进行访问的&#xff0c;这个是肯定的&#xff0c;存储的都是数据&#xff0c;数据在上层可能有一个线程在用&…

C++17

目录 基本语言特性结构化绑定if和switch初始化器 std::string_view属性[[nodiscard]][[maybe_unused]][[fallthrough]] 模板特性新的标准库组件std::optional<>std::variant<>std::anystd::bytestd::as_const 文件系统库零星新特性 基本语言特性 结构化绑定 概念…

ubuntu安装WPS2019以及解决缺少字体问题

环境&#xff1a;ubuntu22.04.2 LTS 步骤&#xff1a; 1.去官网下载最新的WPS&#xff0c;官网地址如下&#xff1a;WPS Office 2019 for Linux-支持多版本下载_WPS官方网站 2.sudo dpkg -i 安装包.deb 3.安装完成&#xff0c;首次用WPS打开某个文档&#xff0c;会出现如下报…

硬件入门之什么是三极管

硬件入门之什么是三极管 文章目录 硬件入门之什么是三极管一、三极管是什么&#xff1f;&#xff08;百度百科&#xff09;三极管的3种工作状态分别是截止状态、放大状态、饱和状态 二、实际应用场景1.放大电路 &#xff08;放大状态&#xff09;2、开关电路&#xff08;截至状…