当前位置: 首页 > 编程日记 > 正文

JDBC工具类

本文主要是将JDBC最基础的增删改查的工具类的代码详细的罗列出来:

一、我们先来看一看项目结构:

项目结构

二、配置JDBC工具类

1.我们先处理异常

我们知道几乎不可能一次性就写出完美的代码,都是要经过很多次的调试才行,那在调试过程中就难免会出现各种各样的异常情况,而控制台(console)的容量相对有限,有时不可能将异常情况全部打印出来,这样就不利于接下来的调试和改进代码,所以为了将全部的异常情况都显示出来我们就需要通过log4j.properties来输入全部的异常,我们需要先下一个log4j-1.2.15.jar的jar包,然后再创建一个文件log4j.properties(已经配置好了),内容为:

# DEBUG\u8BBE\u7F6E\u8F93\u51FA\u65E5\u5FD7\u7EA7\u522B\uFF0C\u7531\u4E8E\u4E3ADEBUG\uFF0C\u6240\u4EE5ERROR\u3001WARN\u548CINFO \u7EA7\u522B\u65E5\u5FD7\u4FE1\u606F\u4E5F\u4F1A\u663E\u793A\u51FA\u6765
log4j.rootLogger=DEBUG,Console,RollingFile#\u5C06\u65E5\u5FD7\u4FE1\u606F\u8F93\u51FA\u5230\u63A7\u5236\u53F0
log4j.appender.Console=org.apache.log4j.ConsoleAppender
log4j.appender.Console.layout=org.apache.log4j.PatternLayout
log4j.appender.Console.layout.ConversionPattern= [%-5p]-[%d{yyyy-MM-dd HH:mm:ss}] -%l -%m%n
#\u5C06\u65E5\u5FD7\u4FE1\u606F\u8F93\u51FA\u5230\u64CD\u4F5C\u7CFB\u7EDFD\u76D8\u6839\u76EE\u5F55\u4E0B\u7684log.log\u6587\u4EF6\u4E2D
log4j.appender.RollingFile=org.apache.log4j.DailyRollingFileAppender
log4j.appender.RollingFile.File=D://log.log
log4j.appender.RollingFile.layout=org.apache.log4j.PatternLayout
log4j.appender.RollingFile.layout.ConversionPattern=%d [%t] %-5p %-40.40c %X{traceId}-%m%n

不要被吓到了,这个无需深入了解,网上也有类似的配置,我们在这里简单介绍一下:

我们从中可以看到Loggers、Appenders、Layouts,其实这就是Log4j的三个主要的组件:

  • Loggers(记录器):日志类别和级别(这里就是指异常的类别和级别)
    Loggers组件在系统中被分为五个级别:DEBUG < INFO < WARN < ERROR < FATAL(按日志信息的重要程度来排序);
    log4j有一个规则就是 只输出级别不低于设定级别的日志,这里设定为DEBUG,所以五个级别的异常都可以被输出。
  • Appenders(输出源):日志要输出的地方(我们可看到后面有个console,意思就是把异常输出到控制台)
    还可以根据天数或者文件大小产生新的文件,可以以流的形式发送到其他地方等等
    我们看到这里用的类是org.apache.log4j.DailyRollingFileAppender(意思就是每天产生一个新的文件)
  • Layouts(布局):日志以何种形式输出
    这里用的是org.apache.log4j.PatternLayout(意思就是可以灵活地指定布局模式)

那配置完jd.properties文件后,该怎么使用它呢?我们通过一个例子来了解:

import org.apache.log4j.Logger;public class Test {//通过logger来使用private static Logger logger = Logger.getLogger(Test.class);//测试:public static void main(String[] args) {/*try {Class.forName("com.mysql.jdbc.Driver");} catch (Exception e) {e.printStackTrace();//此时是将错误打印到控制台上}*/try {Class.forName("com.mysql.jdbc.Driver");} catch (Exception e) {logger.debug(e.getMessage(),e);//getMessage()用来获取异常信息}}
}

