【Mybatis-Plus篇】Mybatis-Plus基本使用

💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。
img

  • 推荐:kwan 的首页,持续学习,不断总结,共同进步,活到老学到老
  • 导航
    • 檀越剑指大厂系列:全面总结 java 核心技术点,如集合,jvm,并发编程 redis,kafka,Spring,微服务,Netty 等
    • 常用开发工具系列:罗列常用的开发工具,如 IDEA,Mac,Alfred,electerm,Git,typora,apifox 等
    • 数据库系列:详细总结了常用数据库 mysql 技术点,以及工作中遇到的 mysql 问题等
    • 懒人运维系列:总结好用的命令,解放双手不香吗?能用一个命令完成绝不用两个操作
    • 数据结构与算法系列:总结数据结构和算法,不同类型针对性训练,提升编程思维,剑指大厂

非常期待和您一起在这个小小的网络世界里共同探索、学习和成长。💝💝💝 ✨✨ 欢迎订阅本专栏 ✨✨

博客目录

    • 一.基本介绍
      • 1.常见操作
      • 2.条件构造器
    • 二.常见查询
      • 1.根据主键查询
      • 2.通过多个 id 查询
      • 3.通过 map 查询
      • 4.时间格式化
      • 5.allEq
      • 6.指定查询列
    • 三.普通查询
      • 1.链式条件查询
      • 2.selectOne
      • 3.selectList
      • 4.selectPage 分页
      • 5.排序
      • 6.模糊查询
    • 四.高阶查询
      • 1.复杂多条件
      • 2.and 条件
      • 3.or 条件
      • 4.优先级连接
      • 5.随机排序
      • 6.日期处理
      • 7.notIn
      • 8.inSql
    • 五.update 和 remove
      • 1.update
      • 2.remove
      • 3.set 和 setSql
    • 六.常见配置
      • 1.实现类写法
      • 2.注解
      • 3.只打印 SQL 语句
      • 4.驼峰设置
      • 5.创建时间
      • 6.数据库不存在字段
      • 7.更新字段
      • 8.@TableField

一.基本介绍

1.常见操作

  1. ge、gt、le、lt、isNull、isNotNull
  2. eq、ne
  3. between、notBetween
  4. allEq
  5. like、notLike、likeLeft、likeRight
  6. in、notIn、inSql、notinSql、exists、notExists
  7. or、and
  8. 嵌套 or、嵌套 and
  9. orderBy、orderByDesc、orderByAsc
  10. last
  11. 指定要查询的列
  12. set、setSql

2.条件构造器

  • Wrapper : 条件构造抽象类,最顶端父类
  • AbstractWrapper : 用于查询条件封装,生成 sql 的 where 条件
  • QueryWrapper : Entity 对象封装操作类,不是用 lambda 语法
  • UpdateWrapper : Update 条件封装,用于 Entity 对象更新操作
  • AbstractLambdaWrapper : Lambda 语法使用 Wrapper 统一处理解析 lambda 获取 column。
  • LambdaQueryWrapper :看名称也能明白就是用于 Lambda 语法使用的查询 Wrapper
  • LambdaUpdateWrapper : Lambda 更新封装 Wrapper

image-20231124225625404

二.常见查询

1.根据主键查询

User user = userMapper.selectById(1094592041087729666L);

2.通过多个 id 查询

List<Long> longs = Arrays.asList(1094592041087729666L, 1094590409767661570L);
List<User> users = userMapper.selectBatchIds(longs);
users.forEach(System.out::println);

3.通过 map 查询

Map<String, Object> params = new HashMap<>();
params.put("name", "张雨琪");
List<User> users = userMapper.selectByMap(params);

4.时间格式化

wrapper.apply("date_format(create_time,"%Y-%m-%d") = {0}", "2019-02-14")

5.allEq

QueryWrapper<User> queryWrapper = new QueryWrapper<>();Map<String, Object> map = new HashMap<>();map.put("id", 2);map.put("name", "Jack");map.put("age", 20);9queryWrapper.allEq(map);List<User> users = userMapper.selectList(queryWrapper);users.forEach(System.out::println);

6.指定查询列

QueryWrapper<User> queryWrapper = new QueryWrapper<>();
queryWrapper.select("id", "name", "age");List<User> users = userMapper.selectList(queryWrapper);
users.forEach(System.out::println);

三.普通查询

1.链式条件查询

