04条件构造器和常用接口
条件构造器和常用接口
wapper介绍
条件构造器的两个条件之间默认就是AND并列关系,如果需要或者的关系则需要调用构造器的or()方法
条件构造器类型 | 作用 |
---|---|
Wrapper | 条件构造抽象类,最顶端父类 |
AbstractWrapper | 生成SQL的where条件 |
QueryWrapper | 封装查询或删除的条件 |
UpdateWrapper | 封装修改的条件和要修改的字段的值 |
AbstractLambdaWrapper | 使用Lambda语法,生成SQL的where条件 |
LambdaQueryWrapper | 使用Lambda语法封装查询或删除的条件 |
LambdaUpdateWrapper | 使用Lambda语法封装修改的条件和要修改的字段 |
支持传入条件构造器的CRUD方法
int delete(@Param(Constants.WRAPPER) Wrapper<T> wrapper);
// 如果设置了修改的字段,实体类可以为null
int update(@Param(Constants.ENTITY) T entity, @Param(Constants.WRAPPER) Wrapper<T> updateWrapper);
T selectOne(@Param(Constants.WRAPPER) Wrapper<T> queryWrapper);
List<T> selectList(@Param(Constants.WRAPPER) Wrapper<T> queryWrapper);
// 根据Wrapper条件查询全部记录
List<Map<String, Object>> selectMaps(@Param(Constants.WRAPPER) Wrapper<T> queryWrapper);
// 根据Wrapper条件查询全部记录(返回第一个字段的值)
List<Object> selectObjs(@Param(Constants.WRAPPER) Wrapper<T> queryWrapper);
// 分页查询
IPage<T> selectPage(IPage<T> page, @Param(Constants.WRAPPER) Wrapper<T> queryWrapper);
// 根据Wrapper条件,查询全部记录并翻页
IPage<Map<String, Object>> selectMapsPage(IPage<T> page, @Param(Constants.WRAPPER) Wrapper<T> queryWrapper);
// 根据Wrapper条件,查询总记录数
Integer selectCount(@Param(Constants.WRAPPER) Wrapper<T> queryWrapper);
QueryWrapper
由于这些方法的返回值最后都是QueryWrapper对象所以都支持链式结构的调用
方法名 | 功能 |
---|---|
QueryWrapper between(数据库表中字段,最小值,最大值) | 查询指定范围的区间包括边界值 |
QueryWrapper gt/ge(数据库表中字段,值) | gt表示查询大于区间,ge表示查询大于等于区间(e表示equal的意思) |
QueryWrapper lt/le(数据库表中字段,值) | lt表示查询小于区间,le表示查询小于等于区间 |
QueryWrapper eq/ne(数据库表中字段,值) | eq表示查询字段等于某个值的记录,ne表示查询字段不等于某个值的记录 |
QueryWrapper in() | 包含哪几个值 |
QueryWrapper orderByDesc(数据库表中字段) | 对查询到的结果按照字段降序排序 |
QueryWrapper orderByAsc(数据库表中字段) | 对查询到的结果按照字段升序排序 |
方法名 | 功能 |
---|---|
QueryWrapper like(数据库表中字段,值) | 模糊查询 |
QueryWrapper isNotNull/isNull(数据库表中字段) | 判断某个字段值为不为空 |
QueryWrapper and(Consumer< Param>,consumer) | 相当于在待执行的SQL语句前加了一个括号,Param参数是wrapper的子类即条件构造器 |
QueryWrapper or() | 使用or关键字连接条件,默认调用方法是使用and关键字连接条件但不加括号 |
QueryWrapper select(数据库字段…) | 指定要查询的字段,selectList方法默认是查询所有的字段 |
QueryWrapper inSql(数据库字段,查询语句) | 以某次查询结果为基础再次查询 |
使用QueryWrapper条件构造器封装查询的条件实现查询和排序功能
@Data
public class User {private Long id;@TableFiled("user_name")private String name;private Integer age;private String email;@TableLogicprivate Integer isDeleted;
}
@springBootTest
public class MybatisPlusWrapperTest{@Autowiredprivate UserMapper userMapper;//查询用户名包含a,年龄在20到30之间,并且邮箱不为null的用户信息/*SELECT id,user_name AS name,age,email,is_deleted FROM t_user WHERE is_deleted=0 AND (user_name LIKE ? AND age BETWEEN ? AND ? AND email IS NOT NULL)*/@Testpublic void test01(){QueryWrapper<User> queryWrapper = new QueryWrapper<>();//链式结构的调用,这些方法的返回值最后都是queryWrapper对象queryWrapper.like("user_name", "a").between("age", 20, 30).isNotNull("email");//将查询的结果集映射到实体类的属性最后一起放入List集合当中(一条记录对应一个User对象)List<User> list = userMapper.selectList(queryWrapper);list.forEach(System.out::println);}//按年龄降序查询用户,如果年龄相同则按id升序排列/*SELECT id,user_name AS name,age,email,is_deleted FROM t_user WHERE is_deleted=0 ORDER BY age DESC,id ASC*/@Testpublic void test02(){QueryWrapper<User> queryWrapper = new QueryWrapper<>();queryWrapper.orderByDesc("age").orderByAsc("id");List<User> users = userMapper.selectList(queryWrapper);users.forEach(System.out::println);}
}
// 查询用户名包含a,年龄在20到30之间,并且邮箱不为null的用户信息
User(id=4,name=Sandy,age=21,email=test4@baomidou.com,isDeleted=0)//按年龄降序查询用户,如果年龄相同则按id升序排列
User(id=5,name=Billie, age=24, email=test5@baomidou.com, isDeleted=0)
User(id=6,name=张三,age=23,email=zhangsan@atguigu.com,isDeleted=0)
User(id=100,name=张三,age=23,Iemail=zhangsan@atguigu.com,isDeleted=0)
User(id=101,name=张三,age=23,email=zhangsan@atguigu.com,isDeleted=0)
User(id=102,name=张三,age=23,email=zhangsan@atguigu.com,isDeleted=0)
User(id=103,name=张三,age=23,email=zhangsan@atguigu.com,isDeleted=0
User(id=104,name=张三,age=23,email=zhangsan@atguigu.com,isDeleted=0)
User(id=4,name=Sandy,age=21,email=test4@baomidou.com,isDeleted=0)
使用QueryWrapper条件构造器封装删除的条件实现删除功能(逻辑删除)
//删除email为空的用户
/*
UPDATEt_user
SET is_deleted=1
WHERE is_deleted=0 AND (email IS NULL)
*/
@Test
public void test03(){QueryWrapper<User> queryWrapper = new QueryWrapper<>();queryWrapper.isNull("email");int result = userMapper.delete(queryWrapper);System.out.println("受影响的行数:" + resu lt);
}
使用QueryWrapper条件构造器指定修改的条件配合实体类指定修改的字段实现修改功能
//将(年龄大于20并且用户名中包含有a)或邮箱为null的用户信息修改
/*
UPDATE t_user
SET age=?, email=?
WHERE is_deleted = 0 AND (user_name LIKE ? AND age > ? OR email IS NULL)
*/
@Test
public void test04() {QueryWrapper<User> queryWrapper = new QueryWrapper<>();queryWrapper.like("user_name", "a").gt("age", 20).or().isNull("email");// 使用实体类指定要修改的字段User user = new User();user.setAge(18);user.setEmail("user@atguigu.com");int result = userMapper.update(user, queryWrapper);System.out.println("受影响的行数:" + result);
}
使用QueryWrapper条件构造器查询数据表中特定的字段(selectList方法默认查询所有字段)
//查询用户信息的user_name和age字段
/*
SELECT user_name,age,email
FROM t_user
WHERE is_deleted=0
*/
@Test
public void test05() {QueryWrapper<User> queryWrapper = new QueryWrapper<>();queryWrapper.select("user_name", "age","email");//selectMaps()方法将查询的结果集以key(字段名)=value(字段值)的形式存到Map集合当中最后一起放入List集合(一条记录对应一个Map集合)List<Map<String, Object>> maps = userMapper.selectMaps(queryWrapper);maps.forEach(System.out::println);
}
//查询用户信息的user_name和age字段,并将一条记录封装到一个Map集合中
{user_name=小明,age=21,email=test@atguigu.com}
{user_nameBillie,age=24, email=test5@baomidou.com}
{user_name=张三,age=23,email=zhangsan@atguigu.com}
{user_name=张三,age=23,email=zhangsan@atguigu.com}
{user_name=张三,age=23,email=zhangsan@atguigu.com}
{user_name=张三,age=23,email=zhangsan@atguigu.com}
{user_name=张三,age=23,email=zhangsan@atguigu.com}
{user_name=张三,age=23,email=zhangsan@atguigu.com}
{user_name=小红,email=test@atguigu.com}
使用QueryWrapper条件构造器组装子查询(以某次查询结果为基础上再次查询)
// 查询id小于等于3的用户信息
/*
SELECT id,user_name,age,email,is_deleted
FROM t_user
WHERE is_deleted=0 AND (id IN(select id from t_user where id <= 3))
*/
@Test
public void test06() {QueryWrapper<User> queryWrapper = new QueryWrapper<>();//第一个参数是子查询要比较的字段,第二个参数是SQL查询语句,就是将要比较字段在查询的结果上再一次筛选queryWrapper.inSql("id", "select id from t_user where id <= 3");List<User> list = userMapper.selectList(queryWrapper);list.forEach(System.out::println);
}
条件构造器优先级
条件构造器中封装的条件默认按照从左到右的顺序执行,调用构造器的and(Consumer<QueryWrapper<实体类>> consumer)
方法可以加小括号设置优先级
- 在and方法内使用lambda表达式中可以保证条件优先执行,方法的参数我们就是要操作的条件构造器
// 将用户名中包含有a并且(年龄大于20或邮箱为null)的用户信息修改
/*
UPDATE t_user
SET age=?, email=?
WHERE is_deleted=0 AND (user_name LIKE ? AND (age > ? OR email IS NULL))
*/
@Test
public void test04() {QueryWrapper<User> queryWrapper = new QueryWrapper<>();//queryWrapper.like("user_name", "a").and((QueryWrapper i){return i.gt("age", 20).or().isNull("email")});queryWrapper.like("user_name", "a").and(i -> i.gt("age", 20).or().isNull("email"));//设置实体类中要修改的字段,没设置的字段不会被修改User user = new User();user.setAge(20);user.setEmail("user@atguigu.com");int result = userMapper.update(user, queryWrapper);System.out.println("受影响的行数:" + result);
}
UpdateWrapper
方法名 | 功能 |
---|---|
UpdateWrapper set(数据库字段,值) | 设置要修改的字段及其值 |
使用UpdateWrapper不仅可以设置修改的条件还可以设置要修改的字段即不用再像QurreyWrapper一样创建实体类对象
//将用户名中包含有a并且(年龄大于20或邮箱为null)的用户信息修改
/*
UPDATE t_user
SET age=?,email=?
WHERE is_deleted=0 AND (user_name LIKE ? AND(age > ? OR email IS NULL))
*/
@Test
public void test07() {UpdateWrapper<User> updateWrapper = new UpdateWrapper<>();//设置修改的字段及其对应的值updateWrapper.set("age", 18).set("email", "user@atguigu.com");//设置修改的条件,lambda表达式内的逻辑优先运算updateWrapper.like("user_name", "a").and(i -> i.gt("age", 20).or().isNull("email"));//设置修改的条件和字段简写/*updateWrapper.set("age", 18).set("email", "user@atguigu.com").like("user_name", "a").and(i -> i.gt("age", 20).or().isNull("email"));*///由于之前设置了修改的字段,所以此时不再需要传递实体类参数直接传递null即可int result = userMapper.update(null, updateWrapper);System.out.println(result);
}
condition组装条件(动态SQL)
在开发的过程中一些SQL条件来源于用户的选择,因此最终在执行SQL语句时必须先判断用户是否选择了某些条件,若选择了则拼接该SQL条件若没有选择则不拼接
方法名 | 功能 |
---|---|
boolean isNotBlank(Sting string) | 判断某字符串是否不为空字符串"" ,不为null ,不为空白符 ,总之如果字符串没有数据就返回false |
QueryWrapper like(condition判断条件,数据库表中字段,值) | 如果判断条件返回为true,则组装后面的条件进行模糊查询 |
传统方式: 使用if语句做判断拼装查询的条件
// 根据年龄和username查询用户信息,其中username为null
/*
SELECT id,user_name AS name,age,email,is_deleted
FROM t_user
WHERE is_deleted=0 AND (age >=? AND age <= ?)
*/
@Test
public void test08() {// 查询条件有可能为null(用户未输入或未选择)String username = null;Integer ageBegin = 10;Integer ageEnd = 24;QueryWrapper<User> queryWrapper = new QueryWrapper<>();//StringUtils是由Mybatis-pius提供判断字符串是由有无数据的工具类if(StringUtils.isNotBlank(username)){queryWrapper.like("user_name",username);}if(ageBegin != null){queryWrapper.ge("age", ageBegin);}if(ageEnd != null){queryWrapper.le("age", ageEnd);}//由于username为null所以只有年龄作为条件List<User> users = userMapper.selectList(queryWrapper);users.forEach(System.out::println);
}
调用条件构造器的条件方法时直接额外传递一个condition判断条件参数即一个bollean类型的值,如果条件为true表示组装后面的条件fasle则不组装
/*
SELECT id,user_name AS name,age,email,is_deleted
FROM t_user
WHERE is_deleted=0 AND (user_name like ? AND age <= ?)
*/
@Test
public void test08UseCondition() {//查询条件有可能为null(用户未输入或未选择)String username = "a";Integer ageBegin = null;Integer ageEnd = 24;QueryWrapper<User> queryWrapper = new QueryWrapper<>();//方法的参数传入condition判断条件queryWrapper.like(StringUtils.isNotBlank(username), "user_name", username).ge(ageBegin != null, "age", ageBegin) .le(ageEnd != null, "age", ageEnd);List<User> users = userMapper.selectList(queryWrapper);users.forEach(System.out::println);
}
LambdaQuery/UpdateWrapper
当使用字符串指定一个字段时容易写错导致运行时出现错误
LambdaQuery/UpdateWrapper的条件方法中另外提供了一个函数式接口Function(实体类,?)
,我们可以直接访问实体类的某个属性从而获取对应字段作为条件
- 使用LambdaQuery/UpdateWrapper的条件构造器必须使用函数式接口指定字段名
类::实例方法
: 抽象方法a在被重写时使用了某一个对象的方法b,如果方法a和b的返回值类型相同但方法b的形参少一个,则可以使用方法b实现对方法a的重写替换
- Function中的R apply(T t)方法和User中的R getXxx()方法
方法名 | 功能 |
---|---|
QueryWrapper like(condition判断条件,Function(实体类,?),值) | 通过访问实体类的属性获取属性对应的字段做模糊查询 |
使用LambdaQueryWrapper
// 查询用户名包含有a,年龄在10-24之间的用户
/*
SELECT id,user_name AS name,age,email,is_deleted
FROM t_user
WHERE (user_name LIKE ? age >=? AND age <= ?)
*/
@Test
public void test09() {String username = "a";Integer ageBegin = 10;Integer ageEnd = 24;LambdaQueryWrapper<User> queryWrapper = new LambdaQueryWrapper<>();queryWrapper.like(StringUtils.isNotBlank(username), User::getName, username).ge(ageBegin != null, User::getAge, ageBegin).le(ageEnd != null, User::getAge, ageEnd);List<User> users = userMapper.selectList(queryWrapper);users.forEach(System.out::println);
}
使用LambdaUpdateWrapper
//将用户名中包含有a并且(年龄大于20或邮箱为null)的用户信息修改
/*
UPDATE t_user
SET age=?,email=?
WHERE is_deleted=0 AND (user_name LIKE ? AND(age > ? OR email IS NULL))
*/
@Test
public void test10() {LambdaUpdateWrapper<User> updateWrapper = new LambdaUpdateWrapper<>();//设置修改的条件和字段updateWrapper.set(User::getAge, 18).set(User::getEmail, "user@atguigu.com").like(User::getName, "a").and(i -> i.lt(User::getAge, 24).or().isNull(User::getEmail)); int result = userMapper.update(null, updateWrapper);System.out.println("受影响的行数:" + result);
}
相关文章:

04条件构造器和常用接口
条件构造器和常用接口 wapper介绍 条件构造器的两个条件之间默认就是AND并列关系,如果需要或者的关系则需要调用构造器的or()方法 条件构造器类型作用Wrapper条件构造抽象类,最顶端父类AbstractWrapper生成SQL的where条件QueryWrapper封装查询或删除的条件UpdateWrapper封装修…...

什么是HTTP状态码?常见的HTTP状态码有哪些?
聚沙成塔每天进步一点点 ⭐ 专栏简介⭐ 什么是HTTP状态码?⭐ 1xx - 信息性状态码⭐ 2xx - 成功状态码⭐ 3xx - 重定向状态码⭐ 4xx - 客户端错误状态码⭐ 5xx - 服务器错误状态码⭐ 写在最后 ⭐ 专栏简介 前端入门之旅:探索Web开发的奇妙世界 欢迎来到前…...
vue3的双向绑定原理分析
谈到vue3的双向绑定原理,就得先知道,为什么vue2的双向绑定方式会被废弃? vue2的双向绑定 Object.defineProperty Object.defineProperty() 方法会直接在一个对象上定义一个新属性,或者修改一个对象的现有属性,并返回…...

MySQL数据库时间计算的用法
今天给大家分享如何通过MySQL内置函数实现时间的转换和计算,在工作当中,测试人员经常需要查询数据库表的日期时间,但发现开发人员存入数据库表的形式都是时间戳形式,不利于测试人员查看,测试人员只能利用工具对时间戳进…...

应用在儿童平板防蓝光中的LED防蓝光灯珠
现在电子产品多,手机、平板电脑、电子书等等,由于蓝光有害眼睛健康,于是市场上有很多防蓝光的眼镜、防蓝光的手机膜、防蓝光的平板,这些材料和设备到底有没有用?如何正确预防蓝光危害呢? 我们现在所用的灯…...

BERT 快速理解——思路简单描述
定义: BERT(Bidirectional Encoder Representations from Transformers)是一种预训练的语言模型,它基于Transformer架构,通过在大规模的未标记文本上进行训练来学习通用的语言表示。 输入 在BERT中,输入…...
二叉树实现的相关函数
1.二叉树的创建 BTNode* BinaryTreeCreate(BTDataType* a, int n, int* pi) { if (n0||a[*pi] #){ (*pi);return NULL;}BTNode* root (BTNode*)malloc(sizeof(BTNode));root->_data a[(*pi)];root->_left BinaryTreeCreate(a, --n, pi);root->_right Binary…...
Redis面试题(二)
文章目录 前言一、Redis 支持的 Java 客户端都有哪些?官方推荐用哪个?二、Redis 和 Redisson 有什么关系?三、Jedis 与 Redisson 对比有什么优缺点?四、说说 Redis 哈希槽的概念?五、Redis 集群的主从复制模型是怎样的…...

STP介绍
目录 STP概述 二层环路带来的问题 1.广播风暴 2.MAC地址漂移问题 3.多帧复制---这个好理解,同一个数据帧被重复收到多次,被称为多帧复制。 802.1D生成树 STP的BPDU BPDU主要分为两大类 配置BPDU RPC COST 配置BPDU的工作过程 TCN BPDU TCN…...

numpy 和 tensorflow 中的各种乘法(点乘和矩阵乘)
嗨喽,大家好呀~这里是爱看美女的茜茜呐 👇 👇 👇 更多精彩机密、教程,尽在下方,赶紧点击了解吧~ python源码、视频教程、插件安装教程、资料我都准备好了,直接在文末名片自取就可 点乘和矩阵乘…...

(图论) 1020. 飞地的数量 ——【Leetcode每日一题】
❓ 1020. 飞地的数量 难度:中等 给你一个大小为 m x n 的二进制矩阵 grid ,其中 0 表示一个 海洋单元格、1 表示一个 陆地单元格。 一次 移动 是指从一个陆地单元格走到另一个相邻(上、下、左、右)的陆地单元格或跨过 grid 的边…...
c++ 重载、重写、覆盖
重载:指在同一作用域内,有多个同名但参数不同的函数的现象,叫重载;可以是任何用户定义的函数,例如 类成员函数、类静态函数、普通函数重写:子类重写父类的同名函数,只要子类出现有父类的同名函数…...

Python异步编程高并发执行爬虫采集,用回调函数解析响应
一、问题:当发送API请求,读写数据库任务较重时,程序运行效率急剧下降。 异步技术是Python编程中对提升性能非常重要的一项技术。在实际应用,经常面临对外发送网络请求,调用外部接口,或者不断更新数据库或文…...
SpriteKit与Swift配合:打造您的第一个简易RPG游戏的步骤指南
1. 简介: RPG(Role-Playing Game)游戏是一种角色扮演游戏,它允许玩家在一个虚拟的游戏世界中扮演一个或多个角色。在本教程中,我们将使用Apple的2D游戏框架SpriteKit和Swift编程语言来创建一个简单的RPG游戏。我们将从…...

服务网格的面临挑战:探讨服务网格实施中可能遇到的问题和解决方案
🌷🍁 博主猫头虎 带您 Go to New World.✨🍁 🦄 博客首页——猫头虎的博客🎐 🐳《面试题大全专栏》 文章图文并茂🦕生动形象🦖简单易学!欢迎大家来踩踩~🌺 &a…...
leetcode61 旋转链表
题目 给你一个链表的头节点 head ,旋转链表,将链表每个节点向右移动 k 个位置。 示例 输入:head [1,2,3,4,5], k 2 输出:[4,5,1,2,3] 解析 这道题属实不好想:需要计算出链表的长度,然后在k > n的…...

【学习笔记】各类基于决策单调性的dp优化
文章目录 对于决策单调性的一般解释关于决策单调性的证明四边形不等式一维dp区间dp一种二维dp一些满足四边形不等式的函数类 与图形相结合 决策单调性的常见优化手段二分队列二分栈分治类莫队做法 SMAWKWQS二分WQS多解情况满足四边形不等式的序列划分问题的答案凸性以及WQS二分…...

【C++】构造函数初始化列表 ⑤ ( 匿名对象 生命周期 | 构造函数 中 不能调用 构造函数 )
文章目录 一、匿名对象 生命周期1、匿名对象 生命周期 说明2、代码示例 - 匿名对象 生命周期 二、构造函数 中调用 构造函数1、构造函数 中 不能调用 构造函数2、代码示例 - 构造函数中调用构造函数 构造函数初始化列表 总结 : 初始化列表 可以 为 类的 成员变量 提供初始值 ;…...
Knife4j系列--使用方法
原文网址:Knife4j系列--使用/教程/实例/配置_IT利刃出鞘的博客-CSDN博客...

pmp项目管理考试是什么?适合哪些人学?
PMP,简单点说,就是美国PMI为考察项目管理人士的专业能力而设立的考试。 该流程以知识和任务驱动型指南评估从业者的能力,同时确定项目经理能力行业标准,包括各项知识、任务和技能的特点、重要性与运用频率。(考纲原文…...
RestClient
什么是RestClient RestClient 是 Elasticsearch 官方提供的 Java 低级 REST 客户端,它允许HTTP与Elasticsearch 集群通信,而无需处理 JSON 序列化/反序列化等底层细节。它是 Elasticsearch Java API 客户端的基础。 RestClient 主要特点 轻量级ÿ…...

装饰模式(Decorator Pattern)重构java邮件发奖系统实战
前言 现在我们有个如下的需求,设计一个邮件发奖的小系统, 需求 1.数据验证 → 2. 敏感信息加密 → 3. 日志记录 → 4. 实际发送邮件 装饰器模式(Decorator Pattern)允许向一个现有的对象添加新的功能,同时又不改变其…...

Docker 运行 Kafka 带 SASL 认证教程
Docker 运行 Kafka 带 SASL 认证教程 Docker 运行 Kafka 带 SASL 认证教程一、说明二、环境准备三、编写 Docker Compose 和 jaas文件docker-compose.yml代码说明:server_jaas.conf 四、启动服务五、验证服务六、连接kafka服务七、总结 Docker 运行 Kafka 带 SASL 认…...
FastAPI 教程:从入门到实践
FastAPI 是一个现代、快速(高性能)的 Web 框架,用于构建 API,支持 Python 3.6。它基于标准 Python 类型提示,易于学习且功能强大。以下是一个完整的 FastAPI 入门教程,涵盖从环境搭建到创建并运行一个简单的…...

ETLCloud可能遇到的问题有哪些?常见坑位解析
数据集成平台ETLCloud,主要用于支持数据的抽取(Extract)、转换(Transform)和加载(Load)过程。提供了一个简洁直观的界面,以便用户可以在不同的数据源之间轻松地进行数据迁移和转换。…...
Caliper 配置文件解析:config.yaml
Caliper 是一个区块链性能基准测试工具,用于评估不同区块链平台的性能。下面我将详细解释你提供的 fisco-bcos.json 文件结构,并说明它与 config.yaml 文件的关系。 fisco-bcos.json 文件解析 这个文件是针对 FISCO-BCOS 区块链网络的 Caliper 配置文件,主要包含以下几个部…...

Chrome 浏览器前端与客户端双向通信实战
Chrome 前端(即页面 JS / Web UI)与客户端(C 后端)的交互机制,是 Chromium 架构中非常核心的一环。下面我将按常见场景,从通道、流程、技术栈几个角度做一套完整的分析,特别适合你这种在分析和改…...

实战三:开发网页端界面完成黑白视频转为彩色视频
一、需求描述 设计一个简单的视频上色应用,用户可以通过网页界面上传黑白视频,系统会自动将其转换为彩色视频。整个过程对用户来说非常简单直观,不需要了解技术细节。 效果图 二、实现思路 总体思路: 用户通过Gradio界面上…...

MySQL的pymysql操作
本章是MySQL的最后一章,MySQL到此完结,下一站Hadoop!!! 这章很简单,完整代码在最后,详细讲解之前python课程里面也有,感兴趣的可以往前找一下 一、查询操作 我们需要打开pycharm …...

Ubuntu系统多网卡多相机IP设置方法
目录 1、硬件情况 2、如何设置网卡和相机IP 2.1 万兆网卡连接交换机,交换机再连相机 2.1.1 网卡设置 2.1.2 相机设置 2.3 万兆网卡直连相机 1、硬件情况 2个网卡n个相机 电脑系统信息,系统版本:Ubuntu22.04.5 LTS;内核版本…...