32、Java——迷你图书管理器(对象+JDBC)

news2024/12/21 4:23:20

✅作者简介:热爱国学的Java后端开发者,修心和技术同步精进。

🍎个人主页:乐趣国学的博客

🍊个人信条:不迁怒,不贰过。小知识,大智慧。

💞当前专栏:Java案例分享专栏

✨特色专栏:国学周更-心性养成之路

🥭本文内容:Java——迷你图书管理器(对象+JDBC)

更多内容点击👇

                       Java——迷你图书管理器(对象+XML)

                       Java——迷你图书管理器(对象+IO流)

                       Java——迷你图书管理器(对象+集合)

                       Java——迷你图书管理器(对象+数组)

⛳️ 项目需求

为某图书馆开发一个迷你图书管理系统,实现图书的管理,包括如下功能:

        (1)新增图书

        (2)查看图书

        (3)删除图书

        (4)借出图书

        (5)归还图书

        (6)退出图书系统

⛳️ 覆盖知识

        程序基本概念、数据类型、流程控制、顺序、选择 、循环、跳转语句、变量、类、方法、数据库、JDBC等相关知识

⛳️ 开发思路 

(1)明确需求

(2)编码顺序

        1)、数据初始化

        2)、循环完成各种图书管理操作

        3)、菜单切换

(3)测试

⛳️ 开发步骤

❤️ 1、数据初始化

 (1)设计一个包含图书信息的类:Book类

 (2)设计一个数据库的工具类:DBUtils类

 (3)设计一个图书的增删改查操作的Dao层类:BookDaoImpl类

 (4)设计一个逻辑操作Service层类:BookServiceImpl类

 (5)设计一个图书管理系统测试类:MyBookSystem类

 (6)创建数据库和数据表

CREATE DATABASE IF NOT EXISTS `java221804`;
CREATE TABLE IF NOT EXISTS book(
	`name` VARCHAR(20),
	`state` INT,
	`date` INT,
	`count` INT
);

 (7)创建.properties文件,用来获取数据库初始化数据

❤️ 2、BookDaoImpl类中的部分重要方法

        增加图书的方法 

    public int insert(Book book) {
        // 获取连接
        connection = DBUtils.getConnection();
        String sql = "insert into book values(?,?,?,?);";
        try {
            preS = connection.prepareStatement(sql);
            preS.setString(1, book.getName());
            preS.setInt(2, book.getState());
            preS.setInt(3, book.getDate());
            preS.setInt(4, book.getCount());

            return preS.executeUpdate();
        } catch (SQLException e) {
            e.printStackTrace();
        }
        return 0;
    }

        查询全部图书的方法

	public List<Book> selectAll() {
		List<Book> books=new ArrayList<Book>();
		// 获取连接
		connection = DBUtils.getConnection();
		String sql = "select * from book;";
		try {
			preS = connection.prepareStatement(sql);

			resultSet=preS.executeQuery();
			while(resultSet.next()){
				Book book=new Book(resultSet.getNString(1), resultSet.getInt(2), resultSet.getInt(3), resultSet.getInt(4));
				books.add(book);
			}
			return books;
		} catch (SQLException e) {
			e.printStackTrace();
		}
		return null;
	}

        欢迎使用迷你图书管理器方法

        新增图书方法

        查看图书方法

        删除图书方法

        借出图书方法

        归还图书方法

        退出图书方法

        欢迎首界面:

    //欢迎使用迷你图书管理器方法
	public static void useBookSystem() {
		// 输出欢迎菜单
		System.out.println("欢迎使用迷你图书管理器");
		System.out.println("-------------------------");
		System.out.println("1.新增图书");
		System.out.println("2.查看图书");
		System.out.println("3.删除图书");
		System.out.println("4.借出图书");
		System.out.println("5.归还图书");
		System.out.println("6.退出图书");
		System.out.println("-------------------------");
	}

⛳️ 全部代码展示 

❤️ 1、Book类

package cn.bdqn.demo01;

import java.io.Serializable;

@SuppressWarnings("serial")
public class Book implements Serializable {
	//定义属性
	private String name;
	private int state;
	private int date;
	private int count;
	
	//添加无参构造
	public Book() {
		super();
	}

	//添加有参构造
	public Book(String name, int state, int date, int count) {
		super();
		this.name = name;
		this.state = state;
		this.date = date;
		this.count = count;
	}