//条件查询-等于-like-小于-大于-排序
private Wrapper<TaskRecordDO> getTaskRecordWrapper(ListTaskRecordRequestDTO query) {Date startExecuteTime = query.getStartExecuteTime();Date endExecuteTime = query.getEndExecuteTime();Calendar calendar = new GregorianCalendar();if (endExecuteTime != null) {calendar.setTime(endExecuteTime);calendar.add(Calendar.DATE, 1);}return new QueryWrapper<TaskRecordDO>().lambda().eq(StringUtils.isNotBlank(query.getExecuteStatus()), TaskRecordDO::getExecStatus, query.getExecuteStatus()).like(StringUtils.isNotBlank(query.getKeyword()), TaskRecordDO::getOutNodeName, query.getKeyword()).lt(endExecuteTime != null, TaskRecordDO::getStartRunTime, calendar.getTime()).ge(startExecuteTime != null, TaskRecordDO::getStartRunTime, startExecuteTime).eq(query.getTaskId() != null, TaskRecordDO::getTaskId, query.getTaskId()).orderByDesc(TaskRecordDO::getId);
}

2.selectOne

UserRelateCar userRelateCar = userRelateCarMapper.selectOne(Wrappers.<UserRelateCar>lambdaQuery().eq(UserRelateCar::getXcxUserId, driverXcxUserId).eq(UserRelateCar::getNumber, number));

3.selectList

 List<ShipmentOrderDetailGoodsInfo> shipmentOrderDetailGoodsInfos = shipmentOrderDetailGoodsInfoMapper.selectList(Wrappers.<ShipmentOrderDetailGoodsInfo>lambdaQuery()
.eq(ShipmentOrderDetailGoodsInfo::getShipmentOrderDetailId, shipmentDetailId));

4.selectPage 分页

@GetMapping(value = "/selectAllInPage")public List<Teacher> selectAllInPage(int pageNumber,int pageSize){Page<Teacher> page =new Page<>(pageNumber,pageSize);EntityWrapper<Teacher> entityWrapper = new EntityWrapper<>();entityWrapper.ge("id", 1);return teacherMapper.selectPage(page,entityWrapper);}
LambdaUpdateWrapper<AdsDayCityOrrCalendarDo> wrapper = Wrappers.lambdaUpdate(AdsDayCityOrrCalendarDo.class).eq(AdsDayCityOrrCalendarDo::getBrandDetailNo, query.getBrandDetailNo());
final Page<AdsDayCityOrrCalendarDo> citys = adsDayCityOrrCalendarMapper.selectPage(new Page<>(query.getPage(), query.getSize()), wrapper);

5.排序

可以使用 QueryWrapper 的 orderByDesc 方法来指定字段降序查询,示例代码如下:

//其中,"age" 是需要降序排列的字段名。
QueryWrapper<User> wrapper = new QueryWrapper<>();
wrapper.orderByDesc("age"); // 按照 age 字段降序排列
List<User> userList = userMapper.selectList(wrapper);

6.模糊查询

//条件查询-左边模糊匹配-右边模糊匹配
@Override
public boolean checkExist(String tableName) {Wrapper<DagConfDO> queryWrapper = Wrappers.<DagConfDO>query().lambda().likeLeft(DagConfDO::getConf, tableName).likeRight(DagConfDO::getConf, tableName).orderByDesc(DagConfDO::getId).groupBy(DagConfDO::getTaskId);dagConfMapper.selectList(queryWrapper);return false;
}

四.高阶查询

1.复杂多条件

@GetMapping(value = "/selectAllByWrapper4")public  List<Teacher> selectAllByWrapper4(){EntityWrapper entity=new EntityWrapper();entity.gt("id","0");entity.le("id",11);entity.ne("teacher_name","null_name");entity.like("teacher_name","tt");entity.notLike("teacher_pwd","sadas");entity.orderBy("id");return teacherMapper.selectList(entity);}

2.and 条件

QueryWrapper<AttrEntity> queryWrapper = new QueryWrapper<AttrEntity>().
eq("attr_id",key).
eq("catelog_id",catelogId);

或者

QueryWrapper<AttrEntity> queryWrapper = new QueryWrapper<AttrEntity>().
eq("attr_id",key);queryWrapper.and(qr -> qr.eq("catelog_id", catelogId));

3.or 条件

QueryWrapper<AttrEntity> queryWrapper = new QueryWrapper<AttrEntity>().
eq("attr_id",key).
or().
eq("catelog_id",catelogId);

4.优先级连接

