详解 MyBatis-Plus 框架中 QueryWrapper 类
QueryWrapper
- 一、 QueryWrapper 的概念
- 为什么需要 QueryWrapper?
- 二、 QueryWrapper 的基本使用
- 1. 创建 QueryWrapper 实例
- 2. 添加查询条件
- 3. 执行查询
- 三、 QueryWrapper 的常见方法
- 1. 基本条件方法
- 1.1 `eq` - 等于
- 1.2 `ne` - 不等于
- 1.3 `gt` - 大于
- 1.4 `ge` - 大于等于
- 1.5 `lt` - 小于
- 1.6 `le` - 小于等于
- 1.7 `between` - 在某个范围内
- 1.8 `notBetween` - 不在某个范围内
- 1.9 `like` - 模糊匹配
- 1.10 `notLike` - 不包含某个字符串
- 1.11 `likeLeft` - 左模糊匹配
- 1.12 `likeRight` - 右模糊匹配
- 1.13 `in` - 在某个集合中
- 1.14 `notIn` - 不在某个集合中
- 1.15 `isNull` - 为空
- 1.16 `isNotNull` - 不为空
- 2. 逻辑运算方法
- 2.1 `and` - AND 条件
- 2.2 `or` - OR 条件
- 2.3 `nested` - 嵌套条件
- 3. 排序方法
- 3.1 `orderByAsc` - 升序排序
- 3.2 `orderByDesc` - 降序排序
- 3.3 `orderBy` - 自定义排序
- 4. 选择字段
- 4.1 `select` - 指定查询字段
- 5. 其他实用方法
- 5.1 `last` - 自定义 SQL 片段
- 5.2 `apply` - 动态 SQL 片段
- 6. 综合示例
- 四、 QueryWrapper 与其他 Wrapper 的区别
- LambdaQueryWrapper 的优势
- 五、 应用例子
- 1. 简单查询
- 2. 复杂条件查询
- 3. 动态查询
- 4. 使用 LambdaQueryWrapper
- 六、 QueryWrapper 的注意事项
- 七、 总结
一、 QueryWrapper 的概念
QueryWrapper 是 MyBatis-Plus 框架中的一个核心类,用于以对象化的方式构建 SQL 查询条件。MyBatis-Plus 是一个基于 MyBatis 的增强工具,旨在简化数据库操作,而 QueryWrapper 正是其提供的一个查询构造器。通过链式调用,开发者可以灵活、直观地构造复杂的 SQL 查询,而无需手动编写 SQL 语句。
为什么需要 QueryWrapper?
在传统的 MyBatis 中,查询条件通常需要在 XML 文件中编写 SQL,或者通过字符串拼接生成动态 SQL。这种方式在处理复杂或动态查询时容易出错,且代码可读性较差。QueryWrapper 的出现解决了这些问题,它通过方法调用构建查询条件,不仅提高了代码的安全性(避免 SQL 注入),还让查询逻辑更加清晰。
二、 QueryWrapper 的基本使用
1. 创建 QueryWrapper 实例
QueryWrapper 通常与实体类绑定,通过泛型指定。例如,对于一个 User
实体类,可以这样创建:
QueryWrapper<User> wrapper = new QueryWrapper<>();
这里的 User
就是我们的实体类,代表数据库中的一张表。
2. 添加查询条件
QueryWrapper 提供了丰富的条件构造方法,例如:
eq
:等于ne
:不等于gt
:大于like
:模糊匹配in
:在某个集合中
这些方法支持链式调用,可以轻松组合多个条件。例如:
wrapper.eq("age", 18).like("name", "John");
3. 执行查询
构造好 QueryWrapper 后,将其传递给 MyBatis-Plus 的 Mapper 接口方法(如 selectList
、selectOne
等)来执行查询。例如:
List<User> users = userMapper.selectList(wrapper);
这样就会返回满足条件的用户列表。
三、 QueryWrapper 的常见方法
1. 基本条件方法
这些方法用于指定字段与值之间的关系,通常以数据库列名和对应的值作为参数,是构建查询条件的基础。
1.1 eq
- 等于
- 功能:指定某个字段等于给定的值。
- 参数:
column
:字段名(字符串类型,对应数据库列名)。value
:要匹配的值(可以是任意类型,如整数、字符串等)。
- 使用场景:适用于需要精确匹配的查询,例如查找特定年龄或 ID 的记录。
- 示例:
wrapper.eq("age", 18); // WHERE age = 18
- 说明:生成的 SQL 会将字段与值用
=
连接,适用于简单的相等条件。
1.2 ne
- 不等于
- 功能:指定某个字段不等于给定的值。
- 参数:
column
:字段名。value
:不匹配的值。
- 使用场景:用于排除特定值的记录,例如查找年龄不是 18 的用户。
- 示例:
wrapper.ne("age", 18); // WHERE age != 18
- 说明:生成的 SQL 使用
!=
或<>
表示不等于。
1.3 gt
- 大于
- 功能:指定某个字段大于给定的值。
- 参数:
column
:字段名。value
:比较的下限值。
- 使用场景:查询字段值超过某个阈值的记录,例如查找年龄大于 18 的用户。
- 示例:
wrapper.gt("age", 18); // WHERE age > 18
- 说明:适用于数值型字段的范围查询。
1.4 ge
- 大于等于
- 功能:指定某个字段大于或等于给定的值。
- 参数:
column
:字段名。value
:比较的下限值。
- 使用场景:查询字段值达到或超过某个值的记录,例如查找年龄 18 或以上的用户。
- 示例:
wrapper.ge("age", 18); // WHERE age >= 18
1.5 lt
- 小于
- 功能:指定某个字段小于给定的值。
- 参数:
column
:字段名。value
:比较的上限值。
- 使用场景:查询字段值低于某个阈值的记录,例如查找年龄小于 30 的用户。
- 示例:
wrapper.lt("age", 30); // WHERE age < 30
1.6 le
- 小于等于
- 功能:指定某个字段小于或等于给定的值。
- 参数:
column
:字段名。value
:比较的上限值。
- 使用场景:查询字段值不超过某个值的记录,例如查找年龄 30 或以下的用户。
- 示例:
wrapper.le("age", 30); // WHERE age <= 30
1.7 between
- 在某个范围内
- 功能:指定某个字段的值在给定的闭区间内(包含边界)。
- 参数:
column
:字段名。val1
:范围下限。val2
:范围上限。
- 使用场景:查询字段值在特定范围内的记录,例如查找年龄在 18 到 30 之间的用户。
- 示例:
wrapper.between("age", 18, 30); // WHERE age BETWEEN 18 AND 30
- 说明:等价于
ge("age", 18).le("age", 30)
。
1.8 notBetween
- 不在某个范围内
- 功能:指定某个字段的值不在给定的闭区间内。
- 参数:
column
:字段名。val1
:范围下限。val2
:范围上限。
- 使用场景:查询字段值在特定范围外的记录,例如查找年龄不在 18 到 30 之间的用户。
- 示例:
wrapper.notBetween("age", 18, 30); // WHERE age NOT BETWEEN 18 AND 30
1.9 like
- 模糊匹配
- 功能:指定某个字段包含给定的字符串(前后自动添加通配符
%
)。 - 参数:
column
:字段名。value
:要匹配的子字符串。
- 使用场景:查询字段中包含某个子串的记录,例如查找名字中包含 “John” 的用户。
- 示例:
wrapper.like("name", "John"); // WHERE name LIKE '%John%'
- 说明:
%
表示任意字符的通配符,适合文本搜索。
1.10 notLike
- 不包含某个字符串
- 功能:指定某个字段不包含给定的字符串。
- 参数:
column
:字段名。value
:不匹配的子字符串。
- 使用场景:查询字段中不包含某个子串的记录,例如查找名字不包含 “John” 的用户。
- 示例:
wrapper.notLike("name", "John"); // WHERE name NOT LIKE '%John%'
1.11 likeLeft
- 左模糊匹配
- 功能:指定某个字段以给定的字符串结尾(左侧添加
%
)。 - 参数:
column
:字段名。value
:结尾字符串。
- 使用场景:查询字段以特定字符串结尾的记录,例如查找名字以 “son” 结尾的用户。
- 示例:
wrapper.likeLeft("name", "son"); // WHERE name LIKE '%son'
1.12 likeRight
- 右模糊匹配
- 功能:指定某个字段以给定的字符串开头(右侧添加
%
)。 - 参数:
column
:字段名。value
:开头字符串。
- 使用场景:查询字段以特定字符串开头的记录,例如查找名字以 “Jo” 开头的用户。
- 示例:
wrapper.likeRight("name", "Jo"); // WHERE name LIKE 'Jo%'
1.13 in
- 在某个集合中
- 功能:指定某个字段的值在给定的集合内。
- 参数:
column
:字段名。value
:集合(如List
或数组)。
- 使用场景:查询字段值在特定集合中的记录,例如查找 ID 为 1、2、3 的用户。
- 示例:
wrapper.in("id", Arrays.asList(1, 2, 3)); // WHERE id IN (1, 2, 3)
- 说明:支持动态传入集合,适合批量查询。
1.14 notIn
- 不在某个集合中
- 功能:指定某个字段的值不在给定的集合内。
- 参数:
column
:字段名。value
:集合。
- 使用场景:查询字段值不在特定集合中的记录,例如查找 ID 不在 1、2、3 中的用户。
- 示例:
wrapper.notIn("id", Arrays.asList(1, 2, 3)); // WHERE id NOT IN (1, 2, 3)
1.15 isNull
- 为空
- 功能:指定某个字段为
NULL
。 - 参数:
column
:字段名。
- 使用场景:查询字段值为
NULL
的记录,例如查找没有邮箱的用户。 - 示例:
wrapper.isNull("email"); // WHERE email IS NULL
1.16 isNotNull
- 不为空
- 功能:指定某个字段不为
NULL
。 - 参数:
column
:字段名。
- 使用场景:查询字段值不为
NULL
的记录,例如查找有邮箱的用户。 - 示例:
wrapper.isNotNull("email"); // WHERE email IS NOT NULL
2. 逻辑运算方法
这些方法用于组合多个条件,支持 AND
和 OR
逻辑,增强查询的灵活性。
2.1 and
- AND 条件
- 功能:在当前条件后添加
AND
逻辑,连接另一个条件。 - 参数:
- Lambda 表达式或
Consumer<QueryWrapper>
,用于指定子条件。
- Lambda 表达式或
- 使用场景:组合多个条件时,使用
AND
连接,例如查找年龄为 18 且名字包含 “John” 的用户。 - 示例:
wrapper.eq("age", 18).and(w -> w.like("name", "John")); // WHERE age = 18 AND name LIKE '%John%'
- 说明:Lambda 表达式允许嵌套条件,提高可读性。
2.2 or
- OR 条件
- 功能:在当前条件后添加
OR
逻辑,连接另一个条件。 - 参数:无(链式调用)。
- 使用场景:组合多个条件时,使用
OR
连接,例如查找年龄为 18 或 20 的用户。 - 示例:
wrapper.eq("age", 18).or().eq("age", 20); // WHERE age = 18 OR age = 20
2.3 nested
- 嵌套条件
- 功能:在条件中嵌套子条件,通常与括号一起使用。
- 参数:
- Lambda 表达式,定义嵌套的子条件。
- 使用场景:构建复杂的嵌套查询,例如查找年龄为 18 或 20 的用户,且名字包含 “John”。
- 示例:
wrapper.nested(w -> w.eq("age", 18).or().eq("age", 20)).like("name", "John"); // WHERE (age = 18 OR age = 20) AND name LIKE '%John%'
- 说明:嵌套条件会被括号包裹,便于控制逻辑优先级。
3. 排序方法
这些方法用于指定查询结果的排序方式。
3.1 orderByAsc
- 升序排序
- 功能:按指定字段升序排序。
- 参数:
columns
:一个或多个字段名。
- 使用场景:需要按字段从小到大排序,例如按年龄升序排列用户。
- 示例:
wrapper.orderByAsc("age"); // ORDER BY age ASC
3.2 orderByDesc
- 降序排序
- 功能:按指定字段降序排序。
- 参数:
columns
:一个或多个字段名。
- 使用场景:需要按字段从大到小排序,例如按年龄降序排列用户。
- 示例:
wrapper.orderByDesc("age"); // ORDER BY age DESC
3.3 orderBy
- 自定义排序
- 功能:根据条件动态决定是否排序,以及升序或降序。
- 参数:
condition
:布尔值,是否应用排序。isAsc
:布尔值,是否升序。columns
:字段名。
- 使用场景:动态控制排序逻辑,例如根据参数决定是否按年龄排序。
- 示例:
wrapper.orderBy(true, true, "age"); // ORDER BY age ASC
4. 选择字段
这些方法用于控制查询返回的列,优化数据传输。
4.1 select
- 指定查询字段
- 功能:选择需要查询的字段,而不是默认返回所有字段。
- 参数:
columns
:一个或多个字段名。
- 使用场景:只需要部分字段时,减少不必要的数据返回,例如只查询用户的 ID 和姓名。
- 示例:
wrapper.select("id", "name"); // SELECT id, name FROM user
5. 其他实用方法
5.1 last
- 自定义 SQL 片段
- 功能:在 SQL 末尾追加自定义片段。
- 参数:
sql
:SQL 字符串。
- 使用场景:需要添加特殊 SQL 语句,例如分页限制。
- 示例:
wrapper.last("LIMIT 10"); // 在 SQL 末尾添加 LIMIT 10
5.2 apply
- 动态 SQL 片段
- 功能:添加动态 SQL 片段,支持占位符参数。
- 参数:
sql
:SQL 片段。args
:占位符参数。
- 使用场景:需要动态插入复杂条件,例如日期格式化查询。
- 示例:
wrapper.apply("date_format(create_time, '%Y-%m-%d') = {0}", "2023-01-01"); // WHERE date_format(create_time, '%Y-%m-%d') = '2023-01-01'
6. 综合示例
假设有一个 User
表,包含 id
、name
、age
和 email
字段,以下是一个综合使用常见方法的查询:
QueryWrapper<User> wrapper = new QueryWrapper<>();
wrapper.ge("age", 18) // 年龄 >= 18.like("name", "John") // 名字包含 "John".isNotNull("email") // 邮箱不为空.orderByDesc("age") // 按年龄降序.select("id", "name", "age"); // 只查询 id、name、age 字段
List<User> users = userMapper.selectList(wrapper);
生成 SQL:
SELECT id, name, age
FROM user
WHERE age >= 18
AND name LIKE '%John%'
AND email IS NOT NULL
ORDER BY age DESC
四、 QueryWrapper 与其他 Wrapper 的区别
MyBatis-Plus 提供了多种 Wrapper 类,各有侧重:
QueryWrapper
:专注于构建 SELECT 查询的条件。UpdateWrapper
:用于构建 UPDATE 语句,支持条件和 SET 子句。UpdateWrapper<User> updateWrapper = new UpdateWrapper<>(); updateWrapper.eq("id", 1).set("age", 20); // UPDATE user SET age = 20 WHERE id = 1
LambdaQueryWrapper
:QueryWrapper 的 Lambda 版本,使用 Lambda 表达式指定字段。LambdaUpdateWrapper
:UpdateWrapper 的 Lambda 版本。
LambdaQueryWrapper 的优势
LambdaQueryWrapper 使用 Lambda 表达式,避免了硬编码字段名。例如:
LambdaQueryWrapper<User> lambdaWrapper = new LambdaQueryWrapper<>();
lambdaWrapper.eq(User::getAge, 18); // 使用方法引用指定字段
这种方式更安全,因为字段名由编译器检查,避免拼写错误。
五、 应用例子
1. 简单查询
查询年龄等于 18 岁的用户:
QueryWrapper<User> wrapper = new QueryWrapper<>();
wrapper.eq("age", 18);
List<User> users = userMapper.selectList(wrapper);
生成的 SQL:
SELECT * FROM user WHERE age = 18
2. 复杂条件查询
查询年龄在 18 到 30 岁之间,且名字包含 “John” 的用户,按年龄降序排序:
QueryWrapper<User> wrapper = new QueryWrapper<>();
wrapper.between("age", 18, 30).like("name", "John").orderByDesc("age");
List<User> users = userMapper.selectList(wrapper);
生成的 SQL:
SELECT * FROM user WHERE age BETWEEN 18 AND 30 AND name LIKE '%John%' ORDER BY age DESC
3. 动态查询
根据传入的参数动态构建条件:
public List<User> searchUsers(Integer minAge, Integer maxAge, String name) {QueryWrapper<User> wrapper = new QueryWrapper<>();if (minAge != null) {wrapper.ge("age", minAge);}if (maxAge != null) {wrapper.le("age", maxAge);}if (name != null && !name.isEmpty()) {wrapper.like("name", name);}return userMapper.selectList(wrapper);
}
这段代码使用了MyBatis Plus的QueryWrapper来构建动态查询条件。根据参数的值,会生成不同的SQL语句。
-
默认情况(所有参数都为null或空):
searchUsers(null, null, null);
生成的SQL语句将不会有任何where条件:
SELECT * FROM user
-
只有minAge不为null:
searchUsers(18, null, null);
生成的SQL语句将包含最小年龄条件:
SELECT * FROM user WHERE age >= 18
-
只有maxAge不为null:
searchUsers(null, 30, null);
生成的SQL语句将包含最大年龄条件:
SELECT * FROM user WHERE age <= 30
-
只有name不为null且不为空字符串:
searchUsers(null, null, "张三");
生成的SQL语句将包含名字模糊查询条件(使用LIKE):
SELECT * FROM user WHERE name LIKE '%张三%'
-
组合条件(minAge和maxAge都不为null):
searchUsers(18, 30, null);
生成的SQL语句将包含年龄范围条件:
SELECT * FROM user WHERE age >= 18 AND age <= 30
-
组合条件(minAge和name都不为null):
searchUsers(18, null, "张三");
生成的SQL语句将包含最小年龄和名字模糊查询条件:
SELECT * FROM user WHERE age >= 18 AND name LIKE '%张三%'
-
组合条件(maxAge和name都不为null):
searchUsers(null, 30, "张三");
生成的SQL语句将包含最大年龄和名字模糊查询条件:
SELECT * FROM user WHERE age <= 30 AND name LIKE '%张三%'
-
所有参数都不为null或空:
searchUsers(18, 30, "张三");
生成的SQL语句将包含所有条件:
SELECT * FROM user WHERE age >= 18 AND age <= 30 AND name LIKE '%张三%'
4. 使用 LambdaQueryWrapper
查询年龄等于 18 且名字包含 “John” 的用户:
LambdaQueryWrapper<User> lambdaWrapper = new LambdaQueryWrapper<>();
lambdaWrapper.eq(User::getAge, 18).like(User::getName, "John");
List<User> users = userMapper.selectList(lambdaWrapper);
六、 QueryWrapper 的注意事项
- 字段名问题:QueryWrapper 中的字段名应与数据库列名一致,而不是实体类的属性名(除非通过
@TableField
注解指定了映射)。 - NULL 值处理:使用
isNull
或isNotNull
方法来明确处理 NULL 值。 - 性能考虑:对于非常复杂的查询,QueryWrapper 可能生成较长的 SQL,建议在性能敏感场景下优化或手动编写 SQL。
- 版本兼容性:MyBatis-Plus 的不同版本可能对方法有所调整,建议参考官方文档。
七、 总结
QueryWrapper 是 MyBatis-Plus 中一个强大且灵活的工具,通过链式调用和对象化的方式,开发者可以轻松构建 SQL 查询条件。它不仅提高了开发效率,还增强了代码的可读性和安全性。无论是简单查询还是复杂动态条件,QueryWrapper 都能胜任。如果我们需要更安全的字段引用,可以选择 LambdaQueryWrapper。
相关文章:
详解 MyBatis-Plus 框架中 QueryWrapper 类
QueryWrapper 一、 QueryWrapper 的概念为什么需要 QueryWrapper? 二、 QueryWrapper 的基本使用1. 创建 QueryWrapper 实例2. 添加查询条件3. 执行查询 三、 QueryWrapper 的常见方法1. 基本条件方法1.1 eq - 等于1.2 ne - 不等于1.3 gt - 大于1.4 ge - 大于等于1.…...
小米MiMo-7B大模型:解锁推理潜力的新传奇!
在大语言模型(LLMs)蓬勃发展的时代,推理能力成为衡量模型优劣的关键指标。今天为大家解读的这篇论文,介绍了小米的MiMo-7B模型,它通过独特的预训练和后训练优化,展现出强大的推理实力,快来一探究…...
联邦学习的收敛性分析(全设备参与,不同本地训练轮次)
联邦学习的收敛性分析 在联邦学习中,我们的目标是分析全局模型的收敛性,考虑设备异构性(不同用户的本地训练轮次不同)和数据异质性(用户数据分布不均匀)。以下推导从全局模型更新开始,逐步引入假设并推导期望损失的递减关系,最终给出收敛性结论。 1. 全局模型更新与泰…...
硬件工程师面试常见问题(10)
第四十六问:锁存器,触发器,寄存器三者的区别 触发器:能够存储一位二值信号的基本单元电路统称为 "触发器"。(单位) 锁存器:一位触发器只能传送或存储一位数据,而在实际工…...
1295. 统计位数为偶数的数字
题目 解法一 遍历数组挨个判断元素位数并统计(我的第一想法) class Solution { public:int findNumbers(vector<int>& nums) {int result 0;for(int n: nums){if(judge(n)) result;}return result;}bool judge(int a){int sum 1;a a / 10…...
3.1/Q1,Charls最新文章解读
文章题目:Social participation patterns and associations with subsequent cognitive function in older adults with cognitive impairment: a latent class analysis DOI:10.3389/fmed.2025.1493359 中文标题:认知障碍老年人的社会参与模…...
楼宇智能化四章【期末复习】
四、火灾自动报警系统 结构组成:火灾探测器、区域报警器、集中报警器 形式:1. 多线制系统 2.总线制系统 3.集中智能系统 4.分布智能系统 5.网络通信系统 工作原理: 以下是关于火灾自动报警系统及相关灭火系统的详细解答: 1. 火灾自动报警系统有哪几种形式? 区…...
Splunk 使用Role 实现数据隔离
很多人知道 Splunk 有很多自带的Role, 今天我就要说说定制化的Role: 1: 在创建新role 的界面: 2: 在如下的界面,可以定制allow index name: 3: 创建好新Role 后,在SAML 添加新的group 的时候,就可以看到Role 给某个group: 4: 这样一个特定组的人来申请Splunk 权限,就可…...
Learning vtkjs之ImplicitBoolean
隐式函数布尔操作 介绍 vtkImplicitBoolean 允许对隐式函数(如平面、球体、圆柱体和盒子)进行布尔组合。操作包括并集、交集和差集。可以指定多个隐式函数(所有函数都使用相同的操作进行组合)。 支持的操作:‘UNION…...
LabelVision - yolo可视化标注工具
LabelVision是一款可视化图像标注工具,主要用于计算机视觉研究中的各种标注任务。 支持多边形、矩形、圆形等多种标注方式,并且可以输出JSON、COCO等多种数据格式,方便与其他软件和框架进行集成和互操作。 通过它可以很轻易的对图像进行标注,适合Y…...
系统分析师-第十五章
学习目标 通过参加考试,训练学习能力,而非单纯以拿证为目的。 1.在复习过程中,训练快速阅读能力、掌握三遍读书法、运用番茄工作法。 2.从底层逻辑角度理解知识点,避免死记硬背。 3.通过考试验证学习效果。 学习阶段 快速阅读 …...
大连理工大学选修课——机器学习笔记(3):KNN原理及应用
KNN原理及应用 机器学习方法的分类 基于概率统计的方法 K-近邻(KNN)贝叶斯模型最小均值距离最大熵模型条件随机场(CRF)隐马尔可夫模型(HMM) 基于判别式的方法 决策树(DT)感知机…...
09 Python字典揭秘:数据的高效存储
文章目录 一.字典是什么1.字典的特点 二.字典的创建和使用三.字典的操作1.访问元素2.修改元素3.删除元素4.遍历字典5.成员运算 四.字典方法1.获取字典中的指定元素2.获取字典中的元素3.字典合并4.删除元素 一.字典是什么 在 Python 中,字典(dict&#x…...
20250430在ubuntu14.04.6系统上完成编译NanoPi NEO开发板的FriendlyCore系统【严重不推荐,属于没苦硬吃】
【开始编译SDK之前需要更新源】 rootrootubuntu:~/friendlywrt-h3$ sudo apt update 【这两个目录你在ubuntu14.04.6系统上貌似git clone异常了】 Y:\friendlywrt-h3\out\wireguard Y:\friendlywrt-h3\kernel\exfat-nofuse 【需要单线程编译文件系统,原因不明】 Y:…...
第五部分:进阶项目实战
在前面的学习中,我们已经掌握了图像和视频的基础操作、增强滤波、特征提取以及一些基础的目标检测方法。现在,我们将综合运用这些知识来构建一些更复杂、更实用的应用项目。 这一部分的项目将结合前面学到的技术,并介绍一些新的概念和工具&a…...
【Linux】记录一个有用PS1
PS1 是用来定义shell提示符的环境变量 下面是一个带有颜色和丰富信息的 Linux PS1 配置示例,包含用户名、主机名、路径、时间、Git 分支和退出状态提示: # 添加到 ~/.bashrc 文件末尾 PS1\[\e[1;32m\]\u\[\e[m\] # 绿色粗体用户名 PS…...
【SpringBoot】基于mybatisPlus的博客管理系统(2)
目录 1.实现用户登录 Jwt令牌 1.引入依赖 2.生成令牌(token) Controller Service Mapper 2.实现强制登录 定义拦截器: 配置拦截器: 1.实现用户登录 在之前的项目登录中,我使用的是Session传递用户信息实现校验…...
免费在Colab运行Qwen3-0.6B——轻量高性能实战
Qwen一直在默默地接连推出新模型。 每个模型都配备了如此强大的功能和高度量化的规模,让人无法忽视。 继今年的QvQ、Qwen2.5-VL和Qwen2.5-Omni之后,Qwen团队现在发布了他们最新的模型系列——Qwen3。 这次他们不是发布一个而是发布了八个不同的模型——参数范围从6亿到235…...
精益数据分析(35/26):SaaS商业模式关键指标解析
精益数据分析(35/26):SaaS商业模式关键指标解析 在创业与数据分析的征程中,我们持续探索不同商业模式的运营奥秘。今天,我们带着共同进步的期望,深入研读《精益数据分析》,聚焦SaaS商业模式&am…...
【论文速读】《Scaling Scaling Laws with Board Games》
论文链接:https://arxiv.org/pdf/2104.03113 《Scaling Scaling Laws with Board Games》:探索棋盘游戏中的扩展规律 摘要 如今,机器学习领域中规模最大的实验所需的资源,超出了仅有几家机构的预算。幸运的是,最近的…...
C++ 与多技术融合的深度实践:从 AI 到硬件的全栈协同
在数字化技术高速发展的今天,C 凭借其卓越的性能优势和底层控制能力,成为连接上层应用与底层硬件的核心纽带。这种独特定位使其在与 AI 深度学习、Python 生态及硬件加速技术的融合中展现出不可替代的价值,构建起从算法实现到硬件优化的全栈技…...
AdaBoost算法的原理及Python实现
一、概述 AdaBoost(Adaptive Boosting,自适应提升)是一种迭代式的集成学习算法,通过不断调整样本权重,提升弱学习器性能,最终集成为一个强学习器。它继承了 Boosting 的基本思想和关键机制,但在…...
无刷马达驱动芯片算法逐步革新着风扇灯行业--其利天下
风扇灯市场热度持续攀升,根据行业数据,风扇灯市场规模从2010年的100亿元增长至2019年的200亿元,年均复合增长率超10%,预计2025年将达30%,借此其利天下有限公司进一步提升了无刷风扇灯驱动方案。 一、性能参数 电压&a…...
数据库系统综合应用与深度实践指南
前言 在当今数据驱动的时代,数据库技术已成为信息系统的核心支柱。从简单的数据存储到复杂的企业级应用,数据库系统支撑着现代社会的方方面面。本文作为一篇综合性的数据库科普文章,旨在为读者提供从基础到进阶的完整知识体系,涵…...
「Unity3D」TextMeshPro使用TMP_InputField实现,输入框高度自动扩展与收缩
先看实现效果: 要实现这个效果,有三个方面的问题需要解决: 第一,输入框的高度扩展,内部子元素会随着锚点,拉伸变形——要解决这个问题,需要将内部元素改变父类,然后增加父类高度&am…...
SAP-ABAP:在SAP系统中,COEP表(成本控制对象行项目表)详解
在SAP系统中,**COEP表(成本控制对象行项目表)**是成本控制(CO)模块的核心数据表之一,主要用于存储与成本核算相关的详细行项目数据。以下是对其作用的详细解析: 一、 COEP表的核心作用 存储成本…...
crashpad 编译
一环境配置 1.1设置系统UTF8编码 1.2vs2017语言环境设置英文包 二.获取depot_tools(此步骤可以跳过 最新工具包已上传下载使用即可) windows下载压缩包,然后放到系统PATH中 下载完以后,基本就是靠depot_tools这个工具集合了&am…...
Windows系统安装Docker(Win10系统升级,然后安装)
有时需要在自己笔记本跑下代码,所以安装Dockers,步骤如下: 1. 升级系统(Windows10专业版或者Windows11) Windows10家庭版装Docker较麻烦,所以我将Win10升级为Win11了(免费)&#x…...
【Fifty Project - D21】
今日完成记录 TimePlan完成情况9:00 - 10:00爬楼梯√12:00 - 14:00Leetcode√14:00 - 15:00《挪威的森林》√ Leetcode 每日一题 今天的每日一题是个easy:给定一个数组,要求统计…...
中央网信办部署开展“清朗·整治AI技术滥用”专项行动
为规范AI服务和应用,促进行业健康有序发展,保障公民合法权益,近日,中央网信办印发通知,在全国范围内部署开展为期3个月的“清朗整治AI技术滥用”专项行动。 中央网信办有关负责人表示,本次专项行动分两个阶…...
《Python实战进阶》 No46:CPython的GIL与多线程优化
Python实战进阶 No46:CPython的GIL与多线程优化 摘要 全局解释器锁(GIL)是CPython的核心机制,它保证了线程安全却限制了多核性能。本节通过concurrent.futures、C扩展优化和多进程架构,实战演示如何突破GIL限制&#…...
BOTA新六维力传感器PixONE:用12维度力矩与运动感测,驱动人形机器人力控未来
在机器人技术日益发展的今天,六维力传感器对于提升机器人感知环境、增强操作精度发挥着重要作用。瑞士BOTA Systems是一家专注于机器人传感器技术的公司,致力于为原始设备制造商提供高性能的传感器解决方案。 PixONE是BOTA推出的一款创新的高精度传感器&…...
《PyTorch documentation》(PyTorch 文档)
PyTorch documentation(PyTorch 文档) PyTorch is an optimized tensor library for deep learning using GPUs and CPUs. (PyTorch是一个优化的张量库,用于使用GPU和CPU进行深度学习。) Features described in this documentation are classified by release status: (此…...
数据库的死锁相关(一)
目录 前言 一、什么死锁 二、产生死锁的必要条件 三、死锁发生的具体位置和场景 1. 数据行级别死锁(最常见) 2. 表级别死锁 3. 索引间隙锁死锁(InnoDB特有) 4. 外键约束死锁 5. 元数据锁死锁 6. 内存中的锁结构死锁 7.…...
数据编码(Encoding)
对数据做编码可以减少存储和 I/O开销,常见的技术比如 Dictionary Encoding,Run-Length Encoding,Bitpacking,Delta Encoding,Frame-of-Reference等。 本篇文章对这些编码方案进行介绍,举例说明,最后总结各种encoding的适用场景。 一、Dictionary Encoding(字典编码)…...
Wartales 战争传说 [DLC 解锁] [Steam] [Windows SteamOS]
Wartales 战争传说 [DLC 解锁] [Steam] [Windows & SteamOS] DLC 版本 至最新全部 DLC 后续可能无法及时更新文章,具体最新版本见下载文件说明 DLC 解锁列表(仅供参考) 《战争传说》 - Pirates of Belerion 《战争传说》 - The Tavern …...
决策树在电信客户流失分析中的实战应用
在当今数据驱动的时代,数据分析和机器学习技术在各行业的应用愈发广泛。电信行业面临着激烈的竞争,客户流失问题成为影响企业发展的关键因素之一。如何准确预测客户是否会流失,并采取相应措施挽留客户,是电信企业关注的重点。决策…...
滚珠丝杆怎么选型?
滚珠丝杆的选型需要考虑多个因素,包括应用需求、性能参数、环境因素等,以确保选型的准确性和合理性。 1、负载:确定设备运行时滚珠丝杆需要承受的静载荷和动载荷,包括轴向载荷和径向载荷,根据实际工作情况计算出最大负…...
HTN77A0原理图提供聚能芯半导体禾润一级代理技术支持免费送样
在电源管理需求日益严苛的当下,禾润 HTN77A0 以卓越性能脱颖而出。它不仅适配多种应用场景,还兼具高效节能与稳定输出,为设备供能带来革新体验。 禾润 HTN77A0 同步降压变换器,凭借5V~130V 超宽输入电压范围,打破传统供…...
linux中sigint和sigterm的区别
SIGINT 和 SIGTERM 是在 Unix 及类 Unix 系统(包括 Linux)中用于进程间通信的信号,它们都可以用于请求进程终止,区别如下: 1、信号编号与定义 在信号机制里,每个信号都有对应的编号,这便于系统…...
errorno 和WSAGetlasterror的区别
errno 和 WSAGetLastError 是用于获取错误代码的机制,但它们应用于不同的编程场景,下面为你详细介绍二者的区别: 应用场景 errno:它是 C 和 C 等编程语言里用于表示系统调用和库函数错误的全局变量。在 Unix、Linux 等类 Unix 系…...
《操作系统真象还原》第十一章——用户进程
文章目录 前言为什么要有TSSTSS简介TSS描述符和TSS结构现代操作系统采用的任务切换方式 定义并初始化TSS修改global.h编写tss.c测试 实现用户进程实现用户进程的原理维护虚拟地址空间,修改thread.h为进程创建页表和3特权级栈,修改memory.c进入特权级3用户…...
第 11 届蓝桥杯 C++ 青少组中 / 高级组省赛 2020 年真题答和案解析
一、选择题 第 1 题 单选题 题目:表达式 ‘6’ - ‘1’ 的值是 ( ) A. 整数 5 B. 字符 5 C. 表达式不合法 D. 字符 6 答案:A 解析:在 C++ 中,字符常量以 ASCII 码形式存储。6 的 ASCII 码为 54,1 的 ASCII 码为 49,二者相减结果为 5,是整数类型,因此选 A。 第 2 题 …...
ES搜索知识
GET /categories/1/10?name手机 // 按名称过滤 GET /categories/1/10?type电子产品 // 按类型过滤 GET /categories/1/10?name手机&type电子产品 // 组合过滤 查询参数 ApiOperation(value "获取商品分类分页列表")GetMapping("{page}/{limit}")…...
Java高阶程序员学习计划(详细到天,需有一定Java基础)
🤟致敬读者 🟩感谢阅读🟦笑口常开🟪生日快乐⬛早点睡觉📘博主相关 🟧博主信息🟨博客首页🟫专栏推荐🟥活动信息文章目录 Java高阶程序员学习计划(详细到天,需有一定Java基础)第一阶段(30天)Java基础:Java生态工具链:设计模式与编码规范:第二阶段(15天…...
SALOME源码分析: SMESH模块
本文分析SALOME GEOM模块。 注1:限于研究水平,分析难免不当,欢迎批评指正。 注2:文章内容会不定期更新。 一、核心组件 1.1 SMESHGUI 二、关键流程 网络资料 SALOME: Introduction to MESH Modulehttps://docs.salome-platform…...
提高程序灵活性和效率的利器:Natasha动态编译库【.Net】
从零学习构建一个完整的系统 今天推荐一个针对C#动态编译库,动态编译的使用场景有很多: 1、动态代码生成:可以根据用户的输入或者系统配置动态执行C#代码,比如很多Web在线编译器,就是这个原理; 2、代码反…...
Cangjie Magic在医疗领域的应用:智能体技术如何重塑医疗数字化
文章目录 1. Cangjie Magic是什么?有什么优势?2. Cangjie Magic与Python的区别与优势对比技术特性对比医疗场景案例对比案例1:电子病历自然语言处理案例2:ICU实时监护系统 3. Cangjie Magic的学习成本与性价比学习门槛性价比优势 …...
MySQL基础关键_002_DQL(一)
目 录 一、初始化 二、简单查询 1.部分语法规则 2.查询一个字段 (1)查询员工编号 (2)查询员工姓名 3.查询多个字段 (1)查询员工编号、姓名 (2)查询部门编号、名称、位置 …...
从高端制造到民生场景:天元轻量化软件的“破局”之路
近期,清华大学航空发动机研究院(以下简称“清华航发院”)正式引入天元轻量化软件,用于其相关设计与3D可视化研究工作。 作为国内领先的3D轻量化解决方案提供商,天元轻量化软件一直致力于为各行业提供高效、灵活、安全…...