	//添加get/set方法
	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public int getState() {
		return state;
	}

	public void setState(int state) {
		this.state = state;
	}

	public int getDate() {
		return date;
	}

	public void setDate(int date) {
		this.date = date;
	}

	public int getCount() {
		return count;
	}

	public void setCount(int count) {
		this.count = count;
	}
	
}

❤️ 2、DBUtils类

package cn.bdqn.demo01;

import java.io.IOException;
import java.io.InputStream;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Properties;



public class DBUtils {

	private static final Properties PROPERTIES =new Properties();
	
	static{
		InputStream is = DBUtils.class.getResourceAsStream("/db.properties");
		try {
			PROPERTIES.load(is);
			//1、注册驱动
			Class.forName(PROPERTIES.getProperty("driver"));
		} catch (IOException e) {
			e.printStackTrace();
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		}
	}

	// 2、获取连接方法
	public static Connection getConnection(){
		Connection connection = null;
		//2、获取连接对象
		try {
			connection=DriverManager.getConnection(PROPERTIES.getProperty("url"), PROPERTIES.getProperty("username"), PROPERTIES.getProperty("password"));
		} catch (SQLException e) {
			e.printStackTrace();
		}
		return connection;
		
	}

	// 3、释放资源方法
	public static void closeAll(ResultSet resultSet, Statement statement,
			Connection connection) {
		try {
			if (resultSet != null) {
				resultSet.close();
			}
			if(statement!=null){
				statement.close();
			}
			if(connection!=null){
				connection.close();
			}
		} catch (SQLException e) {
			e.printStackTrace();
		}
	}
}

❤️ 3、 BookDaoImpl类

package cn.bdqn.demo01;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

public class BookDaoImpl {

	// 全局变量
	Connection connection = null;
	PreparedStatement preS = null;
	ResultSet resultSet=null;

	// 增
	public int insert(Book book) {
		// 获取连接
		connection = DBUtils.getConnection();
		String sql = "insert into book values(?,?,?,?);";
		try {
			preS = connection.prepareStatement(sql);
			preS.setString(1, book.getName());
			preS.setInt(2, book.getState());
			preS.setInt(3, book.getDate());
			preS.setInt(4, book.getCount());

			return preS.executeUpdate();
		} catch (SQLException e) {
			e.printStackTrace();
		}
		return 0;
	}

	// 删
	public int delete(Book book) {
		// 获取连接
		connection = DBUtils.getConnection();
		String sql = "delete from book where name=?;";
		try {
			preS = connection.prepareStatement(sql);
			preS.setString(1, book.getName());

			return preS.executeUpdate();
		} catch (SQLException e) {
			e.printStackTrace();
		}
		return 0;
	}

	// 改
	public int update(Book book) {
		// 获取连接
		connection = DBUtils.getConnection();
		String sql = "update book set state=?,date=?,count=? where name=?;";
		try {
			preS = connection.prepareStatement(sql);
			preS.setInt(1, book.getState());
			preS.setInt(2, book.getDate());
			preS.setInt(3, book.getCount());
			preS.setString(4, book.getName());

			return preS.executeUpdate();
		} catch (SQLException e) {
			e.printStackTrace();
		}
		return 0;
	}

	// 查一条
	public Book select(String name) {
		// 获取连接
		connection = DBUtils.getConnection();
		String sql = "select * from book where name=?;";
		try {
			preS = connection.prepareStatement(sql);
			preS.setString(1, name);

			resultSet=preS.executeQuery();
			if(resultSet.next()){
				Book book=new Book(resultSet.getNString(1), resultSet.getInt(2), resultSet.getInt(3), resultSet.getInt(4));
				return book;
			}
		} catch (SQLException e) {
			e.printStackTrace();
		}
		return null;
	}
	
	// 查全部
	public List<Book> selectAll() {
		List<Book> books=new ArrayList<Book>();
		// 获取连接
		connection = DBUtils.getConnection();
		String sql = "select * from book;";
		try {
			preS = connection.prepareStatement(sql);

			resultSet=preS.executeQuery();
			while(resultSet.next()){
				Book book=new Book(resultSet.getNString(1), resultSet.getInt(2), resultSet.getInt(3), resultSet.getInt(4));
				books.add(book);
			}
			return books;
		} catch (SQLException e) {
			e.printStackTrace();
		}
		return null;
	}
}