QueryWrapper<AttrEntity> queryWrapper = new QueryWrapper<AttrEntity>().eq("attr_type", "base".equalsIgnoreCase(type) ? 1 : 0);queryWrapper.and(qr ->qr.eq("attr_id", key).or().like("attr_name", key)
);
queryWrapper.and(qr -> qr.eq("catelog_id", catelogId));
select ...
WHERE (attr_type = ? AND ( (attr_id = ? OR attr_name LIKE ?) ) AND ( (catelog_id = ?) ))
...;

由此还可见 or(Consumer consumer),and(Consumer consumer)这两个方法参数为 Consumer 时,会在连接处生成 2 对括号,以此提高优先级。

or带括号练习:

 LambdaQueryWrapper<CsdnRedPackage> wrapper = new LambdaQueryWrapper<>();wrapper.and(QueryWrapper ->QueryWrapper.notIn(CsdnRedPackage::getMsg, CommonConstant.RedPackageResponse.COMPLETED, CommonConstant.RedPackageResponse.RECEIVED).or(query -> query.eq(CsdnRedPackage::getMsg, "received").eq(CsdnRedPackage::getMyAmount, 0)));wrapper.eq(CsdnRedPackage::getIsDelete, 0);

5.随机排序

希望返回的数据是随机的,而不是根据某一个字段进行排序,我们可以使用 rand()函数进行排序。

QueryWrapper<CsdnUserInfo> wrapper = new QueryWrapper<>();wrapper.eq("is_delete", 0);wrapper.orderByAsc("rand()");final List<CsdnUserInfo> list = csdnUserInfoService.list(wrapper);

6.日期处理

QueryWrapper<CsdnRedPackage> wrapper = new QueryWrapper<>();wrapper.eq("is_delete", 0);String today = DateUtil.today();String formattedDate = DateUtil.format(DateUtil.parse(today), "yyyy-MM-dd");wrapper.apply("DATE(create_time) = {0}", formattedDate);final List<CsdnRedPackage> list = csdnRedPackageService.list(wrapper);

7.notIn

多个不等于的值使用 notIn

if (StringUtils.isNotEmpty(msg)) {if (StringUtils.equals(msg, "其它")) {wrapper.notIn("msg", "completed", "received");} else {wrapper.eq("msg", msg);}
}

8.inSql

in、notIn、inSql、notinSql、exists、notExists 也都是支持的

  • 查询创建时间为 2019 年 2 月 14
  • 并且上级领导姓王
wrapper.apply("date_format(create_time,"%Y-%m-%d") = {0}", "2019-02-14").inSql("manager_id", "select id from user where name like "王%"");

五.update 和 remove

1.update

 userRelateCarMapper.update(new UserRelateCar(), Wrappers.<UserRelateCar>lambdaUpdate().set(UserRelateCar::getIsDefault, DefaultCarEnum.YES.getType()).eq(UserRelateCar::getNumber, carNumber).eq(UserRelateCar::getXcxUserId, xcxUserId));

2.remove

 shipmentOrderRelateUserService.remove(Wrappers.<ShipmentOrderRelateUser>lambdaQuery().eq(ShipmentOrderRelateUser::getRoleId, RoleEnum.DRIVER.getType()).eq(ShipmentOrderRelateUser::getShipmentOrderId, id));

3.set 和 setSql

//修改值
User user = new User();
user.setAge(99);//修改条件
UpdateWrapper<User> userUpdateWrapper = new UpdateWrapper<>();
userUpdateWrapper
.like("name", "h")
.set("name", "老李头")//除了可以查询还可以使用set设置修改的字段
.setSql(" email = '123@qq.com'");//可以有子查询
int result = userMapper.update(user, userUpdateWrapper);

六.常见配置

1.实现类写法

@Service
public class StoreBaseServiceImpl extends ServiceImpl<StoreBaseMapper, StoreBase> implements IStoreBaseService {}public interface IStoreBaseService extends IService<StoreBase> {}

2.注解

@Api(tags = "外部系统(供应链)交互API")  //controller@ApiOperation("信息软删除")  //方法@ApiModelProperty(value = "对接系统") //属性@ApiModel(value = "任务统计")  //返回的对象

3.只打印 SQL 语句

Mybatis 配置

mybatis:configuration:### 开启打印sql配置log-impl: org.apache.ibatis.logging.stdout.StdOutImpl### 开启驼峰配置map-underscore-to-camel-case:true

MybatisPlus 配置

mybatis-plus:configuration:### 开启打印sql配置log-impl: org.apache.ibatis.logging.stdout.StdOutImpl### 开启驼峰配置map-underscore-to-camel-case:true