2.连接MySQL数据库

我们平时连接MySQL数据库是这样连的:
先添加一个jar包:mysql-connector-java-5.1.44-bin.jar(可以在网上找到),然后

	Class.forName("com.mysql.jdbc.Driver");//加载驱动String url= "jdbc:mysql://127.0.0.1:3306/test";Stirng userName = "root";String password = "root";Connection connection = DriverManger.getConnection(url, userName, password);//获取数据库的连接对象

2.1创建db.properties文件

但这是固定地连接在一台计算机上的某个数据库实例,当我们需要连接另一台计算机或者其他实例又或者数据库发生改变时,Java的.class文件无法修改,所以就需要在Java的代码中一个一个修改,一个一个重新编译,不仅费时还费事。为了解决这个问题,我们就需要配置db.properties(MySQL数据库连接文件),将连接数据库所需的信息放进该文件,后期数据库改变时只需更改该文件即可(省时又省事):

  • 先在src根目录里创建一个文件(db.properties),内容为:
# 加载驱动
db.driver = com.mysql.jdbc.Driver
# 加载数据库
db.url=jdbc:mysql://127.0.0.1:3306/test
# 用户名
db.usernName=root
# 密码
db.password=root

2.2创建PropertiesTool类

  • 这时的db.properties文件还只是普通文件,还没有跟Java代码联系起来,那如何联系呢?这就需要一个中介来做媒,而充当中介的就是PropertiesTool.class(Properties工具类),其实Properties的父类就是HashTable,而HashTable的父类就是Map,所以Properties就是一个Map文件,可以往里面传值{key(键),value(值)},也就是说通过PropertiesTool可以将db.properties文件中的数据库配置信息转换成Properties中的key和value,这样就可以调用了:
package jdbc.tool;import java.io.IOException;
import java.io.InputStream;
import java.util.Properties;public class PropertiesTool {private static Properties properties = new Properties();/*** 联系db.properties文件和properties* * 静态代码块先于main方法执行*/static {//将db.properties变为javaIO流对传入到inputStream中InputStream inputStream = PropertiesTool.class.getClassLoader().getResourceAsStream("db.properties");//此时db.properties文件中的数据就保存到了inputStream中try {properties.load(inputStream);//将inputStream中的key和value放到load方法中进行解析再存到properties中} catch (IOException e) {e.printStackTrace();}}/*** 我们创建一个getVaule方法来便于调用文件(此时也就是properties)中的数据*/public static String getValue(String key) {return properties.getProperty(key);//返回properties中的key值}/*** 我们来测试一下:*/public static void main(String [] ages) {String driver = getValue("db.driver");String url = getValue("db.url");String userName = getValue("db.userName");String password = getValue("db.password");System.out.println(driver);System.out.println(userName);System.out.println(password);System.out.println(url);}
}

结果正如我们所预料的那样:

com.mysql.jdbc.Driver
jdbc:mysql://127.0.0.1:3306/test
root
root

这时我们就可以通过PropertiesTool来连接数据库了:

	String driver = PropertiesTool.getValue("db.driver");String   url    = PropertiesTool.getValue("db.url");String userName = PropertiesTool.getValue("db.userName");String password = PropertiesTool.getValue("db.password");Class.forName(driver);Connection connection = DriverManger.getConnection(url, userName, password);//获取数据库的连接对象

这样的话,当IP地址或数据库改变时只需变动db.Properties文件即可,省时省事!

二、实现JDBC工具类(DBLink类)

package jdbc.tool.db;import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;import org.apache.log4j.Logger;import jdbc.tool.PropertiesTool;/*** 数据库管理(增删改查)* * @author ZhaoZhengyi*/public class DBLink {private Logger logger = Logger.getLogger(DBLink.class);/*** 获取数据库连接** @author ZhaoZhengyi*/public  Connection getConnection() {try {String driver = PropertiesTool.getValue("db.driver");String   url    = PropertiesTool.getValue("db.url");String userName = PropertiesTool.getValue("db.userName");String password = PropertiesTool.getValue("db.password");Class.forName(driver);return DriverManager.getConnection(url, userName, password);} catch (Exception e) {logger.debug(e.getMessage(), e);}return null;}/*** 判断某条数据是否存在** @author ZhaoZhengyi*/public boolean exist(String sql,Object ...params) {//初始化变量为nullConnection connection = null;PreparedStatement prepareStatement = null;ResultSet resultset = null;try {connection = getConnection();prepareStatement = connection.prepareStatement(sql);for (int i = 0; i < params.length; i++) {prepareStatement.setObject(i+1, params[i]);}resultset = prepareStatement.executeQuery();//executeQuery用于查询用户的数据,并将其存入ResultSet类型的resultset变量中去return resultset.next();//若有则返回该用户数据} catch (Exception e) {logger.debug(e.getMessage(), e);} finally {//即便有异常也会执行代码close(resultset,prepareStatement,connection);//释放资源}return false;//若没有则返回false}/*** 用于添加、删除、修改用户信息** @author ZhaoZhengyi*/public boolean update(String sql, Object ...params) {Connection connection = null;PreparedStatement  prepareStatement = null;try {connection = getConnection();prepareStatement = connection.prepareStatement(sql);//含有?的sql语句 赋值给prepareStatementfor(int i = 0; i < params.length; i++) {prepareStatement.setObject(i+1, params[i]);//用参数替换掉?}int affect = prepareStatement.executeUpdate();//执行sql语句,并返回影响的行数return affect>0;} catch (Exception e) {logger.debug(e.getMessage(), e);} finally {close(prepareStatement,connection);}return false;}/*** 查询用户数据** @author ZhaoZhengyi*/public void select(String sql,IRowMapper rowMapper,Object ...params) {Connection connection = null;PreparedStatement prepareStatement = null;ResultSet resultset = null;try {connection = getConnection();prepareStatement = connection.prepareStatement(sql);for (int i = 0; i < params.length; i++) {prepareStatement.setObject(i+1, params[i]);}resultset = prepareStatement.executeQuery();//执行SQL语句,此时用户数据都在resultset里面rowMapper.rowMapper(resultset);//因为rowMapper参数指向IRowMapper接口实现类对象,所以此处将调用接口实现类中所实现的rowMapper方法  多态} catch (Exception e) {logger.debug(e.getMessage(), e);} finally {close(resultset,prepareStatement,connection);//释放资源}}/*** 释放资源** @author ZhaoZhengyi*/private void close(Statement statement,Connection connection) {try {if (statement != null) {//有可能由于异常导致statement没有赋值(譬如url出错),此时不必释放资源(多余),不然会报空指针异常statement.close();}} catch (SQLException e) {logger.debug(e.getMessage(), e);}try {if (connection != null) {connection.close();}} catch (SQLException e) {logger.debug(e.getMessage(), e);}}/*** 与上一方法是重载** @author ZhaoZhengyi*/private void close(ResultSet resultset,Statement statement,Connection connection) {try {if (resultset != null) {resultset.close();}} catch (SQLException e) {logger.debug(e.getMessage(), e);}close(statement,connection);}}

三、调用JDBC工具类(DBLink类)

首先创建一个接口IRowMapper:

package jdbc.tool.db;import java.sql.ResultSet;public interface IRowMapper {/*** 定义一个抽象方法(参数类型为ResultSet)** @author ZhaoZhengyi*/void rowMapper (ResultSet rs);
}

再创建一个Main方法去调用JDBC工具类:

package jdbc.main;import java.sql.SQLException;
import java.util.Scanner;import jdbc.tool.db.DBLink;public class Main {private static DBLink db = new DBLink();public static void main(String[] args) {System.out.println("*********************************");System.out.println("*\t\t\t\t*");System.out.println("*\t欢迎使用学生信息管理系统\t*");System.out.println("*\t\t\t\t*");System.out.println("*********************************");while (true) {menu();}}static void menu() {System.out.println("1、添加学生信息");System.out.println("2、删除学生信息");System.out.println("3、修改学生信息");//地址传递System.out.println("4、查询学生信息");//nameSystem.out.println("请输入操作,以Enter键结束:");Scanner scanner = new Scanner(System.in);int option  = scanner.nextInt();switch (option) {case 1:{System.out.println("请输入学号:");String id = scanner.next();String sql = "select id from user_info where id = '"+id+"'";if(db.exist(sql)) {System.out.println("学号已存在,无法添加!");return;}System.out.println("请输入姓名:");String name = scanner.next();System.out.println("请输入手机号:");String mobile = scanner.next();System.out.println("请输入家庭地址:");String address = scanner.next();sql = "insert into user_info(id,name,mobile,address) values('"+id+"','"+name+"','"+mobile+"','"+address+"') ";if(db.update(sql)) {System.out.println("添加成功!");return;}System.out.println("系统异常,添加失败!");break;}case 2:{System.out.println("请输入要删除学生的学号:");String id = scanner.next();String sql = "select name from user_info where id ='"+id+"'";if(db.exist(sql)) {System.out.println("学号存在,可以删除,");sql = "delete from user_info where id ='"+id+"'";db.update(sql);System.out.println("删除成功!");return;}System.out.println("学号不存在,无法删除!");break;}case 3:{System.out.println("请输入要修改学生的学号:");String id = scanner.next();String sql = "select name from user_info where id ='"+id+"'";if(!db.exist(sql)) {System.out.println("学号不存在,无法修改,");return;}System.out.println("请输入新姓名:");String name = scanner.next();System.out.println("请输入新手机号:");String mobile = scanner.next();System.out.println("请输入新家庭地址:");String address = scanner.next();sql = "update user_info set name='"+name+"',mobile='"+mobile+"',address='"+address+"' where id='"+id+"'";if(db.update(sql)) {System.out.println("修改成功!");return;}System.out.println("系统异常,修改失败!");break;}case 4:{System.out.println("请输入要查询学生的学号:");String id = scanner.next();String sql = "select name from user_info where id ='"+id+"'";if(!db.exist(sql)) {System.out.println("学号不存在,查询无果!");return;}sql = "select id,name,mobile,address from user_info where id ='"+id+"'";//有名内部类class RowMapper implements IRowMapper{@Overridepublic void rowMapper(ResultSet rs) {try {if(rs.next()) {String id1 = rs.getString("id");String name = rs.getString("name");String mobile = rs.getString("mobile");String address = rs.getString("address");System.out.println("学号:"+id1+",姓名:"+name+",手机号:"+mobile+",家庭地址:"+address);}} catch (SQLException e) {e.printStackTrace();}}}RowMapper rowMapper = new RowMapper();db.select(sql, rowMapper);break;}default:System.out.println("I'm Sorry,there is not the "+option+" option,please try again.");}}
}

相关文章:

SVO 学习笔记(三)

SVO 学习笔记&#xff08;三&#xff09;这篇博客InitializationFrame_Handler_MonoprocessFirstFrameprocessSecondFrameprocessFramerelocalizeFrame结尾这篇博客 这篇博客将介绍SVO源代码中的frame_handler_mono、initialization两个文件的代码流程。前者是SVO系统类&#x…

CMAKE设置INSTALL工程,分别设置头文件、Lib和DLL的输出路径

使用CMAKE管理工程&#xff0c;可以设置工程中的INSTALL项目运行时安装的路径&#xff0c;使用命令&#xff1a;install。 可以简单的设置安装文件的路径和文件夹&#xff1a; set(head_files//要安装的头文件 ) install(TARGETS ${head_files} DESTINATION ${CMAKE_BINARY_DI…

2021年中国工业互联网安全大赛核能行业赛道writeup之hacker

附加题 hacker&#xff0c;题目描述&#xff1a;hacker&#xff0c;附件下载 hackerhttps://download.csdn.net/download/qpeity/33230528解压缩得到一个EXE文件 ARE_YOU_SDPD.exe&#xff0c;在一个文件夹下运行看一下。 用 IDA 反汇编一下&#xff0c;发现找不到程序入口&am…

利用人工智能(Magpie开源库)给一段中文的文本内容进行分类打标签

当下人工智能是真心的火热呀&#xff0c;各种原来传统的业务也都在尝试用人工智能技术来处理&#xff0c;以此来节省人工成本&#xff0c;提高生产效率。既然有这么火的利器&#xff0c;那么我们就先来简单认识下什么是人工智能吧&#xff0c;人工智能是指利用语音识别、语义理…

动态环境下的SLAM:DynaSLAM 论文学习笔记

动态环境下的SLAM&#xff1a;DynaSLAM 论文学习笔记这篇文章论文摘要系统流程相关环节的实现方法神经网络检测图中动态物体&#xff08;Mask R-CNN&#xff09;Low-Cost Tracking使用多视图几何的方法检测图中动态物体&#xff08;Multi-view Geometry&#xff09;跟踪与建图&…

用C语言编写:判断一个≥2的整型数是否存在于斐波那契数列中?

自己写的&#xff0c;感觉挺有成就感的&#xff0c;就展示出来吧&#xff01; 判断一个≥2的整型数是否存在于斐波那契数列中&#xff1f; 若存在&#xff0c;则返回第几项&#xff1b;若不在&#xff0c;则返回-1 #include <stdio.h> long generate(long n);//函数声…

团队作业8——第二次项目冲刺(Beta阶段)--第六天

会议照片&#xff1a; 燃尽图&#xff1a; 项目进展&#xff1a; 练习模式能够给出正确的答案&#xff0c;部分模块正在正在测试。 团队贡献比&#xff1a; 队员 角色 团队贡献比 陈麟凤 PM 17% 张志杰 DEV 18% 黄海鸿 TEST 16% 康建灿 TEST 16% 许明涛 DEV…

2021年中国工业互联网安全大赛核能行业赛道writeup之隐写

附件题&#xff1a;隐写 题目描述&#xff1a;隐写 附件下载&#xff1a; 2021-10-12T15_44_19.17491400_00scene.jpg.zip-网络攻防文档类资源-CSDN下载 ​ 先用 010Editor 查看这个图片&#xff0c;能直接看到图片的头部是否完整正常&#xff0c;能直接看到是否隐藏了fla…

SVO 学习笔记(深度滤波)

SVO 学习笔记&#xff08;深度滤波&#xff09;这篇博客论文中的深度滤波深度滤波的代码流程更新Seed对象初始化Seed对象结尾这篇博客 这篇博客将介绍SVO论文中的Mapping部分&#xff0c;主要介绍深度滤波器在获取新的图像帧后&#xff0c;更新相应地图点深度的过程。&#xff…

寻找孪生素数(当p为素数时,p+2也为素数)

数学家希尔伯特在1900年国际数学家大会的报告上提出一个“孪生素数猜想”&#xff0c;即&#xff1a; 存在无穷多个素数p&#xff0c;使得p 2是素数。p和p2这一对差为2的素数&#xff0c;被称为“孪生素数”。 看起来&#xff0c;这个猜想是成立的&#xff0c;我们总能找到很多…

C++利用cin输入时检测回车的方法

今天做TJU的OJ &#xff0c;其中一道题是先读入一个字符串&#xff0c;再读入一个整数&#xff0c;循环往复&#xff0c;直到字符串是空&#xff0c;也就是说回车键结束循环。 但是cin对空格和回车都不敏感&#xff0c;都不影响继续读入数据&#xff0c;所以需要一种新的方式检…

使用grep过滤make的输出内容

make的输出内容其实分为两种&#xff0c;有些是到标准输出&#xff0c;有些是到标准错误&#xff0c;由于标准输出和标准错误默认都是屏幕&#xff0c;所以平时区分不出来&#xff0c; 实际上一般是error和warning信息到标准错误&#xff0c;其余的到标准输出。 如果要过滤erro…

2021年中国工业互联网安全大赛核能行业赛道writeup之机房密码

附件题&#xff1a;机房密码 题目描述&#xff1a; &#xff08;具体描述忘记了&#xff09; 经过黑客人员的不屑努力&#xff0c;在上位机上发现了登录密码的一半信息&#xff0c;剩下的一半要靠你们继续努力辣&#xff01;&#xff01;&#xff01; ZmxhZyU3Qmgwd19hX0M 附件…

ORB-SLAM2系统的实时点云地图构建

ORB-SLAM2系统的实时点云地图构建这篇博客点云地图构建的流程代码介绍点云地图构建类对象小调整获取关键帧点云地图构建与叠加在地图中设置当前相机位置点云地图到Octomap的转换地图效果结尾这篇博客 &#xff08;PS:修改于2020-9-21&#xff0c;添加了关于System和Tracking类…

使用maven导入jar包

我们都经历过自己写代码时有时就要引用一些第三方的jar包&#xff0c;这个我们都会&#xff0c;但在公司里进行团队开发时&#xff0c;是不允许我们自己导入jar包的&#xff0c;是由项目组长之类的统一导入jar包&#xff0c;我们在这里来了解一下这个过程&#xff1a; a、先创建…

Struts2中action接收参数的三种方法及ModelDriven跟Preparable接口结合JAVA反射机制的灵活用法...

Struts2中action接收参数的三种方法及ModelDriven跟Preparable接口结合JAVA反射机制的灵活用法 www.MyException.Cn 发布于&#xff1a;2012-09-15 19:09:28 浏览&#xff1a;164次0Struts2中action接收参数的三种方法及ModelDriven和Preparable接口结合JAVA反射机制的灵活…

关于CSS的长度单位及颜色表示

长度单位 1.q 1/4mm. 2.px 计算机语言中的像素。大多数网页制作常用图片分辨率为72&#xff0c;即每英寸像素为72,1英寸等于2.54cm。那么通过换算可以得出每厘米等于28像素。 3.em 它是描述相对于应用在当前元素的字体尺寸&#xff0c;所以它也是相对长度单位。一班浏览器字体大…

2021年中国工业互联网安全大赛核能行业赛道writeup之鱿鱼游戏

目录 一、尝试 二、Writeup 附加题 鱿鱼游戏&#xff08;来自最近一部很火的韩剧&#xff09; 题目描述&#xff1a; 小王由于操作不规范&#xff0c;误将不明U盘插入到上位机中&#xff0c;导致上位机中的某些关键文件被加密&#xff0c;但攻击者在U盘中还留下了一个可执行…

视觉惯性SLAM: VI ORB-SLAM

视觉惯性SLAM: VI ORB-SLAM这篇博客视觉惯性SLAM预备知识符号说明&#xff1a;相机投影变换矩阵IMU数据更新方程IMU数据的预积分VI ORB-SLAM各环节工作方式InitializationTrackingLocalMappingLoop ClosingFull BAIMU初始化估计bgb_{g}bg​估计尺度sss和重力向量gWg_{W}gW​&am…

AEC、AGC、ANS在视音频会议中的作用?

AGC是自动增益补偿功能&#xff08;Automatic Gain Control&#xff09;&#xff0c;AGC可以自动调麦克风的收音量&#xff0c;使与会者收到一定的音量水平&#xff0c;不会因发言者与麦克风的距离改变时&#xff0c;声音有忽大忽小声的缺点。ANS是背景噪音抑制功能&#xff08…

Java中的拆箱与装箱

我们先来了解一下拆箱与装箱的概念&#xff1a; 装箱&#xff1a;将基本数据类型转换为包装类&#xff1b; 拆箱&#xff1a;将包装类转换为基本数据类型 我们来看两串代码&#xff1a; Integer b1 127;Integer b2 127;System.out.println(b1b2);//trueInteger b3 128;Inte…

WannaCry的UWP版,哈哈哈

转载于:https://www.cnblogs.com/R00R/p/6916731.html

2021年中国工业互联网安全大赛核能行业赛道writeup之数据库登录

附件题&#xff1a;数据库登录&#xff08;一道MISC、流量分析类型题目&#xff09; 题目描述&#xff1a; 具体描述已经忘记o(╯□╰)o 大概意思就是分析附件里的.pcapng包&#xff0c;找到flag。流量涉及到 MySQL 数据库了。 附件下载&#xff1a; https://download.csdn.n…

学生管理系统(用maven来导入jar包)

不废话&#xff0c;直接上 先看一下项目列表&#xff1a; 首先创建一个maven工程&#xff0c;然后导入相应的jar包&#xff0c;请参考&#xff1a;使用maven导入jar包 接着在Source Folder创建具体的项目&#xff1a; Main类&#xff08;客户端&#xff09; package com.z…

视觉惯性SLAM:VINS-Mono

视觉惯性SLAM&#xff1a;VINS-Mono这篇博客一些符号说明IV 测量数据的预处理A.视觉处理前端B.IMU预积分V. 初始化A.Vision-Only SfM in Sliding WindowB.Visual-Inertial AlignmentVI.TIGHTLY COUPLED MONOCULAR VIOA.公式介绍B.IMU误差C.视觉误差D.边缘化E.位姿优化F.以IMU采…

mysql 0x80004005 unable to connect to any of the specified mysql hosts

语言&#xff1a;c# 问题&#xff1a;偶尔会出现连不上mysql 报标题的这个错误。 解决方法&#xff1a;把server localhost 改为 127.0.0.1 或者静态IP &#xff0c;按着改暂时没出现了&#xff0c;继续观望&#xff01; 转载于:https://www.cnblogs.com/wdw31210/p/9857514…

iOS开发-自己定义重用机制给ScrollerView加入子视图

iOS开发-自己定义重用机制给ScrollerView加入子视图 事实上这个问题我非常早就想过&#xff0c;仅仅是没有通过去写程序实现&#xff0c;昨天有人提起&#xff0c;我就巧了一下 不知道大家打印郭tableview&#xff1a;cellforrow中cell初始的次数&#xff0c;也就是重用池中的c…

2021年中国工业互联网安全大赛核能行业赛道writeup之Webshell密码

附件题&#xff1a;Webshell密码 题目描述&#xff1a; 某次攻防演练中&#xff0c;抓到了一个webshell的流量&#xff0c;请分析出密码&#xff0c;flag形式&#xff1a;flag{密码} 附件下载&#xff1a; https://download.csdn.net/download/qpeity/33675356https://downlo…

关于python3与python2同时存在情况下导入pyqt失败解决记录

最近感觉tkinter功能还是比较不适合新手做出高大上的界面&#xff0c;故开始使用pyqt&#xff0c;通过pip安装好了之后&#xff0c;利用qt设计师设计好界面之后&#xff0c;cmd运行之&#xff0c;报错提示没有找到pyqt5模块&#xff0c;IDE运行能正常加载 查找资料后发现&#…

ORBSLAM-Altas:多地图SLAM

ORBSLAM-Atlas&#xff1a;多地图SLAM这篇博客ORBSLAM-Altas这个系统系统方法两类子地图新地图的构建相机位姿的可观测性子地图融合系统线程结尾这篇博客 最近ORB-SLAM3横空出世&#xff0c;马上跑去GitHub膜拜。然后在项目的相关工作中看到了ORB-SLAM3使用了一个多地图方法。这…