❤️ 4、BookServiceImpl类

package cn.bdqn.demo01;

import java.util.List;
import java.util.Scanner;

public class BookServiceImpl {

	// 定义一个静态的Scanner
	static Scanner inputsc = new Scanner(System.in);
	// 是否退出系统,false代表退出系统
	static boolean flag = true;

	static int num = -1;

	static BookDaoImpl bookDaoImpl = new BookDaoImpl();
	// 数据初始化
	static {

		// 初始化数据并添加到数据库中
		Book book1 = new Book("罗马假日", 1, 1, 15);
		Book book2 = new Book("白雪公主", 0, 0, 12);
		Book book3 = new Book("葫芦兄弟", 0, 0, 30);
		// 判断数据库是否存在,不存在,添加初始化图书
		if (bookDaoImpl.select(book1.getName()) == null) {
			bookDaoImpl.insert(book1);
		}
		if (bookDaoImpl.select(book2.getName()) == null) {
			bookDaoImpl.insert(book2);
		}
		if (bookDaoImpl.select(book3.getName()) == null) {
			bookDaoImpl.insert(book3);
		}
	}

	// 欢迎使用迷你图书管理器方法
	public static void useBookSystem() {
		// 输出欢迎菜单
		System.out.println("欢迎使用迷你图书管理器");
		System.out.println("-------------------------");
		System.out.println("1.新增图书");
		System.out.println("2.查看图书");
		System.out.println("3.删除图书");
		System.out.println("4.借出图书");
		System.out.println("5.归还图书");
		System.out.println("6.退出图书");
		System.out.println("-------------------------");
	}

	// 新增图书方法
	public static void addBook() {
		System.out.println("-->新增图书\n");
		System.out.println("请输入图书名称:");
		String bookName = inputsc.next();

		Book book = new Book(bookName, 0, 0, 0);

		// 向数据库添加图书
		int num = bookDaoImpl.insert(book);
		System.out.println();
		if (num != 0) {
			System.out.println("新增《" + bookName + "》成功!");
		} else {
			System.out.println("新增《" + bookName + "》失败!");
		}

		System.out.println("*****************************************");
	}

	// 查看图书方法
	public static void lookBook() {
		System.out.println("-->查看图书\n");
		System.out.println("序号\t状态\t名称\t借出日期\t借出次数");
		// 获取数据库全部图书
		List<Book> books = bookDaoImpl.selectAll();
		for (int i = 0; i < books.size(); i++) {
			String BookState = (books.get(i).getState() == 0) ? "可借阅" : "已借出";
			String dateStr = (books.get(i).getDate() == 0) ? "" : (books.get(i)
					.getDate() + "日");
			System.out.println((i + 1) + "\t" + BookState + "\t"
					+ books.get(i).getName() + "\t" + dateStr + "\t"
					+ books.get(i).getCount() + "次");
		}
		System.out.println("*****************************************");
	}

	// 删除图书方法
	public static void delBook() {
		System.out.println("-->删除图书\n");
		System.out.println("请输入要删除图书的名称:");
		String deleteBook = inputsc.next();

		// 从数据库中查找此图书
		Book delBook = bookDaoImpl.select(deleteBook);

		boolean flag3 = false;
		// 删除的图书存在、状态处于可借阅状态
		if (delBook.getName() != null && deleteBook.equals(delBook.getName())
				&& delBook.getState() == 0) {
			flag3 = true;
			int num = bookDaoImpl.delete(delBook);
			if (num != 0) {
				System.out.println("图书删除成功!");
			} else {
				System.out.println("图书删除失败!");
			}
		} else if (delBook.getName() != null
				&& deleteBook.equals(delBook.getName())
				&& delBook.getState() == 1) {
			flag3 = true;
			System.out.println("该图书已被借出,目前无法删除!");
		}
		if (!flag3) {
			System.out.println("没有找到匹配信息!");
		}
		System.out.println("*****************************************");
	}