生产关闭日志

mybatis-plus:configuration:#关闭sql日志log-impl: org.apache.ibatis.logging.nologging.NoLoggingImpl

其他配置

### mybatis 相关配置
mybatis:config-location: classpath:mybatis.cfg.xml    #  mybatis主配置文件所在路径type-aliases-package: com.example.entity  #  定义所有操作类的别名所在包mapper-locations: classpath:mapper/*.xml      #  所有的mapper映射文件configuration:# 开启驼峰uName自动映射到u_namemap-underscore-to-camel-case: truelog-impl: org.apache.ibatis.logging.stdout.StdOutImpl### mybatis-plus 相关配置
mybatis-plus:type‐aliases‐package: com.example.entity  #  定义所有操作类的别名所在包# xml扫描,多个目录用逗号或者分号分隔(告诉 Mapper 所对应的 XML 文件位置)mapper-locations: classpath:mapper/*.xml# 以下配置均有默认值,可以不设置global-config:banner: false # 是否 mybatis-plus 在控制台输出的logodb-config:#主键类型 AUTO:"数据库ID自增" INPUT:"用户输入ID",ID_WORKER:"全局唯一ID (数字类型唯一ID)", UUID:"全局唯一ID UUID";id-type: auto#字段策略 IGNORED:"忽略判断"  NOT_NULL:"非 NULL 判断")  NOT_EMPTY:"非空判断"field-strategy: NOT_EMPTY#数据库类型db-type: MYSQLlogic-delete-field: deleted # 全局逻辑删除的实体字段名logic-delete-value: 1 # 逻辑已删除值(默认为 1)logic-not-delete-value: 0 # 逻辑未删除值(默认为 0)configuration:# 是否开启自动驼峰命名规则映射:从数据库列名到Java属性驼峰命名的类似映射map-underscore-to-camel-case: true# 如果查询结果中包含空值的列,则 MyBatis 在映射的时候,不会映射这个字段call-setters-on-nulls: true# 这个配置会将执行的sql打印出来,在开发或测试的时候可以用log-impl: org.apache.ibatis.logging.stdout.StdOutImpl

4.驼峰设置

mybatis 默认是属性名和数据库字段名一一对应的,即

  • 数据库表列:user_name
  • 实体类属性:user_name

但是 java 中一般使用驼峰命名

  • 数据库表列:user_name
  • 实体类属性:userName

在 Springboot 中,可以通过设置 map-underscore-to-camel-case 属性为 true 来开启驼峰功能。
application.yml 中:

mybatis:configuration:map-underscore-to-camel-case: true

application.properties 中:

mybatis.configuration.map-underscore-to-camel-case:=true

5.创建时间

/*** 创建时间*/@TableField(value = "create_time", fill = FieldFill.INSERT)private Date createTime;/*** 修改时间*/@TableField(value = "edit_time", fill = FieldFill.INSERT_UPDATE)private Date editTime;

6.数据库不存在字段

@TableField(exist = false)

7.更新字段

如果您是在使用 MyBatis-Plus 进行数据库操作,可以使用以下代码将 id 为 1 的数据的 is_delete 字段改为 1:

QueryWrapper<Chatbot> wrapper = new QueryWrapper<>();
wrapper.eq("id", 1);
Chatbot chatbot = new Chatbot();
chatbot.setIsDelete(1);
return Result.ok(this.chatbotService.update(chatbot, wrapper));

在上述代码中,我们先创建了一个 QueryWrapper 对象,通过 eq 方法指定查询条件为 id = 1is_delete = 1。然后,我们创建了一个 Chatbot 对象,设置其 is_delete 字段为 1。最后,我们调用 update 方法,将修改后的 Chatbot 对象和查询条件 QueryWrapper 对象传递给 update 方法,完成数据更新操作。 需要注意的是,如果您要更新的数据不存在,update 方法会返回 false,否则会返回 true。如果您需要返回更新后的数据,可以使用 updateById 方法,该方法会返回更新后的完整实体对象。

8.@TableField

如果您在使用 MyBatis-Plus 进行数据库操作,可以使用 @TableField 注解来标记实体类中的字段,指定该字段不在数据库中对应的列。以下是一个示例代码:

import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableName;@TableName("chatbot")
public class Chatbot {private Long id;private String name;private Integer age;@TableField(exist = false)private String otherField;// 省略 getter 和 setter 方法
}

