当前位置: 首页 > news >正文

Java + Spring Boot + MyBatis获取以及持久化sql语句的方法

在Java的Spring Boot项目中结合MyBatis获取实际执行的SQL语句,可以通过以下几种方法实现:

方法一:配置MyBatis日志级别

通过调整日志级别,MyBatis会输出执行的SQL语句及参数,适用于快速调试。

  1. 修改application.properties文件:

    properties

    复制

    下载

    # 设置特定Mapper接口的日志级别为DEBUG
    logging.level.com.example.mapper=DEBUG
    # 使用MyBatis标准日志输出(可选)
    mybatis.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl
  2. 观察控制台输出:
    执行查询时,控制台将显示带占位符的SQL和参数列表,例如:

    复制

    下载

    ==>  Preparing: SELECT * FROM user WHERE id = ?
    ==> Parameters: 1(Integer)

方法二:自定义MyBatis拦截器

编写拦截器获取BoundSql并处理参数,生成完整SQL。

  1. 创建拦截器类:

    java

    复制

    下载

    @Intercepts({@Signature(type = Executor.class, method = "update", args = {MappedStatement.class, Object.class}),@Signature(type = Executor.class, method = "query", args = {MappedStatement.class, Object.class, RowBounds.class, ResultHandler.class})
    })
    public class SqlInterceptor implements Interceptor {@Overridepublic Object intercept(Invocation invocation) throws Throwable {MappedStatement ms = (MappedStatement) invocation.getArgs()[0];Object parameter = invocation.getArgs().length > 1 ? invocation.getArgs()[1] : null;BoundSql boundSql = ms.getBoundSql(parameter);Configuration configuration = ms.getConfiguration();String sql = boundSql.getSql();Object parameterObject = boundSql.getParameterObject();List<ParameterMapping> parameterMappings = boundSql.getParameterMappings();// 格式化SQL,替换参数占位符String formattedSql = formatSql(sql, parameterObject, parameterMappings, configuration);System.out.println("Executing SQL: " + formattedSql);return invocation.proceed();}private String formatSql(String sql, Object parameter, List<ParameterMapping> mappings, Configuration config) {if (mappings.isEmpty() || parameter == null) return sql;MetaObject metaObject = config.newMetaObject(parameter);return mappings.stream().map(m -> getParameterValue(metaObject, m)).reduce(sql, (s, p) -> s.replaceFirst("\\?", p));}private String getParameterValue(MetaObject metaObject, ParameterMapping mapping) {Object value = metaObject.getValue(mapping.getProperty());return value instanceof String ? "'" + value + "'" : value.toString();}@Overridepublic Object plugin(Object target) {return Plugin.wrap(target, this);}@Overridepublic void setProperties(Properties properties) {}
    }
  2. 注册拦截器到Spring容器:

    java

    复制

    下载

    @Configuration
    public class MyBatisConfig {@Beanpublic SqlInterceptor sqlInterceptor() {return new SqlInterceptor();}@Beanpublic SqlSessionFactory sqlSessionFactory(DataSource dataSource) throws Exception {SqlSessionFactoryBean factoryBean = new SqlSessionFactoryBean();factoryBean.setDataSource(dataSource);factoryBean.setPlugins(new Interceptor[]{sqlInterceptor()});return factoryBean.getObject();}
    }

方法三:使用P6Spy监听JDBC操作

通过P6Spy代理JDBC驱动,记录完整SQL,适合生产环境。

  1. 添加P6Spy依赖:

    xml

    复制

    下载

    运行

    <dependency><groupId>p6spy</groupId><artifactId>p6spy</artifactId><version>3.9.1</version>
    </dependency>
  2. 修改数据源配置:

    properties

    复制

    下载

    spring.datasource.url=jdbc:p6spy:mysql://localhost:3306/mydb
    spring.datasource.driver-class-name=com.p6spy.engine.spy.P6SpyDriver
  3. 配置spy.properties
    src/main/resources下创建spy.properties

    properties

    复制

    下载

    module.log=com.p6spy.engine.logging.P6LogFactory
    appender=com.p6spy.engine.spy.appender.Slf4JLogger
    logMessageFormat=com.p6spy.engine.spy.appender.CustomLineFormat
    customLogMessageFormat=%(currentTime) | SQL: %(sqlSingleLine)

方法对比表

方法优点缺点
配置日志级别简单快捷,无需代码改动SQL与参数分离,无法直接复制执行
自定义拦截器灵活,可定制SQL格式需要处理参数替换逻辑,复杂度较高
P6Spy完整SQL记录,配置简单引入额外依赖,需修改数据源配置

选择适合你需求的方法,即可在Spring Boot中获取MyBatis执行的SQL语句。

在 Spring Boot + MyBatis 项目中,将执行的 SQL 语句持久化到数据库中存储,可以通过以下步骤实现:


1. 创建数据库表存储 SQL 日志

首先设计一个表来记录 SQL 执行信息,例如:

sql

复制

下载

CREATE TABLE sql_execution_log (id BIGINT AUTO_INCREMENT PRIMARY KEY,sql_statement TEXT NOT NULL,        -- 执行的 SQL 语句parameters VARCHAR(1000),           -- SQL 参数execution_time DATETIME,            -- 执行时间duration BIGINT,                    -- 执行耗时(毫秒)success TINYINT(1),                 -- 是否执行成功error_message TEXT,                 -- 错误信息(可选)created_by VARCHAR(100)             -- 操作人(可选)
);

2. 通过 MyBatis 拦截器捕获 SQL

使用自定义拦截器获取 SQL 并记录到数据库,以下是完整实现:

2.1 自定义拦截器类

java

复制

下载

@Intercepts({@Signature(type = Executor.class,method = "update",args = {MappedStatement.class, Object.class}),@Signature(type = Executor.class,method = "query",args = {MappedStatement.class, Object.class, RowBounds.class, ResultHandler.class})
})
public class SqlLogInterceptor implements Interceptor {@Autowiredprivate SqlLogService sqlLogService; // 注入日志服务@Overridepublic Object intercept(Invocation invocation) throws Throwable {MappedStatement ms = (MappedStatement) invocation.getArgs()[0];Object parameter = invocation.getArgs()[1];BoundSql boundSql = ms.getBoundSql(parameter);// 获取 SQL 和参数String sql = boundSql.getSql();String params = getParameterString(boundSql.getParameterObject());// 记录执行开始时间和状态long startTime = System.currentTimeMillis();boolean success = true;String errorMsg = null;try {return invocation.proceed(); // 执行 SQL} catch (Exception e) {success = false;errorMsg = e.getMessage();throw e;} finally {long duration = System.currentTimeMillis() - startTime;// 异步保存日志(避免影响主流程性能)CompletableFuture.runAsync(() -> {SqlExecutionLog log = new SqlExecutionLog();log.setSqlStatement(sql);log.setParameters(params);log.setExecutionTime(new Date());log.setDuration(duration);log.setSuccess(success);log.setErrorMessage(errorMsg);sqlLogService.saveLog(log);});}}// 将参数对象转为字符串(简化示例)private String getParameterString(Object parameter) {if (parameter == null) return "null";try {return new ObjectMapper().writeValueAsString(parameter);} catch (JsonProcessingException e) {return "参数序列化失败";}}@Overridepublic Object plugin(Object target) {return Plugin.wrap(target, this);}@Overridepublic void setProperties(Properties properties) {}
}
2.2 定义日志实体类和 Mapper

java

复制

下载

// 实体类
@Data
public class SqlExecutionLog {private Long id;private String sqlStatement;private String parameters;private Date executionTime;private Long duration;private Boolean success;private String errorMessage;
}// Mapper 接口
@Mapper
public interface SqlLogMapper {@Insert("INSERT INTO sql_execution_log (sql_statement, parameters, execution_time, duration, success, error_message) " +"VALUES (#{sqlStatement}, #{parameters}, #{executionTime}, #{duration}, #{success}, #{errorMessage})")@Options(useGeneratedKeys = true, keyProperty = "id")void insert(SqlExecutionLog log);
}
2.3 日志服务类

java

复制

下载

@Service
public class SqlLogService {@Autowiredprivate SqlLogMapper sqlLogMapper;@Transactional(propagation = Propagation.REQUIRES_NEW) // 独立事务public void saveLog(SqlExecutionLog log) {sqlLogMapper.insert(log);}
}

3. 注册拦截器到 MyBatis

java

复制

下载

@Configuration
public class MyBatisConfig {@Beanpublic SqlLogInterceptor sqlLogInterceptor() {return new SqlLogInterceptor();}@Beanpublic SqlSessionFactory sqlSessionFactory(DataSource dataSource) throws Exception {SqlSessionFactoryBean factoryBean = new SqlSessionFactoryBean();factoryBean.setDataSource(dataSource);factoryBean.setPlugins(new Interceptor[]{sqlLogInterceptor()});return factoryBean.getObject();}
}

4. 优化点

4.1 异步写入日志

使用 CompletableFuture.runAsync() 异步保存日志,避免阻塞主流程。若需更高性能,可结合消息队列(如 RabbitMQ/Kafka)或线程池。

4.2 独立事务

通过 @Transactional(propagation = Propagation.REQUIRES_NEW) 确保日志保存不受主事务回滚影响。

4.3 参数脱敏

在 getParameterString() 方法中过滤敏感信息(如密码):

java

复制

下载

private String getParameterString(Object parameter) {String json = new ObjectMapper().writeValueAsString(parameter);return json.replaceAll("\"password\":\"[^\"]+\"", "\"password\":\"***\"");
}

5. 验证结果

执行 MyBatis 操作后,检查 sql_execution_log 表中是否生成记录:

sql

复制

下载

SELECT * FROM sql_execution_log;

方法对比

方案优点缺点
MyBatis 拦截器灵活可控,直接集成到代码需要处理事务和性能问题
P6Spy + 数据库输出配置简单,无需代码改动需要依赖 P6Spy,扩展性低

根据需求选择合适方案,拦截器方案适合需要深度定制的场景,P6Spy 适合快速集成。

在Spring Boot项目中,通过P6Spy实现SQL日志的监控与数据库持久化,可以结合其拦截能力和自定义配置,具体步骤如下:


一、添加P6Spy依赖

在项目的pom.xml中引入P6Spy依赖(版本推荐3.9.1):

xml

复制

下载

运行

<dependency><groupId>p6spy</groupId><artifactId>p6spy</artifactId><version>3.9.1</version>
</dependency>

二、修改数据源配置

将原有的JDBC驱动替换为P6Spy的代理驱动,并调整数据库连接URL前缀:

properties

复制

下载

# application.properties
spring.datasource.driver-class-name=com.p6spy.engine.spy.P6SpyDriver
spring.datasource.url=jdbc:p6spy:mysql://localhost:3306/your_db?useSSL=false&serverTimezone=UTC

这里需将原数据库驱动(如MySQL的com.mysql.jdbc.Driver)通过P6Spy代理,URL中添加jdbc:p6spy:前缀28。


三、配置spy.properties

src/main/resources下创建spy.properties文件,配置日志输出策略和数据库实际驱动:

properties

复制

下载

# 指定日志模块及实际数据库驱动
module.log=com.p6spy.engine.logging.P6LogFactory,com.p6spy.engine.outage.P6OutageFactory
driverlist=com.mysql.jdbc.Driver# 自定义日志格式类
logMessageFormat=com.example.config.P6SpyCustomLogger
appender=com.p6spy.engine.spy.appender.Slf4JLogger# 排除不必要日志类别
excludecategories=info,debug,result,batc,resultset# 慢SQL监控(可选)
outagedetection=true
outagedetectioninterval=2

此配置通过logMessageFormat指定自定义日志格式类,将SQL输出到应用日志中27。


四、自定义SQL日志格式

实现MessageFormattingStrategy接口,生成包含完整SQL及执行时间的日志:

java

复制

下载

public class P6SpyCustomLogger implements MessageFormattingStrategy {@Overridepublic String formatMessage(int connectionId, String now, long elapsed, String category, String prepared, String sql, String url) {return StringUtils.isNotBlank(sql) ?String.format("SQL执行耗时: %dms | SQL语句:\n%s", elapsed, sql.replaceAll("\\s+", " ")) : "";}
}

此示例将SQL格式化输出,并移除多余空格78。


五、日志持久化到数据库

若需将SQL日志存储至数据库,需额外设计表和异步写入逻辑:

1. 创建日志表

sql

复制

下载

CREATE TABLE sql_log (id BIGINT AUTO_INCREMENT PRIMARY KEY,sql_text TEXT,parameters TEXT,execution_time DATETIME,duration BIGINT,success TINYINT(1)
);
2. 异步写入服务

在自定义日志类中调用服务层异步保存日志:

java

复制

下载

@Service
public class SqlLogService {@Autowiredprivate SqlLogMapper sqlLogMapper;@Async@Transactional(propagation = Propagation.REQUIRES_NEW)public void saveLog(String sql, long duration) {SqlLog log = new SqlLog();log.setSqlText(sql);log.setExecutionTime(new Date());log.setDuration(duration);sqlLogMapper.insert(log);}
}// 在自定义Logger中注入SqlLogService并调用
public class P6SpyCustomLogger implements MessageFormattingStrategy {@Autowiredprivate SqlLogService sqlLogService;@Overridepublic String formatMessage(...) {sqlLogService.saveLog(sql, elapsed);return formattedLog;}
}

需确保日志服务通过@Async异步执行,避免阻塞主线程26。


六、高级配置

1. 参数脱敏

在日志格式化时过滤敏感信息(如密码):

java

复制

下载

private String filterSensitiveParams(String sql) {return sql.replaceAll("\"password\":\"[^\"]+\"", "\"password\":\"***\"");
}
2. 慢SQL告警

通过outagedetectioninterval设置慢SQL阈值(单位秒),超时的SQL会单独记录28。


方案对比

方案优点缺点
P6Spy日志输出配置简单,无需代码侵入需结合异步服务实现持久化
MyBatis拦截器直接集成业务逻辑,灵活需处理参数替换和性能问题

通过以上步骤,P6Spy可完整记录SQL执行细节,并通过异步服务将日志持久化到数据库。此方案适用于调试、性能分析和审计场景,且对原有代码无侵入性

在 SQL Server 2008 R2 中使用 P6Spy 配置数据源,需调整驱动和连接参数。以下是详细步骤:


一、修改数据源配置

在 application.properties 中配置 P6Spy 代理驱动和 SQL Server 连接信息:

properties

复制

下载

# application.properties
spring.datasource.driver-class-name=com.p6spy.engine.spy.P6SpyDriver
spring.datasource.url=jdbc:p6spy:sqlserver://localhost:1433;databaseName=YourDBName
spring.datasource.username=your_username
spring.datasource.password=your_password# SQL Server 其他可选参数(按需添加)
spring.datasource.hikari.connection-timeout=30000
spring.datasource.hikari.maximum-pool-size=10
关键配置说明
  • 驱动类名:使用 com.p6spy.engine.spy.P6SpyDriver 作为代理驱动。

  • URL 格式

    • 原 SQL Server URL 格式:jdbc:sqlserver://主机:端口;databaseName=数据库名

    • 修改为 P6Spy 代理后的 URL:添加 jdbc:p6spy: 前缀,即 jdbc:p6spy:sqlserver://...

  • 认证方式

    • 若使用 Windows 集成身份验证,需在 URL 中添加 integratedSecurity=true,并确保 sqljdbc_auth.dll 在类路径中。


二、添加 SQL Server JDBC 驱动依赖

在 pom.xml 中添加 SQL Server 官方 JDBC 驱动:

xml

复制

下载

运行

<dependency><groupId>com.microsoft.sqlserver</groupId><artifactId>mssql-jdbc</artifactId><version>9.4.1.jre8</version> <!-- 适配 SQL Server 2008 R2 的版本 -->
</dependency>

注意

  • SQL Server 2008 R2 建议使用 mssql-jdbc 6.0 或 7.x 版本(需 JDK 1.8+)。

  • 若使用旧版驱动(如 sqljdbc4),需手动下载 JAR 并添加到项目中。


三、配置 spy.properties

在 src/main/resources 下创建 spy.properties,配置 P6Spy 的日志行为和实际驱动:

properties

复制

下载

# spy.properties# 指定实际数据库驱动类(SQL Server)
driverlist=com.microsoft.sqlserver.jdbc.SQLServerDriver# 日志模块配置
module.log=com.p6spy.engine.logging.P6LogFactory
appender=com.p6spy.engine.spy.appender.Slf4JLogger# 自定义日志格式(可选)
logMessageFormat=com.example.config.P6SpyCustomLogger# 排除无关日志
excludecategories=info,debug,result,batc,resultset# 慢SQL监控(可选)
outagedetection=true
outagedetectioninterval=2
关键参数说明
  • driverlist:必须设置为 SQL Server 的驱动类 com.microsoft.sqlserver.jdbc.SQLServerDriver

  • appender:使用 Slf4JLogger 将日志输出到应用日志系统(如 Logback)。


四、处理 Windows 集成身份验证

若需使用 Windows 身份验证(非用户名/密码方式),需额外配置:

  1. 修改 URL

    properties

    复制

    下载

    spring.datasource.url=jdbc:p6spy:sqlserver://localhost:1433;databaseName=YourDBName;integratedSecurity=true
  2. 添加 sqljdbc_auth.dll

    • 从 Microsoft JDBC 驱动包 中提取 sqljdbc_auth.dll

    • 将文件放在 C:\Windows\System32(Windows)或 Java 库路径中。


五、验证配置

  1. 启动应用:检查控制台是否输出 P6Spy 的初始化日志,例如:

    复制

    下载

    P6SpyOptions 初始化成功
  2. 执行 SQL:触发数据库操作后,观察日志中是否包含完整的 SQL 语句:

    复制

    下载

    SQL执行耗时: 15ms | SQL语句: SELECT * FROM users WHERE id = 1
  3. 检查数据库连接:若出现连接失败,检查以下内容:

    • 驱动类名和 URL 是否正确。

    • SQL Server 服务是否运行(端口 1433 是否开放)。

    • 防火墙是否阻止连接。


六、完整配置示例

1. application.properties

properties

复制

下载

# 数据源配置
spring.datasource.driver-class-name=com.p6spy.engine.spy.P6SpyDriver
spring.datasource.url=jdbc:p6spy:sqlserver://localhost:1433;databaseName=TestDB
spring.datasource.username=sa
spring.datasource.password=your_password# Hikari 连接池配置
spring.datasource.hikari.connection-timeout=30000
spring.datasource.hikari.maximum-pool-size=10
2. spy.properties

properties

复制

下载

driverlist=com.microsoft.sqlserver.jdbc.SQLServerDriver
module.log=com.p6spy.engine.logging.P6LogFactory
appender=com.p6spy.engine.spy.appender.Slf4JLogger
logMessageFormat=com.p6spy.engine.spy.appender.CustomLineFormat
customLogMessageFormat=%(currentTime) | SQL: %(sqlSingleLine)

常见问题排查

问题解决方案
驱动类未找到检查 mssql-jdbc 依赖是否引入,或手动添加 JAR 包。
连接超时确认 SQL Server 实例已启动,且防火墙允许 1433 端口通信。
身份验证失败检查用户名/密码是否正确,或配置 integratedSecurity=true 及 sqljdbc_auth.dll
P6Spy 未生效确保 spy.properties 位于 src/main/resources 目录下。

通过以上配置,即可在 SQL Server 2008 R2 中通过 P6Spy 捕获 SQL 并持久化到数据库。

相关文章:

Java + Spring Boot + MyBatis获取以及持久化sql语句的方法

在Java的Spring Boot项目中结合MyBatis获取实际执行的SQL语句&#xff0c;可以通过以下几种方法实现&#xff1a; 方法一&#xff1a;配置MyBatis日志级别 通过调整日志级别&#xff0c;MyBatis会输出执行的SQL语句及参数&#xff0c;适用于快速调试。 修改application.prope…...

「浏览器即OS」:WebVM技术栈如何用Wasm字节码重构冯·诺依曼体系?

一、冯诺依曼架构的维度坍塌 1. 传统计算模型的能量耗散 浏览器执行效率瓶颈分析&#xff1a; 操作x86指令周期Wasm指令周期能效比提升矩阵乘法3894.2x内存访问1234x系统调用120012100x 二、WebVM的量子纠缠架构 1. 浏览器内核的重构 // 基于WASI的系统调用处理 #[no_mangl…...

Vue3项目目录结构规范建议

以下是一个推荐的 Vue 3 项目目录结构规范&#xff0c;适用于中大型项目并遵循最佳实践&#xff1a; 基础目录结构 bash src/ ├─ assets/ # 静态资源 │ ├─ images/ # 图片文件 │ ├─ fonts/ # 字体文件 │ └─ styles/ …...

【计算机视觉】CV实战项目- Four-Flower:基于TensorFlow的花朵分类实战指南

深度解析Four-Flower&#xff1a;基于TensorFlow的花朵分类实战指南 项目概述与技术背景技术栈组成 完整实战流程环境配置1. 基础环境安装2. 项目环境搭建3. 环境验证 数据准备模型架构解析训练过程优化1. 训练配置2. 关键参数建议3. 训练监控 常见问题与解决方案1. 内存不足错…...

4.27 JavaScript核心语法+事件监听

JavaScript负责网页的行为&#xff08;交互行为&#xff09; JS基本语法&#xff1a; 引用方式 变量&常量&数据类型&#xff1a; alert()标签输出弹出框&#xff0c;如以上代码会输出true。 函数&#xff1a; 自定义对象: 属性方法行为 JS中的全局变量是window。 js…...

于键值(KV)的表

基于键值&#xff08;KV&#xff09;的表 将行编码为键值&#xff08;KVs&#xff09; 索引查询&#xff1a;点查询和范围查询 在关系型数据库中&#xff0c;数据被建模为由行和列组成的二维表。用户通过SQL表达他们的意图&#xff0c;而数据库则神奇地提供结果。不那么神奇的…...

Matlab算例运行

1. 使用终端命令运行算例&#xff1a; 2. 如果点击Run 按钮就是会一直报错&#xff0c;所以直接改成终端运行算例...

package.json script 中的 prepare 脚本的作用是什么

在 package.json 的 scripts 中&#xff0c;prepare 脚本是一个特殊的生命周期脚本&#xff0c;主要作用和执行时机如下&#xff1a; prepare 脚本的作用和执行时机 执行时机&#xff1a; 在执行 npm publish 命令之前运行。在执行不带参数的 npm install 命令时运行&#xff…...

图论---最大流(Dinic)

最大流一定是阻塞流&#xff0c;阻塞流不一定是最大流。 阻塞流---从起点到终点的管道已经阻塞了。 时间复杂度&#xff1a; 一般情况&#xff1a;O(n2m)O(n2m)&#xff08;但实际运行效率较高&#xff0c;尤其在稀疏图上&#xff09;。 使用当前弧优化后&#xff0c;效率接近…...

FastAPI系列06:FastAPI响应(Response)

FastAPI响应&#xff08;Response&#xff09; 1、Response入门2、Response基本操作设置响应体&#xff08;返回数据&#xff09;设置状态码设置响应头设置 Cookies 3、响应模型 response_model4、响应类型 response_classResponse派生类自定义response_class 在“FastAPI系列0…...

双目RealSense系统配置rs_camera.launch----实现D435i自制rosbag数据集到离线场景的slam建图

引言 Intel RealSense系列相机因其出色的深度感知能力和灵活的配置选项&#xff0c;在机器视觉与应用中得到广泛应用。大家在后期的slam学习中&#xff0c;无论是对算法本身的性能要求还是实验的泛化性都有一定的要求&#xff0c;那么公开的数据集如kitti、tum、Eourc不能满足…...

【MCP-2】MCP是什么,利用智普大模型在MaxKB中调用自己开发的MCP服务

在上一篇【MCP-1】MCP是什么&#xff0c;从DEMO入手文章中我们介绍了MCP是什么、他能干啥&#xff0c;以及简单的Demo示例等&#xff0c;这篇文章我们使用MaxKB这个工具&#xff0c;利用智普大模型&#xff0c;看看MCP到底怎么用。 创建SSE协议的MCP服务 在上篇文章中的Demo是…...

Allegro23.1新功能之如何单独关闭铜皮显示效果操作指导

Allegro23.1新功能之如何单独关闭铜皮显示效果操作指导 Allegro升级到了23.1的时候,支持单独关闭铜皮显示 ,如下图 如何仅关闭shape的显示,单独显示线,具体操作如下 点击setup...

《从分遗产说起:JS 原型与继承详解》

“天天开心就好” 先来讲讲概念&#xff1a; 原型&#xff08;Prototype&#xff09; 什么是原型&#xff1f; 原型是 JavaScript 中实现对象间共享属性和方法的机制。每个 JavaScript 对象&#xff08;除了 null&#xff09;都有一个内部链接指向另一个对象&#xff0c;这…...

【Part 2安卓原生360°VR播放器开发实战】第二节|基于等距圆柱投影方式实现全景视频渲染

《VR 360全景视频开发》专栏 将带你深入探索从全景视频制作到Unity眼镜端应用开发的全流程技术。专栏内容涵盖安卓原生VR播放器开发、Unity VR视频渲染与手势交互、360全景视频制作与优化&#xff0c;以及高分辨率视频性能优化等实战技巧。 &#x1f4dd; 希望通过这个专栏&am…...

Android——RecyclerView

RecyclerView的使用 依赖 implementation("androidx.recyclerview:recyclerview:1.4.0")activity_recyclerview.xml <androidx.recyclerview.widget.RecyclerViewandroid:id"id/rv"android:layout_width"match_parent"android:layout_height…...

跨域问题(Cross-Origin Problem)

跨域问题&#xff08;Cross-Origin Problem&#xff09;是浏览器出于安全考虑&#xff0c;对不同源&#xff08;协议、域名、端口&#xff09;之间的资源访问进行限制而引发的限制。以下是详细解释&#xff1a; 1. 核心定义 跨域&#xff1a;当一个网页&#xff08;源A&#x…...

阿里云直接对系统云盘扩容

阿里云直接对系统云盘扩容 登录阿里云控制台&#xff0c;进入ECS实例管理页面&#xff0c;检查目标磁盘的容量是否已更新为扩容后的数值。通过SSH远程连接服务器&#xff0c;使用命令 lsblk 或 fdisk -l 查看当前磁盘分区和容量&#xff0c;确认扩容后的物理磁盘已被系统识别。…...

Java大厂面试突击:从Spring Boot自动配置到Kafka分区策略实战解析

第一轮核心知识 面试官&#xff1a;请解释Spring Boot中自动配置的工作原理并演示如何自定义一个ConfigurationProperties组件&#xff1f; xbhog&#xff1a;自动配置通过EnableAutoConfiguration注解触发&#xff0c;结合当前环境判断&#xff08;如是否检测到MyBatis依赖&…...

【python】lambda用法(结合例子理解)

目录 lambda 是什么? 为什么叫 lambda? 语法 举例 1. 最简单的 lambda:单个数字处理 2. 用 lambda 排序一组字符串(按照长度排序) 3. 在列表里找出绝对值最小的数字 4. 给 map() 用 lambda 5. 组合使用:筛选出偶数 lambda 和 def 的对比 lambda 适合用在什么地…...

前端Ui设计工具

PS 稿、蓝湖、Sketch 和 Figma 前端 UI 设计工具的对比分析 PS 稿&#xff08;Adobe Photoshop&#xff09; 提供精准设计细节&#xff1a;PS 稿能让前端更精准地理解页面布局、元素尺寸、颜色等&#xff0c;通过精确测量和查看信息面板&#xff0c;把握设计元素的空间关系、…...

深入探索Python Pandas:解锁数据分析的无限可能

放在前头 深入探索Python Pandas&#xff1a;解锁数据分析的无限可能 深入探索Python Pandas&#xff1a;解锁数据分析的无限可能 在当今数据驱动的时代&#xff0c;高效且准确地处理和分析数据成为了各个领域的关键需求。而Python作为一门强大且灵活的编程语言&#xff0c;…...

django admin 设置字段不可编辑

在Django中&#xff0c;如果你想让管理员在后台管理界面中无法编辑某个字段&#xff0c;你可以通过在模型的Meta类中设置editable属性为False&#xff0c;或者在admin.py文件中使用readonly_fields属性来实现。 方法1&#xff1a;在模型中使用Meta类设置 你可以在模型的Meta类…...

AI在医疗领域的10大应用:从疾病预测到手术机器人

AI在医疗领域的10大应用&#xff1a;从疾病预测到手术机器人 系统化学习人工智能网站&#xff08;收藏&#xff09;&#xff1a;https://www.captainbed.cn/flu 文章目录 AI在医疗领域的10大应用&#xff1a;从疾病预测到手术机器人摘要引言1. 医学影像诊断&#xff1a;从静态…...

深入理解 Java 单例模式:从基础到最佳实践

单例&#xff08;Singleton&#xff09;模式是 Java 中最基本、最常用的设计模式之一。它确保一个类在任何情况下都只有一个实例&#xff0c;并提供一个全局访问点来获取这个唯一的实例。 一、为什么需要单例模式&#xff1f;&#xff08;使用场景&#xff09; 单例模式主要适…...

Rust:安全与性能兼得的现代系统编程语言

一、起源与设计理念 Rust 是由 Mozilla 研究院 Graydon Hoare 于 2006 年发起设计的系统级编程语言&#xff0c;其诞生源于传统系统语言&#xff08;如 C/C&#xff09;在内存安全与并发编程方面的缺陷。经过近十年的迭代&#xff0c;Rust 1.0 稳定版于 2015 年正式发布&#…...

AI赋能智慧医疗新范式:小天互连即时通讯打造高效、安全的医疗通讯平台

在医疗行业&#xff0c;高效的信息协作与严格的数据安全不仅直接关系患者诊疗效率&#xff0c;更是医院现代化管理的核心命题。小天互连即时通讯系统通过将智能化功能与医疗场景深度结合&#xff0c;打造出全链路数字化协作平台&#xff0c;有效破解了传统沟通模式的效率瓶颈&a…...

图像生成新势力:GPT-Image-1 与 GPT-4o 在智创聚合 API 的较量

在人工智能领域&#xff0c;图像生成技术正迅速发展&#xff0c;OpenAI 推出的 GPT-Image-1 和 GPT-4o 在图像生成方面展现出了强大的能力。智创聚合 API 平台已支持这两个模型&#xff0c;并且其图片生成 / 编辑工作台支持图片的循环编辑等功能&#xff0c;为用户提供了更便捷…...

如何避免爬虫因Cookie过期导致登录失效

1. Cookie的作用及其过期机制 1.1 什么是Cookie&#xff1f; Cookie是服务器发送到用户浏览器并保存在本地的一小段数据&#xff0c;用于维持用户会话状态。爬虫在模拟登录后&#xff0c;通常需要携带Cookie访问后续页面。 1.2 Cookie为什么会过期&#xff1f; 会话Cookie&…...

集成方案 | Docusign + 甄零科技,赋能企业海外业务高效增长!

本文将详细介绍 Docusign 与甄零科技的集成步骤及其效果&#xff0c;并通过实际应用场景来展示 Docusign 的强大集成能力&#xff0c;以证明 Docusign 集成功能的高效性和实用性。 甄零科技是一家专注于数字化合同管理系统的 SaaS 解决方案提供商&#xff0c;致力于为企业打造“…...

【Arxiv 2025】Single Image Iterative Subject-driven Generation and Editing

文章目录 文章标题作者及研究团队介绍01 在论文所属的研究领域&#xff0c;有哪些待解决的问题或者现有的研究工作仍有哪些不足&#xff1f;02 这篇论文主要解决了什么问题&#xff1f;03 这篇论文解决问题采用的关键解决方案是什么&#xff1f;04 这篇论文的主要贡献是什么&am…...

CoOAG:首个捕捉学术研究兴趣动态演变的数据集

2025-04-24&#xff0c;由西安交通大学基于学术合作网络构建一种新的动态图数据集CoOAG&#xff0c;用于研究动态图中的节点分类问题。该数据集通过捕捉作者研究兴趣的动态变化&#xff0c;为动态图学习领域提供了新的研究方向和测试平台&#xff0c;特别是在标签受限的动态节点…...

决策树随机深林

决策树和随机森林是机器学习中常用的两种模型&#xff0c;以下是对它们的简单介绍&#xff1a; 决策树 - 原理&#xff1a;通过一系列的条件判断对样本进行分类或预测。它由节点&#xff08;内部节点是属性上的测试&#xff0c;叶节点是类别或值&#xff09;和边组成&#xff0…...

Unity 和 Unreal Engine(UE) 两大主流游戏引擎的核心使用方法

以下是 Unity 和 Unreal Engine&#xff08;UE&#xff09; 两大主流游戏引擎的核心使用方法和对比分析&#xff0c;帮助开发者快速上手并根据项目需求选择合适工具&#xff1a; 一、Unity 使用指南 1. 安装与配置 安装&#xff1a;从 Unity Hub 下载&#xff0c;选择长期支持…...

Maven 依赖范围(Scope)详解

Maven 依赖范围&#xff08;Scope&#xff09;详解 Maven 是一个强大的项目管理工具&#xff0c;广泛用于 Java 开发中构建、管理和部署应用程序。在使用 Maven 构建项目时&#xff0c;我们经常需要引入各种第三方库或框架作为项目的依赖项。通过在 pom.xml 文件中的 <depe…...

博物馆除湿控湿保卫战:M-5J1R 电解除湿科技如何重塑文物守护的未来

在卢浮宫幽深的长廊里&#xff0c;达芬奇的《蒙娜丽莎》正经历着一场看不见的战争——不是来自时间的侵蚀&#xff0c;而是空气中无形的水分子。每一件文物都在与湿度进行着无声的抗争&#xff0c;这场抗争关乎人类文明的延续。湿度&#xff0c;这个看不见的文物杀手&#xff0…...

消防应急物资智能调用立库:豪越科技助力消防“速战速决”

在消防救援的战场上&#xff0c;时间就是生命&#xff0c;每一秒都关乎着人民群众的生命财产安全。然而&#xff0c;在过去的紧急救援中&#xff0c;应急物资无法及时到位的情况时有发生&#xff0c;成为制约救援效率的关键难题&#xff0c;给救援工作带来了巨大的困境。 想象一…...

机器学习基础理论 - 分类问题评估指标

几个定义:混淆矩阵 TP: True Positives, 表示实际为正例且被分类器判定为正例的样本数FP: False Positives, 表示实际为负例且被分类器判定为正例的样本数FN: False Negatives, 表示实际为正例但被分类器判定为负例的样本数TN: True Negatives, 表示实际为负例且被分类…...

深度学习4.1 多层感知机

基本概念 多层感知机&#xff08;Multilayer Perceptron, MLP&#xff09;是一种‌前馈人工神经网络‌&#xff0c;由输入层、至少一个隐藏层和输出层组成。 ‌核心特点‌&#xff1a; 采用‌全连接结构‌&#xff08;相邻层神经元全部相连&#xff1b; 通过‌非线性激活函数‌…...

解决两个技术问题后小有感触-QZ Tray使用经验小总结

老朋友都知道&#xff0c;我现在是一家软件公司销售部门的项目经理和全栈开发工程师&#xff0c;就是这么“奇怪”的岗位&#xff0c;大概我是公司销售团队里比较少有技术背景、销售业绩又不那么理想的销售。 近期在某个票务系统项目上驻场&#xff0c;原来我是这个项目的项目…...

非计算机专业如何利用AI开展跨学科和交叉研究

对于非计算机专业的研究者&#xff0c;利用AI开展跨学科研究既充满机遇也面临挑战。以下是一份系统化的指南&#xff0c;帮助您高效入门并找到交叉研究的突破口&#xff1a; 一、认知重塑&#xff1a;理解AI的本质与局限 AI不是“黑箱”&#xff1a;现代AI以数据驱动为核心&a…...

Python 数据可视化进阶:精准插入图表到指定 Excel 工作表

Python 数据可视化进阶&#xff1a;精准插入图表到指定 Excel 工作表 在处理数据的过程中&#xff0c;我们常常需要将生成的图表精准地插入到已存在数据的 Excel 文件的指定工作表中。借助 Python 的强大库组合&#xff0c;这一操作得以高效实现。以下是经过优化和注释补充的代…...

MQTT - MQTT 实践(Windows EMQX、MQTTX、客户端认证、连接与主题)

概述 -说明概括MQTT消息队列遥测传输协议一种规则EMQX一款大规模分布式物联网接入平台一个平台MQTTXMQTT 客户端一个工具 工具&#xff08;MQTTX&#xff09;和平台&#xff08;EMQX&#xff09;间遵循规则&#xff08;MQTT&#xff09;即可进行双向通信 一、Windows EMQX 下…...

【计算机网络物理层】从信号传输到介质选型的核心技术解析

目录 前言技术背景与价值当前技术痛点解决方案概述目标读者说明 一、技术原理剖析核心概念图解核心作用讲解关键技术模块说明技术选型对比 二、实战演示环境配置要求核心代码实现&#xff08;信号模拟&#xff09;运行结果验证 三、性能对比测试方法论量化数据对比结果分析 四、…...

云原生--核心组件-容器篇-5-Docker核心之-容器

1、Docker容器的定义与核心概念 定义&#xff1a; Docker容器是基于Docker镜像运行的轻量级、独立、可移植的运行环境&#xff0c;它封装了应用程序及其依赖项&#xff0c;提供了一个隔离的执行空间。容器化应用比传统的虚拟机更加高效&#xff0c;因为它们共享主机操作系统的内…...

一、I/O的相关概念

I/O的相关概念 1、I/O I/O即Input和Output&#xff0c;用户进程执行I/O操作&#xff0c;归结起来&#xff0c;也就是向操作系统发出请求&#xff0c;读请求就把数据填到缓冲区里&#xff0c;写数据就把缓冲区里数据排干&#xff0c;目的地可以是磁盘也可以是其他通道。进程通…...

django filter 日期大于当前日期的

在Django中&#xff0c;如果你想要过滤出日期大于当前日期的记录&#xff0c;你可以使用Django的QuerySet API中的__gt&#xff08;大于&#xff09;操作符。这里是如何做到这一点的步骤&#xff1a; 确定你的模型&#xff1a;首先&#xff0c;确保你有一个模型&#xff08;Mo…...

Unreal Engine 实现智慧水库周边环境以及智慧社区模拟的实例

下面分别为你介绍使用 Unreal Engine 实现智慧水库周边环境以及智慧社区模拟的实例。 智慧水库周边环境模拟 1. 场景搭建 地形与地理特征&#xff1a;利用 Unreal Engine 的地形编辑工具&#xff0c;依据水库实际的地理测绘数据构建地形。模拟山脉、丘陵、河流等周边地貌&am…...

[MCU]SRAM

MCU存储体系 1.SRAM 2.FLASH 3.TCM SRAM SRAM&#xff08;Static Random-Access Memory&#xff09;:静态随机存取存储器. 特点&#xff1a;访问速度快、断电丢失、不 SRAM分类 1.系统SRAM&#xff1a;连接在系统总线上&#xff0c;所有外设和CPU都可访问 2.TCM SRAM&…...

【dockerredis】用docker容器运行单机redis

一、实验环境 操作系统&#xff1a;CentOS7.5 Minimal docker版本&#xff1a;18.06-ce redis版本&#xff1a;6.0.6 二、安装docker 关闭selinux # setenforce 0 # sed -i s/^SELINUX.*/SELINUXpermissive/g /etc/selinux/config 下载docker二进制安装包 # yum -y install…...