	// 借出图书方法
	public static void lendBook() {
		System.out.println("-->借出图书\n");
		System.out.print("请输入图书名称:");
		String want = inputsc.next(); // 要借出的图书名称

		// 从数据库中查找此图书
		Book wantBook = bookDaoImpl.select(want);
		if (wantBook == null) {
			System.out.println("没有找到匹配信息!");
		} else {
			if (want.equals(wantBook.getName()) && wantBook.getState() == 0) { // 找到匹配可借
				wantBook.setState(1); // 将此图书置于借出状态
				System.out.print("请输入借出日期:");
				int inputscData = inputsc.nextInt();
				wantBook.setDate(inputscData);
				while (wantBook.getDate() < 1 || wantBook.getDate() > 31) { // 当输入借出的日期不满足1-31时
					System.out.println("必须输入大于等于1且小于等于31的数字,请重新输入:");
					inputscData = inputsc.nextInt();
					wantBook.setDate(inputscData);
				}
				wantBook.setCount(wantBook.getCount() + 1);
				// 更新书本最新信息
				int num = bookDaoImpl.update(wantBook);
				if (num != 0) {
					System.out.println("借出《" + want + "》成功!");
				} else {
					System.out.println("借出《" + want + "》失败!");
				}
			} else if (want.equals(wantBook.getName())
					&& wantBook.getState() == 1) { // 找到匹配已被借出
				System.out.println("《" + want + "》已被借出!");
			}
		}

		System.out.println("*****************************************");
	}

	// 归还图书方法
	public static void returnBook() {
		System.out.println("-->归还图书\n");
		int charge = 0; // 租金
		System.out.print("请输入归还图书名称:");
		String back = inputsc.next();
		// 从数据库中查找此图书
		Book backBook = bookDaoImpl.select(back);
		if (backBook == null) {
			System.out.println("没有找到匹配信息!");
		} else {
			if (back.equals(backBook.getName())
					&& backBook.getDate() == 1) {// 找到匹配
				backBook.setDate(0); // 将借阅状态修改为可借阅
				System.out.print("请输入归还日期:");
				int redate = inputsc.nextInt();
				while (redate < backBook.getDate() || redate > 31) { //
					// 归还日期不能小于借出日期,也不能大于31
					if (redate < backBook.getDate()) {
						System.out.println("归还日期不能小于借出日期,请重新输入:");
					} else {
						System.out.println("一个月只有31天,请重新输入:");
					}
					redate = inputsc.nextInt();
				}
				charge = redate - backBook.getDate();
				// 更新书本最新信息
				int num = bookDaoImpl.update(backBook);
				if (num != 0) {
					System.out.println("\n归还《" + back + "》成功!");
					System.out.println("借出日期为:" + (backBook.getDate()+1) + "日");
					System.out.println("归还日期为:" + redate + "日");
					System.out.println("应付租金(元):" + charge);
					backBook.setDate(0);
				} else {
					System.out.println("借出《" + back + "》失败!");
				}
			} else if (back.equals(backBook.getName())
					&& backBook.getState() == 0) {// 找到匹配但没有借出
				System.out.println("该图书没有被借出!无法进行归还操作。");
			}
		}

		System.out.println("*****************************************");
	}

	// 操作
	public static void runTest() {
		// 循环操作
		do {
			// 定义一个BookMethod操作类,将操作方法定义在BookMethod类中,然后调用
			// 欢迎菜单方法
			BookServiceImpl.useBookSystem();
			System.out.println("请选择:");
			int choose = inputsc.nextInt();
			switch (choose) {
			case 1:
				// 新增图书
				BookServiceImpl.addBook();
				break;
			case 2:
				// 查看图书
				BookServiceImpl.lookBook();
				break;
			case 3:
				// 删除图书
				BookServiceImpl.delBook();
				break;
			case 4:
				// 借出图书
				BookServiceImpl.lendBook();
				break;
			case 5:
				// 归还图书
				BookServiceImpl.returnBook();
				break;
			case 6:
				// 退出图书
				flag = false;
				break;
			default:
				flag = false;
				break;
			}
			if (flag) {
				System.out.println("输入0返回:");
				num = inputsc.nextInt();
			} else {
				break;
			}
		} while (num == 0);
		System.out.println("谢谢使用!");
	}
}

❤️ 5、MyBookSystem类 

package cn.bdqn.demo01;

/**
 * 图书管理系统类MyBookMgr
 * 
 * @author Administrator
 *
 */
