若依 MyBatis改为MyBatis-Plus
主要内容:升级成mybatis-plus,代码生成也是mybatis-plus版本
跟着我一步一步来,就可完成升级!
检查:启动程序,先保证若依能启动
第一步:添加依赖
这里需要在两个地方添加,一个是最外面的父工程的pom.xml,一个是ruoyi-common的pom.xml。
最外面的父工程的pom.xml:
1.添加版本信息
代码:
<!-- mybatis-plus 版本--><mybatis-pluc.version>3.4.2</mybatis-pluc.version>
2.添加mybatis-plus依赖
代码:
<!-- mybatis-plus 增强CRUD -->
<dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-boot-starter</artifactId><version>3.4.2</version>
</dependency>
ruoyi-common的pom.xml:
1.直接继承父工程的依赖
第一步验证:
admin的包中的application.yml文件有mybatis-plus的提示,说明依赖弄好啦!
第二步:修改application.yml文件
1.删除旧的mybatis配置
2.写入新配置
代码:
# MyBatis Plus配置
mybatis-plus:# 搜索指定包别名 根据自己的项目来typeAliasesPackage: com.rchuing.sis.**.domain # 配置mapper的扫描,找到所有的mapper.xml映射文件mapperLocations: classpath*:mapper/**/*Mapper.xml# 加载全局的配置文件configLocation: classpath:mybatis/mybatis-config.xmlglobal-config:enable-sql-runner: truedb-config:id-type: auto
第三步:重写mybatis配置文件
1.在framework中,找到MybatisConfig文件,然后删除。
2.在刚删除的文件夹下,新建一个MybatisPlus的java文件
复制已下内容到java文件中:
/*** Mybatis Plus 配置** @author ruoyi*/
@EnableTransactionManagement(proxyTargetClass = true)
@Configuration
public class MybatisPlusConfig
{@Beanpublic MybatisPlusInterceptor mybatisPlusInterceptor(){MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();// 分页插件interceptor.addInnerInterceptor(paginationInnerInterceptor());// 乐观锁插件interceptor.addInnerInterceptor(optimisticLockerInnerInterceptor());// 阻断插件interceptor.addInnerInterceptor(blockAttackInnerInterceptor());return interceptor;}/*** 分页插件,自动识别数据库类型 https://baomidou.com/guide/interceptor-pagination.html*/public PaginationInnerInterceptor paginationInnerInterceptor(){PaginationInnerInterceptor paginationInnerInterceptor = new PaginationInnerInterceptor();// 设置数据库类型为mysqlpaginationInnerInterceptor.setDbType(DbType.MYSQL);// 设置最大单页限制数量,默认 500 条,-1 不受限制paginationInnerInterceptor.setMaxLimit(-1L);return paginationInnerInterceptor;}/*** 乐观锁插件 https://baomidou.com/guide/interceptor-optimistic-locker.html*/public OptimisticLockerInnerInterceptor optimisticLockerInnerInterceptor(){return new OptimisticLockerInnerInterceptor();}/*** 如果是对全表的删除或更新操作,就会终止该操作 https://baomidou.com/guide/interceptor-block-attack.html*/public BlockAttackInnerInterceptor blockAttackInnerInterceptor(){return new BlockAttackInnerInterceptor();}
}
如图:
到这里Mybatis-plus就升级完成了。但代码生成里面还是以前mybatis的,这里也需要升级一下,方便代码生成。
第四步:把代码生成修改为mybatis-plus版本
1.在generator找到vm中的java文件夹
2.修改里面内容:这里直接上代码了,找到对应的直接复制粘贴就行。
2.1:domain.java.vm
package ${packageName}.domain;#foreach ($import in $importList)
import ${import};
#end
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import org.apache.commons.lang3.builder.ToStringBuilder;
import org.apache.commons.lang3.builder.ToStringStyle;
import com.rchuing.sis.common.annotation.Excel;
#if($table.crud || $table.sub)
import com.rchuing.sis.common.core.domain.BaseEntity;
#elseif($table.tree)
import com.fenghuang.common.core.domain.TreeEntity;
#end/*** ${functionName}对象 ${tableName}** @author ${author}* @date ${datetime}*/
#if($table.crud || $table.sub)#set($Entity="BaseEntity")
#elseif($table.tree)#set($Entity="TreeEntity")
#end
@TableName(resultMap = "${packageName}.mapper.${ClassName}Mapper.${ClassName}Result")
public class ${ClassName} extends ${Entity}{
private static final long serialVersionUID = 1L;#foreach ($column in $columns)#if(!$table.isSuperColumn($column.javaField))/** $column.columnComment */#if($column.list)#set($parentheseIndex=$column.columnComment.indexOf("("))#if($parentheseIndex != -1)#set($comment=$column.columnComment.substring(0, $parentheseIndex))#else#set($comment=$column.columnComment)#end#if($parentheseIndex != -1)@Excel(name = "${comment}", readConverterExp = "$column.readConverterExp()")#elseif($column.javaType == 'Date')@JsonFormat(pattern = "yyyy-MM-dd")@Excel(name = "${comment}", width = 30, dateFormat = "yyyy-MM-dd")#else@Excel(name = "${comment}")#end#end#if($column.isPk == 1)@TableId(value = "$column.columnName",type = IdType.AUTO)#endprivate $column.javaType $column.javaField;#end
#end
#if($table.sub)
/** $table.subTable.functionName信息 */
private List<${subClassName}> ${subclassName}List;#end
#foreach ($column in $columns)#if(!$table.isSuperColumn($column.javaField))#if($column.javaField.length() > 2 && $column.javaField.substring(1,2).matches("[A-Z]"))#set($AttrName=$column.javaField)#else#set($AttrName=$column.javaField.substring(0,1).toUpperCase() + ${column.javaField.substring(1)})#endpublic void set${AttrName}($column.javaType $column.javaField){this.$column.javaField = $column.javaField;}public $column.javaType get${AttrName}(){return $column.javaField;}#end
#end#if($table.sub)
public List<${subClassName}> get${subClassName}List(){return ${subclassName}List;}public void set${subClassName}List(List<${subClassName}> ${subclassName}List){this.${subclassName}List = ${subclassName}List;}#end
@Override
public String toString() {return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE)#foreach ($column in $columns)#if($column.javaField.length() > 2 && $column.javaField.substring(1,2).matches("[A-Z]"))#set($AttrName=$column.javaField)#else#set($AttrName=$column.javaField.substring(0,1).toUpperCase() + ${column.javaField.substring(1)})#end.append("${column.javaField}", get${AttrName}())#end#if($table.sub).append("${subclassName}List", get${subClassName}List())#end.toString();}}
2.2:mapper.java.vm
package ${packageName}.mapper;import java.util.List;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import ${packageName}.domain.${ClassName};
#if($table.sub)
import ${packageName}.domain.${subClassName};
#end/*** ${functionName}Mapper接口** @author ${author}* @date ${datetime}*/
public interface ${ClassName}Mapper extends BaseMapper<${ClassName}> {/*** 查询${functionName}** @param ${pkColumn.javaField} ${functionName}主键* @return ${functionName}*/public ${ClassName} select${ClassName}By${pkColumn.capJavaField}(${pkColumn.javaType} ${pkColumn.javaField});/*** 查询${functionName}列表** @param ${className} ${functionName}* @return ${functionName}集合*/public List<${ClassName}> select${ClassName}List(${ClassName} ${className});/*** 新增${functionName}** @param ${className} ${functionName}* @return 结果*/public int insert${ClassName}(${ClassName} ${className});/*** 修改${functionName}** @param ${className} ${functionName}* @return 结果*/public int update${ClassName}(${ClassName} ${className});/*** 删除${functionName}** @param ${pkColumn.javaField} ${functionName}主键* @return 结果*/public int delete${ClassName}By${pkColumn.capJavaField}(${pkColumn.javaType} ${pkColumn.javaField});/*** 批量删除${functionName}** @param ${pkColumn.javaField}s 需要删除的数据主键集合* @return 结果*/public int delete${ClassName}By${pkColumn.capJavaField}s(${pkColumn.javaType}[] ${pkColumn.javaField}s);
#if($table.sub)/*** 批量删除${subTable.functionName}** @param ${pkColumn.javaField}s 需要删除的数据主键集合* @return 结果*/public int delete${subClassName}By${subTableFkClassName}s(${pkColumn.javaType}[] ${pkColumn.javaField}s);/*** 批量新增${subTable.functionName}** @param ${subclassName}List ${subTable.functionName}列表* @return 结果*/public int batch${subClassName}(List<${subClassName}> ${subclassName}List);/*** 通过${functionName}主键删除${subTable.functionName}信息** @param ${pkColumn.javaField} ${functionName}ID* @return 结果*/public int delete${subClassName}By${subTableFkClassName}(${pkColumn.javaType} ${pkColumn.javaField});
#end
}
2.3:service.java.vm
package ${packageName}.service;import java.util.List;
import ${packageName}.domain.${ClassName};
import com.baomidou.mybatisplus.extension.service.IService;/*** ${functionName}Service接口** @author ${author}* @date ${datetime}*/
public interface I${ClassName}Service extends IService<${ClassName}> {/*** 查询${functionName}** @param ${pkColumn.javaField} ${functionName}主键* @return ${functionName}*/public ${ClassName} select${ClassName}By${pkColumn.capJavaField}(${pkColumn.javaType} ${pkColumn.javaField});/*** 查询${functionName}列表** @param ${className} ${functionName}* @return ${functionName}集合*/public List<${ClassName}> select${ClassName}List(${ClassName} ${className});/*** 新增${functionName}** @param ${className} ${functionName}* @return 结果*/public int insert${ClassName}(${ClassName} ${className});/*** 修改${functionName}** @param ${className} ${functionName}* @return 结果*/public int update${ClassName}(${ClassName} ${className});/*** 批量删除${functionName}** @param ${pkColumn.javaField}s 需要删除的${functionName}主键集合* @return 结果*/public int delete${ClassName}By${pkColumn.capJavaField}s(${pkColumn.javaType}[] ${pkColumn.javaField}s);/*** 删除${functionName}信息** @param ${pkColumn.javaField} ${functionName}主键* @return 结果*/public int delete${ClassName}By${pkColumn.capJavaField}(${pkColumn.javaType} ${pkColumn.javaField});
}
2.4:serviceimpl.java.vm
package ${packageName}.service.impl;import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import java.util.List;
#foreach ($column in $columns)
#if($column.javaField == 'createTime' || $column.javaField == 'updateTime')
import com.rchuing.common.utils.DateUtils;
#break
#end
#end
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
#if($table.sub)
import java.util.ArrayList;
import com.rchuing.common.utils.StringUtils;
import org.springframework.transaction.annotation.Transactional;
import ${packageName}.domain.${subClassName};
#end
import ${packageName}.mapper.${ClassName}Mapper;
import ${packageName}.domain.${ClassName};
import ${packageName}.service.I${ClassName}Service;/*** ${functionName}Service业务层处理** @author ${author}* @date ${datetime}*/
@Service
public class ${ClassName}ServiceImpl extends ServiceImpl<${ClassName}Mapper, ${ClassName}> implements I${ClassName}Service {@Autowiredprivate ${ClassName}Mapper ${className}Mapper;/*** 查询${functionName}** @param ${pkColumn.javaField} ${functionName}主键* @return ${functionName}*/@Overridepublic ${ClassName} select${ClassName}By${pkColumn.capJavaField}(${pkColumn.javaType} ${pkColumn.javaField}) {return ${className}Mapper.select${ClassName}By${pkColumn.capJavaField}(${pkColumn.javaField});}/*** 查询${functionName}列表** @param ${className} ${functionName}* @return ${functionName}*/@Overridepublic List<${ClassName}> select${ClassName}List(${ClassName} ${className}) {return ${className}Mapper.select${ClassName}List(${className});}/*** 新增${functionName}** @param ${className} ${functionName}* @return 结果*/
#if($table.sub)@Transactional
#end@Overridepublic int insert${ClassName}(${ClassName} ${className}) {
#foreach ($column in $columns)
#if($column.javaField == 'createTime')${className}.setCreateTime(DateUtils.getNowDate());
#end
#end
#if($table.sub)int rows = ${className}Mapper.insert${ClassName}(${className});insert${subClassName}(${className});return rows;
#elsereturn ${className}Mapper.insert${ClassName}(${className});
#end}/*** 修改${functionName}** @param ${className} ${functionName}* @return 结果*/
#if($table.sub)@Transactional
#end@Overridepublic int update${ClassName}(${ClassName} ${className}) {
#foreach ($column in $columns)
#if($column.javaField == 'updateTime')${className}.setUpdateTime(DateUtils.getNowDate());
#end
#end
#if($table.sub)${className}Mapper.delete${subClassName}By${subTableFkClassName}(${className}.get${pkColumn.capJavaField}());insert${subClassName}(${className});
#endreturn ${className}Mapper.update${ClassName}(${className});}/*** 批量删除${functionName}** @param ${pkColumn.javaField}s 需要删除的${functionName}主键* @return 结果*/
#if($table.sub)@Transactional
#end@Overridepublic int delete${ClassName}By${pkColumn.capJavaField}s(${pkColumn.javaType}[] ${pkColumn.javaField}s) {
#if($table.sub)${className}Mapper.delete${subClassName}By${subTableFkClassName}s(${pkColumn.javaField}s);
#endreturn ${className}Mapper.delete${ClassName}By${pkColumn.capJavaField}s(${pkColumn.javaField}s);}/*** 删除${functionName}信息** @param ${pkColumn.javaField} ${functionName}主键* @return 结果*/
#if($table.sub)@Transactional
#end@Overridepublic int delete${ClassName}By${pkColumn.capJavaField}(${pkColumn.javaType} ${pkColumn.javaField}) {
#if($table.sub)${className}Mapper.delete${subClassName}By${subTableFkClassName}(${pkColumn.javaField});
#endreturn ${className}Mapper.delete${ClassName}By${pkColumn.capJavaField}(${pkColumn.javaField});}
#if($table.sub)/*** 新增${subTable.functionName}信息** @param ${className} ${functionName}对象*/public void insert${subClassName}(${ClassName} ${className}) {List<${subClassName}> ${subclassName}List = ${className}.get${subClassName}List();${pkColumn.javaType} ${pkColumn.javaField} = ${className}.get${pkColumn.capJavaField}();if (StringUtils.isNotNull(${subclassName}List)){List<${subClassName}> list = new ArrayList<${subClassName}>();for (${subClassName} ${subclassName} : ${subclassName}List){${subclassName}.set${subTableFkClassName}(${pkColumn.javaField});list.add(${subclassName});}if (list.size() > 0){${className}Mapper.batch${subClassName}(list);}}}
#end
}
2.5:sub-domain.java.vm
package ${packageName}.domain;#foreach ($import in $subImportList)
import ${import};
#end
import org.apache.commons.lang3.builder.ToStringBuilder;
import org.apache.commons.lang3.builder.ToStringStyle;
import com.rchuing.common.annotation.Excel;
import com.rchuing.common.core.domain.BaseEntity;/*** ${subTable.functionName}对象 ${subTableName}** @author ${author}* @date ${datetime}*/
public class ${subClassName} extends BaseEntity {private static final long serialVersionUID = 1L;#foreach ($column in $subTable.columns)
#if(!$table.isSuperColumn($column.javaField))/** $column.columnComment */
#if($column.list)
#set($parentheseIndex=$column.columnComment.indexOf("("))
#if($parentheseIndex != -1)
#set($comment=$column.columnComment.substring(0, $parentheseIndex))
#else
#set($comment=$column.columnComment)
#end
#if($parentheseIndex != -1)@Excel(name = "${comment}", readConverterExp = "$column.readConverterExp()")
#elseif($column.javaType == 'Date')@JsonFormat(pattern = "yyyy-MM-dd")@Excel(name = "${comment}", width = 30, dateFormat = "yyyy-MM-dd")
#else@Excel(name = "${comment}")
#end
#endprivate $column.javaType $column.javaField;#end
#end
#foreach ($column in $subTable.columns)
#if(!$table.isSuperColumn($column.javaField))
#if($column.javaField.length() > 2 && $column.javaField.substring(1,2).matches("[A-Z]"))
#set($AttrName=$column.javaField)
#else
#set($AttrName=$column.javaField.substring(0,1).toUpperCase() + ${column.javaField.substring(1)})
#endpublic void set${AttrName}($column.javaType $column.javaField) {this.$column.javaField = $column.javaField;}public $column.javaType get${AttrName}() {return $column.javaField;}
#end
#end@Overridepublic String toString() {return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE)
#foreach ($column in $subTable.columns)
#if($column.javaField.length() > 2 && $column.javaField.substring(1,2).matches("[A-Z]"))
#set($AttrName=$column.javaField)
#else
#set($AttrName=$column.javaField.substring(0,1).toUpperCase() + ${column.javaField.substring(1)})
#end.append("${column.javaField}", get${AttrName}())
#end.toString();}
}
到这里就升级完成。
下面进行测试:
1.
2.
3.如果看到mybatis的东西,说明升级成功!
注意:
1.这里可能有些包的路径不对,把爆红的包删除,重新导入就可!
2.因为实际项目路径不同,这里可能需要手动修改!
3.在BaseEntity类中
相关文章:

若依 MyBatis改为MyBatis-Plus
主要内容:升级成mybatis-plus,代码生成也是mybatis-plus版本 跟着我一步一步来,就可完成升级! 检查:启动程序,先保证若依能启动 第一步:添加依赖 这里需要在两个地方添加,一个是最…...
docker-ubuntu
docker ps docker images 拉取ubuntu镜像 docker pull ubuntu 启动 docker start podid docker run -itd -e TZAsia/Shanghai --name ubuntu-test -v /share:/shared -d ubuntu:latest 进入bash界面 docker exec -it podid /bin/bash 安装sudo apt-get install sudo …...

Mock 基本使用
mock解决的问题 开发时,后端还没完成数据输出,前端只好写静态模拟数据。数据太长了,将数据写在js文件里,完成后挨个改url。某些逻辑复杂的代码,加入或去除模拟数据时得小心翼翼。想要尽可能还原真实的数据,…...

MySql学习笔记08——事务介绍
事务 基本概念 事务是一个完整的业务逻辑,是一个最小的工作单元,不可再分。 一个完整的业务逻辑包括一系列的操作,这些操作是整个业务逻辑中的最小单元,这些操作要么同时成功,要么同时失败。 由于只有DML语句中才会…...
AMEYA360:思瑞浦推出汽车级超低静态功耗高压LDO—TPL8031Q
聚焦高性能模拟芯片和嵌入式处理器创新研发的半导体公司——思瑞浦3PEAK(股票代码:688536),推出全新一代汽车级超低静态功耗高压线性稳压器——TPL8031Q。 TPL8031Q拥有支持3V~42V宽输入电压范围、3μA超低静态功耗、多种封装可选等性能优势,…...
保留 N 条数据功能 实现方案
需求:用户浏览某信息后 就插入一条浏览记录,该浏览记录限制只保留 N 条。 实现方案: 1. 插入记录 2. 查询总记录 3. 判断:总记录 是否大于 阈值 3.1 如果大于:总记录 - 阈值 获取到超出数量,将对超出数…...

SOME/IP TTL 在各种Entry 中各是什么意思?有什么限制?
1 服务发现 SOME/IP SD 服务发现主要用于 定位服务实例检测服务实例状态是否在运行发布/订阅行为管理SOME/IP SD 也是 SOME/IP 消息,遵循 SOME/IP 消息格式,有固定的 Message ID、Request ID 以及 Message Type 等。并对 SOME/IP Payload 进行了详细的定义。 SOME/IP SD …...

CSS中如何实现元素的旋转和缩放效果?
聚沙成塔每天进步一点点 ⭐ 专栏简介⭐ 元素的旋转和缩放效果⭐ 写在最后 ⭐ 专栏简介 前端入门之旅:探索Web开发的奇妙世界 记得点击上方或者右侧链接订阅本专栏哦 几何带你启航前端之旅 欢迎来到前端入门之旅!这个专栏是为那些对Web开发感兴趣、刚刚踏…...

Unity通过偏移UV播放序列帧动画
大家好,我是阿赵。 在Unity引擎里面用shader播放序列图,估计很多人都有用到了,我自己而已写过好几个版本。这里大概介绍一下。 一、原理 先说目的,我现在有一张这样的图片: 这张图片上面,有9个格子&a…...

无涯教程-Android - List fragments函数
框架的ListFragment的静态库支持版本,用于编写在Android 3.0之前的平台上运行的应用程序,在Android 3.0或更高版本上运行时,仍使用此实现。 List fragment 的基本实现是用于创建fragment中的项目列表 List in Fragments 示例 本示例将向您说明如何基于…...

【图解RabbitMQ-3】消息队列RabbitMQ介绍及核心流程
🧑💻作者名称:DaenCode 🎤作者简介:CSDN实力新星,后端开发两年经验,曾担任甲方技术代表,业余独自创办智源恩创网络科技工作室。会点点Java相关技术栈、帆软报表、低代码平台快速开…...

jmeter源码二次开发
本文以jmeter5.5为例,扩展“TCP Socket支持定长的返回字节流”功能。 一、 源码本地编译运行 1、在jmeter官网下载源码:jmeter各版本源码地址 2、在idea中用gradle导入jmeter源码,idea中要配置jdk,gradle,我用的是j…...

深入实现 MyBatis 底层机制的任务阶段4 - 开发 Mapper 接口和 Mapper.xml
😀前言 在我们的自定义 MyBatis 底层机制实现过程中,我们已经深入研究了多个任务阶段,包括配置文件的读取、数据库连接的建立、执行器的编写,以及 SqlSession 的封装。每个任务阶段都为我们揭示了 MyBatis 内部工作原理的一部分&a…...

分享一下在微信上有哪些微信活动可以做
微信营销活动是吸引更多用户和提高品牌知名度的有效策略。下面是一些微信营销活动的做法: 抽奖活动:通过设置奖品和参与条件,吸引用户参与抽奖活动。例如,可以设置关注公众号、转发活动页面等条件,吸引更多用户参与抽奖…...

视频监控/视频汇聚/视频云存储EasyCVR平台接入国标GB协议后出现断流情况,该如何解决?
视频监控汇聚平台EasyCVR可拓展性强、视频能力灵活、部署轻快,可支持的主流标准协议有国标GB28181、RTSP/Onvif、RTMP等,以及支持厂家私有协议与SDK接入,包括海康Ehome、海大宇等设备的SDK等。安防监控平台EasyCVR既具备传统安防视频监控的能…...

没有软件怎么管理固定资产
在当今数字化的世界中,我们已经习惯了使用各种软件来管理我们的日常生活和工作。然而,当我们面临一个看似简单的问题——如何管理固定资产时,我们可能会感到困惑。那么,如果没有软件,我们该如何进行资产管理呢…...
几种反序列化漏洞
1.PHP魔术方法 <?php class c {private $name hacker;function __construct() { // 构造方法,new时调用echo construct<br>;}function __serialize() { // 序列化时调用echo serialize<br>;return [hack];}function __unserialize($data) { // 反…...

华为OD机试 - 找出符合要求的字符串子串(Java 2023 B卷 100分)
目录 专栏导读一、题目描述二、输入描述三、输出描述四、解题思路五、Java算法源码六、效果展示1、输入2、输出 华为OD机试 2023B卷题库疯狂收录中,刷题点这里 专栏导读 本专栏收录于《华为OD机试(JAVA)真题(A卷B卷)》…...

深度学习环境搭建笔记(二):mmdetection-CPU安装和训练
文章目录 第一步:安装anaconda第二步:安装虚拟环境第三步:安装torch和torchvision第四步: 安装mmcv-full第五步: 安装mmdetection第六步:测试环境第七步:训练-目标检测7.1 准备数据集7.2 检查数据集7.3 训练网络 第一步…...

Ubuntu18.04安装cuDNN
注册账号 https://developer.nvidia.com/rdp/cudnn-archive 该网站下载安装包需要先进行注册。登录成功后,找到与CUDA对应的版本。 选择Linux版本进行下载。 下载后的格式为.tar.xz 解压 tar xvJf cudnn-linux-x86_64-8.9.3.28_cuda12-archive.tar.xz配置环境 su…...
Linux链表操作全解析
Linux C语言链表深度解析与实战技巧 一、链表基础概念与内核链表优势1.1 为什么使用链表?1.2 Linux 内核链表与用户态链表的区别 二、内核链表结构与宏解析常用宏/函数 三、内核链表的优点四、用户态链表示例五、双向循环链表在内核中的实现优势5.1 插入效率5.2 安全…...

循环冗余码校验CRC码 算法步骤+详细实例计算
通信过程:(白话解释) 我们将原始待发送的消息称为 M M M,依据发送接收消息双方约定的生成多项式 G ( x ) G(x) G(x)(意思就是 G ( x ) G(x) G(x) 是已知的)࿰…...

全球首个30米分辨率湿地数据集(2000—2022)
数据简介 今天我们分享的数据是全球30米分辨率湿地数据集,包含8种湿地亚类,该数据以0.5X0.5的瓦片存储,我们整理了所有属于中国的瓦片名称与其对应省份,方便大家研究使用。 该数据集作为全球首个30米分辨率、覆盖2000–2022年时间…...
Neo4j 集群管理:原理、技术与最佳实践深度解析
Neo4j 的集群技术是其企业级高可用性、可扩展性和容错能力的核心。通过深入分析官方文档,本文将系统阐述其集群管理的核心原理、关键技术、实用技巧和行业最佳实践。 Neo4j 的 Causal Clustering 架构提供了一个强大而灵活的基石,用于构建高可用、可扩展且一致的图数据库服务…...

令牌桶 滑动窗口->限流 分布式信号量->限并发的原理 lua脚本分析介绍
文章目录 前言限流限制并发的实际理解限流令牌桶代码实现结果分析令牌桶lua的模拟实现原理总结: 滑动窗口代码实现结果分析lua脚本原理解析 限并发分布式信号量代码实现结果分析lua脚本实现原理 双注解去实现限流 并发结果分析: 实际业务去理解体会统一注…...
Spring Boot+Neo4j知识图谱实战:3步搭建智能关系网络!
一、引言 在数据驱动的背景下,知识图谱凭借其高效的信息组织能力,正逐步成为各行业应用的关键技术。本文聚焦 Spring Boot与Neo4j图数据库的技术结合,探讨知识图谱开发的实现细节,帮助读者掌握该技术栈在实际项目中的落地方法。 …...

Ascend NPU上适配Step-Audio模型
1 概述 1.1 简述 Step-Audio 是业界首个集语音理解与生成控制一体化的产品级开源实时语音对话系统,支持多语言对话(如 中文,英文,日语),语音情感(如 开心,悲伤)&#x…...

多模态大语言模型arxiv论文略读(108)
CROME: Cross-Modal Adapters for Efficient Multimodal LLM ➡️ 论文标题:CROME: Cross-Modal Adapters for Efficient Multimodal LLM ➡️ 论文作者:Sayna Ebrahimi, Sercan O. Arik, Tejas Nama, Tomas Pfister ➡️ 研究机构: Google Cloud AI Re…...

selenium学习实战【Python爬虫】
selenium学习实战【Python爬虫】 文章目录 selenium学习实战【Python爬虫】一、声明二、学习目标三、安装依赖3.1 安装selenium库3.2 安装浏览器驱动3.2.1 查看Edge版本3.2.2 驱动安装 四、代码讲解4.1 配置浏览器4.2 加载更多4.3 寻找内容4.4 完整代码 五、报告文件爬取5.1 提…...
LangChain知识库管理后端接口:数据库操作详解—— 构建本地知识库系统的基础《二》
这段 Python 代码是一个完整的 知识库数据库操作模块,用于对本地知识库系统中的知识库进行增删改查(CRUD)操作。它基于 SQLAlchemy ORM 框架 和一个自定义的装饰器 with_session 实现数据库会话管理。 📘 一、整体功能概述 该模块…...