在上述代码中,我们使用 @TableField 注解来标记 otherField 字段,指定该字段不在数据库中对应的列。其中,exist 属性指定该字段是否在数据库表中存在。如果 exist 属性设置为 false,则表示该字段不在数据库表中存在,否则表示该字段在数据库表中存在。在本例中,我们将 exist 属性设置为 false,表示 otherField 字段不在数据库表中存在。

需要注意的是,如果您在实体类中使用了 @TableField 注解,那么在进行查询、更新、删除等操作时,MyBatis-Plus 会忽略该字段。如果您需要在查询中使用该字段,可以使用 select 方法指定查询的字段列表。

觉得有用的话点个赞 👍🏻 呗。
❤️❤️❤️本人水平有限,如有纰漏,欢迎各位大佬评论批评指正!😄😄😄

💘💘💘如果觉得这篇文对你有帮助的话,也请给个点赞、收藏下吧,非常感谢!👍 👍 👍

🔥🔥🔥Stay Hungry Stay Foolish 道阻且长,行则将至,让我们一起加油吧!🌙🌙🌙

img

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/168535.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

7-22 龟兔赛跑

import java.util.Scanner; class Main {public static void main(String[] args) {Scanner scnew Scanner(System.in);int timesc.nextInt();sc.close();int wugui 0;//乌龟里程int tuzi 0;//兔子里程int tuzi_run0;int tuzi_rest0;int is_rest0;//是否需要休息&#xff1a;…

鸿蒙原生应用/元服务开发-AGC分发如何上架HarmonyOS应用

一、上架整体流程 二、上架HarmonyOS应用 获取到HarmonyOS应用软件包后&#xff0c;开发者可将应用提交至AGC申请上架。上架成功后&#xff0c;用户即可在华为应用市场搜索获取开发者的HarmonyOS应用。 配置应用信息 1.登录AppGallery Connect&#xff0c;选择“我的应用”。…

C#,《小白学程序》第十七课:随机数(Random)第四,移动平均值(Moving Average)的计算方法与代码

1 文本格式 /// <summary> /// 《小白学程序》第十七课&#xff1a;随机数&#xff08;Random&#xff09;第四&#xff0c;移动平均值的计算方法与代码 /// 继续学习数据统计&#xff0c;移动平均值的计算方法 /// 移动平均值就是一定步长内数值的平均值&#xff0c;用…

解决:javax.websocket.server.ServerContainer not available 报错问题

原因&#xff1a; 用于扫描带有 ServerEndpoint 的注解成为 websocket&#xff0c;该方法是 服务器端点出口&#xff0c;当进行 SpringBoot 单元测试时&#xff0c;并没有启动服务器&#xff0c;所以当加载到这个bean时会报错。 解决方法&#xff1a; 加上这个注解内容 Spr…

每日一题(LeetCode)----链表--链表最大孪生和

每日一题(LeetCode)----链表–链表最大孪生和 1.题目&#xff08;2130. 链表最大孪生和&#xff09; 在一个大小为 n 且 n 为 偶数 的链表中&#xff0c;对于 0 < i < (n / 2) - 1 的 i &#xff0c;第 i 个节点&#xff08;下标从 0 开始&#xff09;的孪生节点为第 (n…

机器学习之自监督学习(四)MoCo系列翻译与总结(一)

Momentum Contrast for Unsupervised Visual Representation Learning Abstract 我们提出了“动量对比”&#xff08;Momentum Contrast&#xff0c;MoCo&#xff09;来进行无监督的视觉表示学习。从对比学习的角度来看&#xff0c;我们将其视为字典查找&#xff0c;通过构建…

Windows服务设置多个服务依赖项避免服务启动失败找不到数据库

添加多个服务依赖项建议通过命令行的方式添加&#xff1a; winr键打开命令行 cmd 命令行添加命令如下&#xff1a; sc config "thinvent-auth" depend "MySQL57"/"RabbitMQ"/"Redis" sc config "服务A" depend "服务…

【VSCode】自定义转换大小写快捷键

文章目录 VSCode 是没有可以直接转换字母大小写的快捷键的&#xff0c;但是可以通过设置去定义 点击左下角设置按钮&#xff0c;并选择键盘快捷方式 在快捷方式里面搜索写&#xff0c;就能找到&#xff1a; 选择要设置的快捷键&#xff0c;并点击左侧的号 在键盘上按住你想设置…

API 设计:使用 Node.js 和 Express.js 的综合教程

API&#xff08;应用程序编程接口&#xff09;设计涉及创建一个高效而强大的接口&#xff0c;允许不同的软件应用程序相互交互。 说明 本教程将指导您使用 Node.js 和 Express.js 作为核心技术来规划、设计和构建 API。但是&#xff0c;这些原则可以应用于任何语言或框架。我们…

人脑工作机制 基本工作原理 神经元 神经网络 学习和记忆 和身体的互动 模仿游戏

人脑的工作机制非常复杂&#xff0c;涉及多个层面的结构和功能。以下是一些关键点&#xff0c;用以概述人脑的基本工作原理&#xff1a; 基本单位 - 神经元&#xff1a; 人脑包含大约860亿个神经元。神经元是脑的基本工作和信号处理单位&#xff0c;通过树突接收信号&#xff0…

java中的String.format()方法详解

介绍 String.format() 是 Java 中的一个字符串格式化方法&#xff0c;它用于生成指定格式的字符串。这个方法可以接受一个或多个参数&#xff0c;并将它们按照指定的格式插入到字符串中。它使用了类似于 C 语言中的 printf 函数的语法。 String.format() 方法的使用格式如下&…

医学图像分割:U_Net 论文阅读

“U-Net: Convolutional Networks for Biomedical Image Segmentation” 是一篇由Olaf Ronneberger, Philipp Fischer, 和 Thomas Brox发表的论文&#xff0c;于2015年在MICCAI的医学图像计算和计算机辅助干预会议上提出。这篇论文介绍了一种新型的卷积神经网络架构——U-Net&a…

无人机巡检如何做到实时识别,从数据到模型全流程解读

在数字化和自动化飞速发展的今天&#xff0c;AI识别算法正在加速进入行业生产系统。 基于巡检数据的智能开发&#xff0c;识别算法突破性进展的核心驱动力在于需求——从全天候巡视的平安城市&#xff0c;到潮汐变化的交通网络&#xff0c;从广阔的水域&#xff0c;到繁忙的街道…

抵御网络威胁的虚拟盾牌:威胁建模

威胁建模是一个允许您管理因日益复杂且不断变化的 IT 安全威胁而产生的风险的过程。为了保护敏感系统和数据&#xff0c;主动了解和应对这些威胁至关重要。 威胁建模是识别、评估和减轻这些威胁的关键过程&#xff0c;确保组织准备好面对不断出现的新的复杂挑战。 本文将详细…

第21章 JUC并发编程

通过本章的学习可以学到&#xff1a;掌握java.util.concurrent(JUC)开发框架的核心接口与使用特点,掌握TimeUnit类的作用&#xff0c;并且可以使用此类实现日期时间数据转换&#xff0c;掌握多线程原子操作类的实现以及与volatile关键字的应用&#xff0c;理解ThreadFactory类的…

JDBC编程方法及细节

JDBC&#xff08;Java Database Connectivity&#xff09;是Java编程语言用于连接和操作数据库的API&#xff08;Application Programming Interface&#xff09;。它为开发人员提供了一组Java类和接口&#xff0c;用于与各种关系型数据库进行通信。使用JDBC&#xff0c;开发人…

FL Studio21.2.0中文语言包编曲软件入门讲解

FL Studio常称水果&#xff0c;是一款功能强大的编曲软件&#xff0c;集编曲&#xff0c;录音&#xff0c;剪辑&#xff0c;混音于一身&#xff0c;简单易上手&#xff0c;灵活性高&#xff0c;强大到突破想象。 FL Studio&#xff0c;当前版本 FL Studio21&#xff0c;百分之…

统计二叉树中的伪回文路径 : 用位运用来加速??

题目描述 这是 LeetCode 上的 「1457. 二叉树中的伪回文路径」 &#xff0c;难度为 「中等」。 Tag : 「DFS」、「位运算」 给你一棵二叉树&#xff0c;每个节点的值为 1 到 9 。 我们称二叉树中的一条路径是 「伪回文」的&#xff0c;当它满足&#xff1a;路径经过的所有节点值…

使用Python的turtle模块绘制彩色螺旋线

1.1引言&#xff1a; 在Python中&#xff0c;turtle模块是一个非常有趣且强大的工具&#xff0c;它允许我们以一个可视化和互动的方式学习编程。在本博客中&#xff0c;我们将使用turtle模块来绘制一个彩色的螺旋线。通过调用各种命令&#xff0c;我们可以引导turtle绘制出指定…

Vue项目实战之一----实现分类弹框效果

效果图 实现 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>Title</title><script src"js/vue.js"></script><!-- 引入样式 --><link rel"stylesheet&qu…