public class MyBookSystem {
	public static void main(String[] args) {
		BookServiceImpl.runTest();
	}
}

       码文不易,本篇文章就介绍到这里,如果想要学习更多Java系列知识,请关注博主,博主带你零基础学习Java知识。与此同时,对于日常生活有困扰的朋友,欢迎阅读我的第四栏目:《国学周更—心性养成之路》,学习技术的同时,我们也注重了心性的养成。

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

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

相关文章

SpringBoot交友APP项目实战(详细介绍+案例源码) - 10.网关配置

系列文章目录 1. 项目介绍及环境配置 2. 短信验证码登录 3. 用户信息 4. MongoDB 5. 推荐好友列表/MongoDB集群/动态发布与查看 6. 圈子动态/圈子互动 7. 即时通讯&#xff08;基于第三方API&#xff09; 8. 附近的人(百度地图APi) 9. 小视频 10.网关配置 文章目录系列文章目录…

【数据结构练习题——查找】

题目&#xff1a;给定如下关键字序列 &#xff08;36,23,51,6&#xff0c;58,48,39,8&#xff0c;88,76,63,17&#xff09; &#xff08;1&#xff09;按表中顺序建立一棵初始为空的二叉排序树&#xff0c;画出该二叉排序树。 &#xff08;2&#xff09;求上述二叉排序树中等…

ikun网站成名录: HTML 中的常用标签用法,从0到1创建一个ikun简介

常见标签(以下均省略了< >) 1.标题标签 h1~h6 2.段落&#xff0c;换行标签 由于html的特性&#xff0c;我们在语句中添加换行&#xff0c;多个空格都是没办法对我们的文本分段落的。如图 所以改用这个标签便可分段了&#xff1a; 用于我们文本可能需要手动换行&#x…

Hadoop高手之路2—Hadoop集群的基础设置

文章目录Hadoop集群的基础设置一、虚拟机软件的安装二、创建虚拟机&#xff0c;安装CentOS1.下载CentOS2.创建虚拟机3.编辑虚拟机设置4.安装centos7.9mini版本5.启动centos&#xff0c;并进行登录6. 退出root登录&#xff0c;用user1登录三、CentOS网络配置1. 查看本地windows主…

图像格式RGB-HSV-YUV

文章目录一、RGB色彩空间二、HSV 色彩空间三、YUV 色彩空间四、色彩空间的转换待更新中FPGA实现RGB与HSV的转换 一、RGB色彩空间 RGB 是最常用于显示器的色彩空间&#xff0c;R(red)是红色通道&#xff0c;G(green)是绿色&#xff0c;B(blue)是蓝色通道。这三种颜色以不同的量…

(附源码)计算机毕业设计SSM教师教学质量评价系统

&#xff08;附源码&#xff09;计算机毕业设计SSM教师教学质量评价系统 项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术…

【数据结构与算法】手写HashMap的模拟实现

✨哈喽&#xff0c;进来的小伙伴们&#xff0c;你们好耶&#xff01;✨ &#x1f6f0;️&#x1f6f0;️系列专栏:【数据结构与算法】 ✈️✈️本篇内容:手写HashMap的模拟实现&#xff01; &#x1f680;&#x1f680;代码存放仓库gitee&#xff1a;Java数据结构代码存放&…

目标检测 YOLOv5 - Rockchip rknn模型的测试 包括精度,召回率,mAP等详细信息

目标检测 YOLOv5 - Rockchip rknn模型的测试 包括精度&#xff0c;召回率&#xff0c;mAP等详细信息 flyfish 该测试是使用了自定义128张图片的测试结果&#xff0c;如果采用官网的coco128图片数据会比下列数值更好看。 以下是对比结果&#xff0c;pt模型的测试结果和rknn模型…

进程互斥的实现方法

文章目录进程互斥的软件实现方法单标志法双标志先检查法双标志后检查法Peterson算法img硬件实现进程互斥中断屏蔽方法TestAndSet指令Swap指令进程互斥的软件实现方法 软件实现方法的思想&#xff1a;在进入区设置并检查一些标志 来标明是否有进程在临界区中,若已有进程在临界区…

MyBatis

最近新开了个项目&#xff0c;记录第一次新开项目做得一些步骤&#xff0c;整合mybatis就是重要的一步&#xff0c;这里我演示了依赖的添加&#xff0c;逆向文件的生成。 1.整合mybatis 1.1基础配置 先添加依赖&#xff0c;再增加配置文件 dependencies <!--Spring Boot …

Java 开发工具 Eclipse

