Mybatis-Plus的使用
1. MyBatis-Plus介绍
MyBatis-Plus(简称 MP)是⼀个MyBatis的增强⼯具,在MyBatis的基础上只做增强不做改变,为简化开 发.提⾼效率⽽⽣
特性:
• 润物⽆声:只做增强不做改变,引⼊它不会对现有⼯程产⽣影响,如丝般顺滑.
• 效率⾄上:只需简单配置,即可快速进⾏单表CRUD操作,从⽽节省⼤量时间.
• 丰富功能:代码⽣成、⾃动分⻚、逻辑删除、⾃动填充、拦截器等功能⼀应俱全.
• ⼴泛认可:连续5年获得开源中国年度最佳开源项⽬殊荣,Github累计16KStar.
⽀持数据库: PostgreSQL, MySQL, MariaDB, Oracle, SQL Server, OceanBase, H2, DB2... (任何能使⽤MyBatis进行增删改查,并且⽀持标准SQL的数据库应该都在MyBatis-Plus的⽀持范围内)
2.准备项目
2. 1.Mysql的数据准备
创建用户表,并创建对应的实体类User
<dependency><groupId>com.mysql</groupId><artifactId>mysql-connector-j</artifactId><scope>runtime</scope></dependency>
2.2.项目准备
1. 创建springboot⼯程
2. 添加MyBatis-Plus和MySQL依赖,配置数据库连接信息
2.1.1pom.xml文件配置
mybatis-plus
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-spring-boot3-starter</artifactId>
<version>3.5.5</version>
</dependency>
MySQL
<dependency><groupId>com.mysql</groupId><artifactId>mysql-connector-j</artifactId><scope>runtime</scope></dependency>
application.yml文件, 配置内容如下:
#数据库连接配置
spring:datasource:url: jdbc:mysql://127.0.0.1:3306/mybatis_test?characterEncoding=utf8&useSSL=falseusername: rootpassword: 123456driver-class-name: com.mysql.cj.jdbc.Driver
2.3 编码
创建实体类UserInfo
@Data
@NoArgsConstructor
@AllArgsConstructor
public class UserInfo {private Integer id;private String username;private String password;private Integer age;private Integer gender;private String phone;private Integer deleteFlag;private Date createTime;private Date updateTime;
}
编写Mapper接口类
MybatisPlus提供了⼀个基础的 BaseMapper 接口,已经实现了单表的CRUD,我们⾃定义的 Mapper只需要继承这个BaseMapper,就⽆需⾃⼰实现单表CRUD。
@Mapper
public interface UserInfoMapper extends BaseMapper<UserInfo> {}
在创建出来的SpringBoot⼯程中,在src下的test⽬录下,已经⾃动帮我们创建好了测试类,我们可以直接使用这个测试类来进行测试. 编写几个单元测试,测试基本的CRUD功能
@Slf4j //日志注解
@SpringBootTest //表示是测试类
class MybatisPlusDemoApplicationTests {@Autowiredprivate UserInfoMapper userInfoMapper;@Testvoid testInsert() {UserInfo user = new UserInfo();user.setUsername("张三");user.setPassword("123456");user.setAge(18);user.setGender(1);user.setPhone("12345678901");userInfoMapper.insert(user);}@Testvoid testSelectById() {UserInfo user = userInfoMapper.selectById(1L);System.out.println("user: " + user);}@Testvoid testSelectByIds() {List<UserInfo> users = userInfoMapper.selectBatchIds(List.of(1L, 2L, 3L,4L));users.forEach(System.out::println);}@Testvoid testUpdateById() {UserInfo user = new UserInfo();user.setId(1);user.setPassword("4444444");userInfoMapper.updateById(user);}@Testvoid testDelete() {userInfoMapper.deleteById(5L);}
}
3. MyBatis-Plus复杂操作
3.1 常见注解
@Mapperpublic interface UserInfoMapper extends BaseMapper<UserInfo> {}
UserlnfoMapper在继承BaseMapper时,指定了一个泛型,这个Userlnfo就是与数据库表相对应的实体类,
MyBatis-Plus会根据这个实体类来推断表的信息.
默认情况下:
1.表名:实体类的驼峰表示法转换成蛇形表示法(下划线分割),作为表名.
比如 Userlnfo->user_info
2.字段:根据实体类的属性名转换为蛇形表示法作为字段名.
比如 deleteFlag->delete_flag
3.主键:默认为id
那如果实体类和数据库不是按照上述规则定义的呢?MyBatis-Plus也给我们提供了一下注解,让我们标识表的信息
3.1.1 @TableName
将UserInfo修改为Userinfo 通过@TableName来标识实体类对应的表
@Data
@TableName("user_info")
public class Userinfo {private Integer id;private String username;private String password;private Integer age;private Integer gender;private String phone;private Integer deleteFlag;private Date createTime;private Date updateTime;
}
做如上操作程序运行结果正常,不然会报出 mybatis_test.userinfo doesn't exist 异常.
3.1.2 @TableField
修改属性名deleteFlag为deleteflag,重新执行测试方法testSelectById
@Data
public class UserInfo {private Integer id;private String username;private String password;private Integer age;private Integer gender;private String phone;@TableField("delete_flag")private Integer deleteFlag;private Date createTime;private Date updateTime;
}
做如上操作程序运行结果正常,不然会报出 Unknown column 'deleteflag' in field list 异常
3.1.3 @TableId
我们可以通过@TableId来指定对应的主键
@Data
public class UserInfo {@TableId("id")private Integer userId;private String username;private String password;private Integer age;private Integer gender;private String phone;private Integer deleteFlag;private Date createTime;private Date updateTime;
}
如果属性名和字段名不⼀致,需要在 @TableId
指明对应的字段名 属性名和字段⼀致的情况下,直接加 @TableId 注解就可以
做如上操作程序运行结果正常.
3.2 打印日志
为了方便学习,我们可以借助日志,查看Mybatis-Plus执行的SQL语句,参数和执行结果
Mybatis-Plus配置日志如下:
mybatis-plus:configuration:log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
3.3 条件构造器
入门程序里的使用,都是简单的CRUD,在实际的应用场景中,我们还需要使用更复杂的操作,MyBatis-Plus也给我们提供了相应的支持.
MyBatis-Plus提供了一套强大的条件构造器(Wrapper),用于构建复杂的数据库查询条件.Wrapper类允许开发者以链式调用的方式构造查询条件,无需编写繁琐的SQL语句,从而提高开发效率并减少SQL注入的风险。
以下是主要的Wrapper类及其功能:
AstractWrapper | 这是一个抽象基类,提供了所有Wrapper类共有的方法和属性.详细参考官网 介绍:条件构造器 |
QueryWrapper | 用于构造查询条件,在AbstractWrapper的基础上拓展了一个select方法,允许指定查询字段. |
UpdateWrapper | 用于构造更新条件,可以在更新数据时指定条件. |
LambdaQueryWrapper | 基于Lambda表达式的查询条件构造器,它通过Lambda表达式来引用实体类的属性,从而避免了硬编码字段名. |
ambdaUpdateWrapper | 基于Lambda表达式的更新条件构造器,它允许你使用Lambda表达式来指定更新字段和条件,同样避免了硬编码字段名的问题. |
3.3.1 QueryWrapper
QueryWrapper并不只用于查询语句,⽆论是修改,删除,查询,都可以使用QueryWrapper来构建查询条件.
查询
完成下述SQL查询
SELECT id,username,password,age FROM user_info WHERE age = 18 AND username
"%min%"
测试代码
@Test
void testQueryWrapper(){
QueryWrapper<UserInfo> userInfoQueryWrapper = new QueryWrapper<UserInfo>()
.select("id","username","password","age")
.eq("age",18)
.like("username", "min");
List<UserInfo> userInfos = userInfoMapper.selectList(userInfoQueryWrapper) ;
userInfos.forEach(System.out::println);
}
更新
完成下述SQL查询
UPDATE user_info SET delete_flag=? WHERE age < 20
测试代码
@Testvoid testUpdateByQueryWrapper(){QueryWrapper<UserInfo> userInfoQueryWrapper = new QueryWrapper<UserInfo>().lt("age", 20);UserInfo userInfo = new UserInfo();userInfo.setDeleteFlag(1);userInfoMapper.update(userInfo, userInfoQueryWrapper);}
lt:"lessthan"的缩写,表示小于.
le:"lessthanorequalto"的缩写,表示小于等于
ge:"greaterthanorequalto"的缩写,表示大于等于.
gt:"greaterthan"的缩写,表示大于.
eq:"equals"的缩写,表示等于.
ne:"notequals"的缩写,表示不等于.
删除
完成下述SQL查询
DELETE FROM user_info WHERE age = 18
测试代码
@Testvoid testDeleteByQueryWrapper(){QueryWrapper<UserInfo> userInfoQueryWrapper = new QueryWrapper<UserInfo>().eq("age",18);userInfoMapper.delete(userInfoQueryWrapper);}
3.3.2 UpdateWrapper
对于更新,我们也可以直接使⽤UpdateWrapper,在不创建实体对象的情况下,直接设置更新字段和条 件.
基础更新:
完成下述SQL查询
UPDATE user_info SET delete_flag=0, age=5 WHERE id IN (1,2,3)
测试代码
@Testvoid testUpdateByUpdateWrapper(){UpdateWrapper<UserInfo> updateWrapper = new UpdateWrapper<UserInfo>().set("delete_flag",0).set("age", 5).in("id", List.of(1,2,3));userInfoMapper.update(updateWrapper);}
基于SQL更新:
完成下述SQL查询
UPDATE user_info SET age = age+10 WHERE id IN (1,2,3);
测试代码
@Testvoid testUpdateBySQLUpdateWrapper(){UpdateWrapper<UserInfo> updateWrapper = new UpdateWrapper<UserInfo>().setSql("age = age+10").in("id", List.of(1,2,3));userInfoMapper.update(updateWrapper);}
3.3.3 LambdaQueryWrapper
QueryWrapper和UpdateWrapper存在一个问题,就是需要写死字段名,如果字段名发生变更,可能会因为测试不到位酿成事故.
MyBatis-Plus给我们提供了一种基于Lambda表达式的条件构造器,它通过Lambda表达式来引用实体类的属性,从而避免了硬编码字段名,也提高了代码的可读性和可维护性.
LambdaQueryWrapper
LambdaUpdateWrapper
分别对应上述的QueryWrapper和UpdateWrapper
具体使用
@Testvoid testLambdaQueryWrapper(){QueryWrapper<UserInfo> queryWrapper = new QueryWrapper<UserInfo>();queryWrapper.lambda().select(UserInfo::getUsername, UserInfo::getPassword,UserInfo::getAge).eq(UserInfo::getUserId, 1);userInfoMapper.selectList(queryWrapper).forEach(System.out::println);}
3.3.4 LambdaUpdateWrapper
LambdaUpdateWrapper⽤法和LambdaQueryWrapper相似
@Testvoid testLambdUpdateByUpdateWrapper(){UpdateWrapper<UserInfo> updateWrapper = new UpdateWrapper<UserInfo>();updateWrapper.lambda().set(UserInfo::getDeleteFlag, 0).set(UserInfo::getAge, 5).in(UserInfo::getUserId, List.of(1,2,3));userInfoMapper.update(updateWrapper);}
3.4 自定义SQL
在实际的开发中,MyBatis-Plus提供的操作不能满⾜我们的实际需求,MyBatis-Plus也提供了⾃定义 SQL的功能,我们可以利⽤Wrapper构造查询条件,再结合Mapper编写SQL。为了使用这一功能,mybatis-plus版本不低于3.0.7
代码示例1
完成下述SQL查询
select id,username,password,age FROM user_info WHERE username = "admin"
Mapper:
@Mapperpublic interface UserInfoMapper extends BaseMapper<UserInfo> {@Select("select id,username,password,age FROM user_info
${ew.customSqlSegment}")List<UserInfo> queryUserByCustom(@Param(Constants.WRAPPER)
Wrapper<UserInfo> wrapper);}
测试代码
@Testvoid testQueryUserByCustom(){QueryWrapper<UserInfo> queryWrapper = new QueryWrapper<UserInfo>().eq("username","admin");userInfoMapper.queryUserByCustom(queryWrapper).forEach(System.out::println);}
注意事项:
参数命名:在自定义SQL时,传递Wrapper对象作为参数时,参数名必须为ew,或者使用注解
@Param(Constants.wRAPPER)明确指定参数为Wrapper对象.
·使用${ew.customSqlSegment}:在SQL语句中,使用${ew.customSqLSegment}来
引用Wrapper对象生成的SQL片段.
·不支持基于entity的where语句:自定义SQL时,Wrapper对象不会基于实体类自动生成
where子句,你需要手动编写完整的SQL语句.
代码示例2
MyBatis-Plus 在 MyBatis 的基础上只做增强不做改变,所以也⽀持XML的实现⽅式
上述功能也可以使⽤XML的⽅式完成
1. 配置mapper路径
mybatis-plus:mapper-locations: "classpath*:/mapper/**.xml" # Mapper.xml
2. 定义方法
@Mapperpublic interface UserInfoMapper extends BaseMapper<UserInfo> {List<UserInfo> queryUserByCustom2(@Param(Constants.WRAPPER)
Wrapper<UserInfo> wrapper);}
3. 编写XML
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.example.book.mapper.UserInfoMapper"><select id="queryUserByCustom2">select id,username,password,age FROM user_info ${ew.customSqlSegment}</select>
</mapper>
4. 测试
@Testvoid testQueryUserByCustom2(){QueryWrapper<UserInfo> queryWrapper = new QueryWrapper<UserInfo>().eq("username","admin");userInfoMapper.queryUserByCustom2(queryWrapper).forEach(System.out::println);}
代码示例3
完成下述SQL查询
UPDATE user_info SET age = age+10 WHERE id IN (1,2,3);
Mapper:
@Update("UPDATE user_info SET age = age+ #{addAge} ${ew.customSqlSegment}")void updateUserByCustom(@Param("addAge") int addAge, @Param("ew")
Wrapper<UserInfo> wrapper);
测试代码
@Testvoid updateUserByCustom(){QueryWrapper<UserInfo> queryWrapper = new QueryWrapper<UserInfo>().in("id",List.of(1,2,3));userInfoMapper.updateUserByCustom(10, queryWrapper);}
相关文章:
Mybatis-Plus的使用
1. MyBatis-Plus介绍 MyBatis-Plus(简称 MP)是⼀个MyBatis的增强⼯具,在MyBatis的基础上只做增强不做改变,为简化开 发.提⾼效率⽽⽣ 特性: • 润物⽆声:只做增强不做改变,引⼊它不会对现有⼯程产⽣影响,如丝般顺滑. • 效率⾄上:只需简单配置&#…...
基于YOLO11深度学习的心脏超声图像间隔壁检测分割与分析系统【python源码+Pyqt5界面+数据集+训练代码】深度学习实战、目标分割、人工智能
《------往期经典推荐------》 一、AI应用软件开发实战专栏【链接】 项目名称项目名称1.【人脸识别与管理系统开发】2.【车牌识别与自动收费管理系统开发】3.【手势识别系统开发】4.【人脸面部活体检测系统开发】5.【图片风格快速迁移软件开发】6.【人脸表表情识别系统】7.【…...
什么是神经网络?
0 前言 神经网络是一种人工智能方法,用于教计算机以受人脑启发的方式处理数据。这是一种机器学习过程,称为深度学习,它使用类似于人脑的分层结构中的互连节点或神经元。它可以创建自适应系统,计算机使用该系统来从错误中进行学习…...
【第12章:深度学习与伦理、隐私—12.1 AI伦理原则与偏见检测的方法与实践】
凌晨三点,某法院的AI量刑系统突然将一桩盗窃案的刑期预测从6个月改为3年——只因被告人的居住地邮编关联到某个少数族裔聚居区。这场静默的算法叛乱,揭开了AI伦理问题的冰山一角。 一、AI伦理的五大天条 1.1 公平性原则:算法没有"完美中立" ![不同算法在COMPAS…...
运用先进的智能算法和优化模型,进行科学合理调度的智慧园区开源了
智慧园区场景视频监控平台是一款功能强大且简单易用的实时算法视频监控系统。它的愿景是最底层打通各大芯片厂商相互间的壁垒,省去繁琐重复的适配流程,实现芯片、算法、应用的全流程组合,从而大大减少企业级应用约95%的开发成本。充分利用现有…...
Redis过期机制
const (cacheDuration 24 * time.Hour )func SetToCache(rdb *redis.Client, key string, data []byte) error {return rdb.Set(rdb.Context(), key, data, cacheDuration).Err() }以上函数中的rdb.Set(rdb.Context(), key, data, cacheDuration).Err()中的 cacheDuration一旦…...
Android ListPreference使用
Android ListPreference使用 参考 添加链接描述 导入 androidx.preference.ListPreferenceListPreference是Android中的一个Preference子类,用于显示一个可选择的列表,并且可以保存用户所选择的值。它继承自DialogPreference,可以在用户点击时弹出一个对话框,显示可选择的…...
10分钟上手DeepSeek开发:SpringBoot + Vue2快速构建AI对话系统
作者:后端小肥肠 目录 1. 前言 为什么选择DeepSeek? 本文技术栈 2. 环境准备 2.1. 后端项目初始化 2.2. 前端项目初始化 3. 后端服务开发 3.1. 配置文件 3.2. 核心服务实现 4. 前端服务开发 4.1. 聊天组件ChatWindow.vue开发 5. 效果展示及源…...
瑞芯微RV1126部署YOLOv8全流程:环境搭建、pt-onnx-rknn模型转换、C++推理代码、错误解决、优化、交叉编译第三方库
目录 1 环境搭建 2 交叉编译opencv 3 模型训练 4 模型转换 4.1 pt模型转onnx模型 4.2 onnx模型转rknn模型 4.2.1 安装rknn-toolkit 4.2.2 onn转成rknn模型 5 升级npu驱动 6 C++推理源码demo 6.1 原版demo 6.2 增加opencv读取图片的代码 7 交叉编译x264 ffmepg和op…...
泰山派RK3566移植QT,动鼠标时出现屏幕闪烁
总结: 交叉编译到 泰山派rk3566跑调海康摄像头的qt应用程序失败了。 X11无效窗口。 移植QT注意 屏幕分辨率不要改。改了执行QT的时候,framebuffer识别不出设备。 命令行安装QT-Creator sudo install 类似的指令安装Qt-Creator时,可能找不到编…...
一周学会Flask3 Python Web开发-post请求与参数获取
锋哥原创的Flask3 Python Web开发 Flask3视频教程: 2025版 Flask3 Python web开发 视频教程(无废话版) 玩命更新中~_哔哩哔哩_bilibili app.route 装饰器默认只支持get请求。假如我们要让绑定的视图函数支持其他请求方式,我们可以在methods属性里配置…...
Vue 3 中可读可写的计算属性(Computed Properties)的使用场景
在 Vue 3 中,计算属性(Computed Properties)是一种基于响应式依赖进行缓存的属性。它们通常用于处理复杂的逻辑,并且只有当依赖的响应式数据发生变化时,才会重新计算。计算属性非常适合用于处理模板中的复杂表达式&…...
EXCEL解决IF函数“您已为此函数输入太多个参数”的报错
IF函数的基本结构是IF(条件, 值为真时的结果, 值为假时的结果),所以标准的IF函数最多只能有三个参数。当用户输入的参数超过三个时,Excel就会报这个错误。比如多个IF语句叠加,但可能在嵌套的过程中没有正确关闭每个IF函数的括号,导…...
Redis7——基础篇(二)
前言:此篇文章系本人学习过程中记录下来的笔记,里面难免会有不少欠缺的地方,诚心期待大家多多给予指教。 基础篇: Redis(一) 接上期内容:上期完成了Redis环境的搭建。下面开始学习Redis常用命令…...
vue3 ref和reactive的区别
在 Vue 3 中,ref 和 reactive 是两种用于创建响应式数据的 API,但它们的使用场景和实现方式有一些区别。用大白话来说,它们的区别可以这样理解: 1. ref:适合处理简单数据 是什么:ref 是用来包装一个基本类…...
Elasticsearch7.1.1 配置密码和SSL证书
生成SSL证书 ./elasticsearch-certutil ca -out config/certs/elastic-certificates.p12 -pass 我这里没有设置ssl证书密码,如果需要设置密码,需要再配置给elasticsearch 在之前的步骤中,如果我们对elastic-certificates.p12 文件配置了密码…...
初识Redis
1.什么是Redis Redis是一种基于键值对(key-value)的NoSQL数据库。与很多键值对数据库不同的是,Redis中的value可以由String(字符串),hash(哈希),list(列表&a…...
Python Selenium自动化操作详解:从入门到实战
Python Selenium自动化操作详解:从入门到实战 一、Selenium简介 Selenium是一个用于Web应用程序自动化测试的工具,支持多种浏览器和编程语言。结合Python使用,可以实现: 自动化表单提交动态网页数据抓取功能测试网页交互模拟 二…...
第四天面试题
文章目录 1.什么叫 Java 的内存泄露与内存溢出?**1. 内存泄露(Memory Leak)****内存泄露的常见原因:****如何避免内存泄露:** **2. 内存溢出(Out Of Memory, OOM)****内存溢出的常见原因&#x…...
[论文阅读] SeeSR: Towards Semantics-Aware Real-World Image Super-Resolution
文章目录 一、前言二、主要贡献三、Introduction四、Methodology4.1 Motivation :4.2Framework Overview.** 一、前言 通信作者是香港理工大学 & OPPO研究所的张磊教授,也是图像超分ISR的一个大牛了。 论文如下 SeeSR: Towards Semantics-Aware Rea…...
面试题之箭头函数和普通函数有什么区别?
箭头函数(Arrow Function)和普通函数(Regular Function)是 JavaScript 中两种不同的函数定义方式,它们在语法、上下文(this)、原型链等方面存在显著区别。以下是它们的主要区别: 1. …...
jQuery AJAX 方法详解
jQuery AJAX 方法详解 引言 随着互联网技术的不断发展,前端开发领域的技术也在不断更新迭代。jQuery 作为一种广泛使用的前端JavaScript库,极大地简化了DOM操作和事件处理。在众多jQuery功能中,AJAX(Asynchronous JavaScript and XML)方法尤为突出,它允许我们在不重新加…...
深度集成DeepSeek大模型:WebSocket流式聊天实现
目录 5分钟快速接入DeepSeek大模型:WebSocket实时聊天指南创建应用开发后端代码 (Python/Node.js)结语 5分钟快速接入DeepSeek大模型:WebSocket实时聊天指南 创建应用 访问DeepSeek官网 前往 DeepSeek官网。如果还没有账号,需要先注册一个。…...
千峰React:组件使用(1)
事件 添加点击事件 function App() {const handClick () > {console.log(123)}return (<><button onClick{handClick}>点击</button></>) } export default App在react里也可以添加事件对象e 合成e 这个e和js里的e不太一样,是合成的…...
ram的使用——初始化很重要
背景 ram是非常常用的ip,前人的经验告诉我们,如果不对ram进行初始化直接读写,不定态在实际上板时会出现不可预知的问题。 我们需要对ram进行初始化写0操作,代码如下。需要注意,复位释放时立马写入可能存在复位抖动的…...
JVM深入理解
目录 JVM介绍: 解释: 特点: 整体构成: 执行过程: 运行时数据区: Java堆剖析: 堆内存区域划分 为什么要分代呢? 内存分配: 新生区与老年区配置比例:…...
DeepSeek 开放平台无法充值 改用其他平台API调用DeepSeek-chat模型方法
近几天DeepSeek开放平台无法充值目前已经关闭状态,大家都是忙着接入DeepSeek模型 ,很多人想使用DeepSeek怎么办? 当然还有改用其他平台API调用方法,本文以本站的提供chatgpt系统为例,如何修改DeepSeek-chat模型API接口…...
ImportError: cannot import name ‘FixtureDef‘ from ‘pytest‘
错误信息表明 pytest 在尝试导入 FixtureDef 时出现了问题。通常是由于 pytest 版本不兼容 或 插件版本冲突 引起的。以下是详细的排查步骤和解决方案: 1. 检查 pytest 版本 首先,确认当前安装的 pytest 版本。某些插件可能需要特定版本的 pytest 才能…...
懒人精灵本地离线卡密验证系统教程(不联网、安全稳定、省钱、永久免费、无任何限制)
1.合集懒人精灵本地离线卡密验证系统教程(不联网、安全稳定、省钱、永久免费、无任何限制):https://www.bilibili.com/video/BV1M6rdYEEog/ 备注: 1.本地离线卡密采用最安全的非对称加解密技术,设备id采用最安全多重混合加密不可逆技术生成&…...
Rust编程语言入门教程 (六)变量与可变性
Rust 系列 🎀Rust编程语言入门教程(一)安装Rust🚪 🎀Rust编程语言入门教程(二)hello_world🚪 🎀Rust编程语言入门教程(三) Hello Cargo…...
ArcGis和Super Map
1.ArcGIS ArcGIS 是美国环境系统研究所(ESRI)开发的一系列地理信息系统(GIS)软件产品的总称,它提供了一套全面的工具和服务,可用于采集、存储、分析、管理和展示地理数据,在众多领域都有广泛的…...
POI优化Excel录入
57000单词原始录入时间258S 核心代码: List<Word> wordBookList ExcelUtil.getReader(file.getInputStream()).readAll(Word.class);if (!CollectionUtil.isEmpty(wordBookList)) {for (Word word : wordBookList) {//逐条向数据库中插入单词wordMapper.insert(word);}…...
Zookeeper和Kafka的依赖关系
Zookeeper 和 Kafka 是紧密相关的,它们在功能上相互协作,共同为分布式系统提供支持,以下是它们的关系具体介绍: Kafka 依赖 Zookeeper 进行元数据管理 主题信息存储:Kafka 中的主题(Topic)相关信息,如主题的名称、分区数量、副本分布等都存储在 Zookeeper 中。当 Kafk…...
驱动开发、移植
一、任务明确:把创龙MX8的驱动 按照我们的要求 然后移植到 我们的板子 1.Linux系统启动卡制作, sd卡 先按照 《用户手册—3-2-Linux系统启动卡制作及系统固化》 把创龙的Linux系统刷进去。 2. 把TLIMX8-EVM的板子过一遍 把刚刚烧好系统的sd卡插入 创…...
RT-Thread+STM32L475VET6实现红外遥控实验
文章目录 前言一、板载资源介绍二、具体步骤1. 确定红外接收头引脚编号2. 下载infrared软件包3. 配置infrared软件包4. 打开STM32CubeMX进行相关配置4.1 使用外部高速时钟,并修改时钟树4.2 打开定时器16(定时器根据自己需求调整)4.3 打开串口4.4 生成工程 5. 打开HW…...
分布式大语言模型服务引擎vLLM论文解读
论文地址:Efficient Memory Management for Large Language Model Serving with PagedAttention 摘要 大语言模型(LLMs)的高吞吐量服务需要一次对足够多的请求进行批处理。然而,现有系统面临困境,因为每个请求的键值…...
Bio-ORACLE数据分享[decade 2010-2020] [Surface layers]
Bio-ORACLE数据分享[decade 2010-2020] [Surface layers] 文章目录 Bio-ORACLE数据分享[decade 2010-2020] [Surface layers]前言一、文件分享(主要)二、相关代码(选看)总结 Bio-ORACLE数据分享[decade 2010-2020] [Surface layer…...
MySQL六大日志的功能介绍。
前言 首先,MySQL的日志应该包括二进制日志(Binary Log)、错误日志(Error Log)、查询日志(General Query Log)、慢查询日志(Slow Query Log)、重做日志(Redo …...
ChatGPT客户端无法在微软应用商店下载的解决方法
最近网页端的GPT4o只会用how can I assist you 回复了,查了一下发现是类似IP封锁/模型降级等等问题,总之解决方法就是下载客户端。客户端需要通过微软应用商店下载,但是下载时总会出现如下情况: 1.区域和语言没有设置为美国/英语导…...
数仓搭建(hive):DWS层(服务数据层)
DWS层示例: 搭建日主题宽表 需求 维度 步骤 在hive中建数据库dws >>建表 CREATE DATABASE if NOT EXISTS DWS; 建表sql CREATE TABLE yp_dws.dws_sale_daycount( --维度 city_id string COMMENT 城市id, city_name string COMMENT 城市name, trade_area_id string COMME…...
Ollama+DeepSeek+Open-WebUi
环境准备 Docker Ollama Open-WebUi Ollama 下载地址:Ollama docker安装ollama docker run -d \ -v /data/ollama/data:/root/.ollama \ -p 11434:11434 \ --name ollama ollama/ollama 下载模型 Ollama模型仓库 # 示例:安装deepseek-r1:7b doc…...
【笔记】LLM|Ubuntu22服务器极简本地部署DeepSeek+联网使用方式
2025/02/18说明:2月18日~2月20日是2024年度博客之星投票时间,走过路过可以帮忙点点投票吗?我想要前一百的实体证书,经过我严密的计算只要再拿到60票就稳了。一人可能会有多票,Thanks♪(・ω・)&am…...
FreeSwitch中mod_dptools和mod_easyroute两个模块及应用场景
FreeSWITCH 中的 mod_dptools 和 mod_easyroute 是两个功能不同的模块,分别服务于呼叫控制和动态路由场景。以下是详细介绍: mod_dptools 功能概述 mod_dptools(Dialplan Tools)是 FreeSWITCH 最核心的模块之一,提供了…...
【Java】泛型与集合篇 —— Set 接口
目录 Set 接口及实现类HashSet 类特点内部实现构造方法LinkedHashSet 类基本概念特点构造方法常用方法适用场景用 Set 对象实现集合运算TreeSet 类特性构造方法常用方法注意事项对象顺序自然排序定制排序注意事项Set 接口及实现类 HashSet 类 HashSet 是 Java 集合框架中 Set…...
DeepSeek 助力 Vue 开发:打造丝滑的右键菜单(RightClickMenu)
前言:哈喽,大家好,今天给大家分享一篇文章!并提供具体代码帮助大家深入理解,彻底掌握!创作不易,如果能帮助到大家或者给大家一些灵感和启发,欢迎收藏关注哦 💕 目录 Deep…...
数据结构与算法面试专题——堆排序
完全二叉树 完全二叉树中如果每棵子树的最大值都在顶部就是大根堆 完全二叉树中如果每棵子树的最小值都在顶部就是小根堆 设计目标:完全二叉树的设计目标是高效地利用存储空间,同时便于进行层次遍历和数组存储。它的结构使得每个节点的子节点都可以通过简…...
【Mysql】索引
【Mysql】索引 一、索引的简介二、索引结构2.1 Hash2.2 二叉搜索树2.3 B树2.4 B树 三、索引分类3.1 主键索引3.2 普通索引3.3 唯一索引3.4 全文索引3.5 聚集索引3.6 非聚集索引3.7 索引覆盖 四、使用索引4.1 自动创建索引4.2 手动创建索引4.2.1 主键索引4.2.2 唯一索引4.2.3 普…...
qt的下载安装详细介绍
下载 我们可以在国内的镜像网站上下载qt安装包,按需下载: 我的需求是在windows上运行,x64的qt5.15.2,所以我下载的是qt-unified-windows-x64-4.6.0-online.exe 下载完成之后,我们来到存放该exe文件的目录,打开命令窗…...
Eclipse插件开发六:使用Web前端技术开发AI助手页面
之前的过程中,我们都不怎么熟悉Eclipse的哪些API,样式也没发怎么去修改,现在我们要修改为用html的方式来编写. 准备一个AI助手聊天页面的html.css,js代码 效果如下所示。 1.快速demo 1.1.准备前端代码 确保准备的前端代码可以在浏览器正常…...
Jackson使用
Jackson 是一个功能强大的 JSON 处理库,除了基本的序列化和反序列化功能外,它还提供了许多其他功能,以满足不同的需求。以下是一些常用的高级功能: 0.普通序列化反序列化 序列化 import com.fasterxml.jackson.databind.ObjectM…...