目录 一、Eclipse 概述 二、Eclipse 安装与汉化 三、创建 Java 项目 四、创建 Java 类 五、运行 Java 程序 六、Eclipse 调试程序 &#xff08;方法一&#xff09; 七、Eclipse 调试程序 &#xff08;方法二&#xff09; 工欲善其事&#xff0c;必先利…

Linux文件查找find

目录 前言 查找命令 命令演示 1.which&#xff1a;命令查找 2.locate命令 3.find命令&#xff08;主要使用这个命令进行查找文件&#xff09; 1&#xff09;语法 2&#xff09;find的用法介绍 按文件名查找 手动写入指定大小数据到文件内&#xff0c;介绍一下dd命令。…

【兄弟反目成仇系列】:我只是写了一个爆炸信息窗口脚本,好兄弟追了我几条街~

文章目录✨ 真的来咯~&#x1f4a5;爆炸信息窗口&#x1f4a1;设计思路&#x1f511;模块准备⚠️删除好友警告⚠️源代码❓这时你可能会问&#x1f440; 批量获取表情包&#x1f6c0;结束语专栏Python零基础入门篇&#x1f525;Python网络蜘蛛&#x1f525;Python数据分析Djan…

高德地图 API,点击地图标记获取自定义标记 (Marker) 中的信息

高德地图 API&#xff0c;点击地图标记获取自定义标记 (Marker) 中的信息 通过 高德地图 JS Web 添加自定义图标&#xff0c;自定义窗口标记 已经能在地图中正常添加自定义标记了 这篇文章讲讲点击标记时&#xff0c;如何从自定义标记中获取你需要的信息&#xff0c;如何预置一…

计算机网络【IP协议与以太网】

计算机网络【IP协议与核心协议】&#x1f34e;一.IP协议&#x1f352;1.1IPv4协议格式&#x1f352;1.2 IP协议地址&#x1f352;1.3IPv4协议的解决方案&#x1f352;1.4路由选择(了解)&#x1f34e;二.以太网协议&#x1f352;2.1以太网协议格式&#x1f352;2.2认识MTU(了解)…

聊一聊JAVA中的缓存规范 —— 虽迟但到的JCache API与天生不俗的Spring Cache

为何需要规范 上一章中构建的最简化版本的缓存框架&#xff0c;虽然可以使用&#xff0c;但是也存在一个问题&#xff0c;就是它对外提供的实现接口都是框架根据自己的需要而自定义的。这样一来&#xff0c;项目集成了此缓存框架&#xff0c;后续如果想要更换缓存框架的时候&a…

哈希的应用

文章目录前言一、位图1.1位图概念1.2位图的实现1.3 位图的应用二、 布隆过滤器2.1 布隆过滤器提出2.2 布隆过滤器概念2.3 布隆过滤器的插入2.4 布隆过滤器的哈希函数2.5 布隆过滤器的查找2.6 布隆过滤器删除2.7 布隆过滤器的优点2.8 布隆过滤器的缺陷2.9 布隆过滤器的应用场景前…

散射辐射变送器的优势体现在哪些方面?

散射辐射是经过大气分子、水蒸气、灰尘等质点的散射&#xff0c;改变了方向的太阳辐射&#xff0c;也称天空散射辐射。太阳散射辐射强弱程度与太阳辐射的入射角、大气条件&#xff08;云量、水汽、砂粒、烟尘等粒子的多少&#xff09;和地面反射率有关。当天空的浑浊程度加大&a…

链路状态路由协议 OSPF (三)

作者简介&#xff1a;一名在校云计算网络运维学生、每天分享网络运维的学习经验、和学习笔记。 座右铭&#xff1a;低头赶路&#xff0c;敬事如仪 个人主页&#xff1a;网络豆的主页​​​​​​ 目录 前言 一.OSPF领接关系的建立 1.OSPF领接关系的建立概述 &#xff0…

彻底理解Java并发:乐观锁与CAS

本篇内容包括&#xff1a;悲观锁与乐观锁的概述、CAS&#xff08;Compare And Swap&#xff09;比较并交换的介绍、非阻塞算法与ABA问题&#xff0c;以及对 Java 中 CAS 的实现解读&#xff08;AtomicInteger 对 CAS 的实现&#xff0c;Unsafe 类简介&#xff09;。 一、悲观锁…