MybatisPlus从入门到精通-基础篇

news2024/11/15 11:01:45

文章目录

    • 一、概述
    • 二、快速入门
      • 2.1 数据库准备
      • 2.2 创建springboot工程
      • 2.3 实体类准备
      • 2.4 测试MybatisPlus
    • 三、MP常用配置
      • 3.1 设置表映射规则
      • 3.2 设置主键生成策略
      • 3.3 设置字段映射关系
      • 3.4 设置字段和列名的驼峰映射
      • 3.5 日志
    • 四、基本使用
      • 4.1 增加(插入)
      • 4.2 删除
      • 4.3 修改
    • 五、条件构造器Wrapper
      • 5.1 概述
      • 5.2 常用的AbstractWrapper方法
      • 5.3 常用的QueryWrapper方法
      • 5.4 常用UpdateWrapper方法
      • 5.5 Lambda条件构造器
    • 六、自定义Sql
      • 6.1 准备数据库环境
      • 6.2 创建实体类
      • 6.3 Mybatis方式
      • 6.4 Mybatis方式结合条件构造器

🌕博客x主页:己不由心王道长🌕!
🌎文章说明:MybatisPlus🌎
✅系列专栏:Mybatis续集
🌴本篇内容:对JDK8的新特性进行学习和讲解🌴
☕️每日一语:只要你奔跑,这个世界就会跟着你奔跑,只要你停驻,这个世界就会舍弃你独自奔跑。唯有你确定一个方向,使劲的跑起来,这个世界会为你而让路。早安,新的一天。☕️
🚩 交流社区:己不由心王道长(优质编程社区)

一、概述

MybatisPlus是一款Mybatis增强工具,用于简化开发,提高效率。 它在 MyBatis 的基础上只做增强不做改变,为简化开发、提高效率而生。
官网地址
在这里插入图片描述

二、快速入门

2.1 数据库准备

CREATE TABLE `user` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT 'id',
  `user_name` varchar(20) NOT NULL COMMENT '用户名',
  `password` varchar(20) NOT NULL COMMENT '密码',
  `name` varchar(30) DEFAULT NULL COMMENT '姓名',
  `age` int(11) DEFAULT NULL COMMENT '年龄',
  `address` varchar(100) DEFAULT NULL COMMENT '地址',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8;

加入数据:

insert  into `user`(`id`,`user_name`,`password`,`name`,`age`,`address`) values (1,'wangye','123','王也',12,'北京'),(2,'zhugeqing','1332','诸葛青',13,'汉中'),(3,'zhangzhulan','123','张楚岚',22,'蘑菇石'),(4,'fengbaobao','1222','冯宝宝',221,'Chinese');

2.2 创建springboot工程

一、创建工程:
在这里插入图片描述
二、导入依赖:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>com.daozhang</groupId>
    <artifactId>MybatisPlus</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>MybatisPlus</name>
    <description>MybatisPlus</description>
    <properties>
        <java.version>1.8</java.version>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
        <spring-boot.version>2.6.13</spring-boot.version>
    </properties>
    <dependencies>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter</artifactId>
            <version>2.6.13</version>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <version>2.6.13</version>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>1.18.8</version>
        </dependency>
    </dependencies>
</project>

2.3 实体类准备

package com.daozhang.mybatisplus.entity;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

/**
 * @Author Administrator
 * @Date 2023/7/2 16:00
 * @description 用户测试实体类
 * @Version 1.0
 */
@Data
@NoArgsConstructor
@AllArgsConstructor
public class User {
    private Long id;
    private String userName;
    private String password;
    private String name;
    private Integer age;
    private String address;

}

2.4 测试MybatisPlus

一、添加MybatisPlus依赖:
SpringBoot整合其他框架的第一步就是添加相关依赖:

 <!--MybatisPlus依赖-->
        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-boot-starter</artifactId>
            <version>3.4.3</version>
        </dependency>
        <!--Mysql依赖-->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>8.0.20</version>
        </dependency>

添加配置信息:
肯定是要操作数据库的:

spring:
  datasource:
    url: jdbc:mysql://localhost:3306/mybatisplus?characterEncoding=utf-8&serverTimezone=UTC
    username: root
    password: 775033
    driver-class-name: com.mysql.cj.jdbc.Driver

三、创建mapper并基础BaseMapper接口

package com.daozhang.mybatisplus.mapper;

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.daozhang.mybatisplus.entity.User;

/**
 * @Author Administrator
 * @Date 2023/7/2 16:27
 * @description 用户mapper层
 * @Version 1.0
 */
public interface UserMapper extends BaseMapper<User> {
}

四、添加mapper层扫描:
在这里插入图片描述
五、测试:

/**
 * @Author Administrator
 * @Date 2023/7/2 16:30
 * @description usermapper层测试类
 * @Version 1.0
 */
@SpringBootTest
public class UserMapperTest {

    @Autowired
    UserMapper userMapper;
    @Test
    void selectList(){
        List<User> users = userMapper.selectList(null);
        Stream.of(users)
                .forEach(System.out::println);
    }
}

结果:

[User(id=1, userName=wangye, password=123, name=王也, age=12, address=北京), 
User(id=2, userName=zhugeqing, password=1332, name=诸葛青, age=13, address=汉中),
 User(id=3, userName=zhangzhulan, password=123, name=张楚岚, age=22, address=蘑菇石),
  User(id=4, userName=fengbaobao, password=1222, name=冯宝宝, age=221, address=Chinese)]

三、MP常用配置

3.1 设置表映射规则

在默认情况下MP操作的表名是实体类的类名,但是如果表名和类名不一致就需要我们自己设置映射规则:可以分为单独设置和全局设置

一、单表设置:
如果表名是tb_user,而实体类名是User则可以使用以下写法。
在这里插入图片描述

二、全局设置表名前缀

试着想一下,如果大量数据库的表名与实体类不一样,我们一个一个去设置,是不是太麻烦了?是的,我们的解决办法是,在配置文件种设置全局表名前缀
如果一个项目中所有的表名相比于类名都是多了个前缀: tb_ 。这可以使用如下方式配置

mybatis-plus:
  global-config:
    db-config:
      #表名前缀
      table-prefix: tb_

3.2 设置主键生成策略

问题分析:我们先做一个测试
在这里插入图片描述
可以看到数据库中id是顺序的:

 @Test
    void insertUser(){
        User user = new User();
        user.setUserName("麦当");
        user.setPassword("22222");
        int insert = userMapper.insert(user);
    }

新加一个数据,问题是什么呢?
在这里插入图片描述
问题在于主键,我们希望的是主键根据数据库的主键自增,但是并没有,所以这里我们需要设置主键的自增策略,在这里的策略是使用mp的策略,使用的算法是雪花算法:

一、单独测试:
如果我们需要使用别的策略可以在定义实体类时,在代表主键的字段上加上@TableId注解,使用其type属性指定主键生成策略。如:

@Data
@NoArgsConstructor
@AllArgsConstructor
public class User {
    @TableId(type = IdType.AUTO)
    private Long id;
    private String userName;
    private String password;
    private String name;
    private Integer age;
    private String address;

全部主键策略定义在了枚举类IdType中,IdType有如下的取值
在这里插入图片描述

  • AUTO

    数据库ID自增,依赖于数据库。该类型请确保数据库设置了 ID自增 否则无效

  • NONE

    未设置主键类型。若在代码中没有手动设置主键,则会根据主键的全局策略自动生成(默认的主键全局策略是基于雪花算法的自增ID)

  • INPUT

    需要手动设置主键,若不设置。插入操作生成SQL语句时,主键这一列的值会是null

  • ASSIGN_ID

    当没有手动设置主键,即实体类中的主键属性为空时,才会自动填充,使用雪花算法

  • ASSIGN_UUID

    当实体类的主键属性为空时,才会自动填充,使用UUID

二、全局设置:

mybatis-plus:
  global-config:
    db-config:
      # id生成策略 auto为数据库自增
      id-type: auto

3.3 设置字段映射关系

​ 默认情况下MP会根据实体类的属性名去映射表的列名。

​ 如果数据库的列表和实体类的属性名不一致了我们可以使用@TableField注解的value属性去设置映射关系。

如:如果表中一个列名叫password,但是实体类的属性名为passwordDD,可以使用如下方式进行配置:
在这里插入图片描述

3.4 设置字段和列名的驼峰映射

默认情况下MP会开启字段名列名的驼峰映射, 即从经典数据库列名 A_COLUMN(下划线命名) 到经典 Java 属性名 aColumn(驼峰命名) 的类似映射 。
怎么证明?如下:
在实体类的属性中有一个userName,数据库中对应的列名为user_name,我们更改一下数据库然后测试:
在这里插入图片描述
可以看到MP自动把对应的属性使用了驼峰命名。

如果需要关闭我们可以使用如下配置进行关闭。

mybatis-plus:
  configuration:
	#是否开启自动驼峰命名规则(camel case)映射,即从经典数据库列名 A_COLUMN(下划线命名) 到经典 Java 属性名 aColumn(驼峰命名) 的类似映射
    map-underscore-to-camel-case: false

3.5 日志

日志一直都是很重要的功能实现,可以记录我们的数据和操作,还可以在出错时及时差错:
如果需要打印MP操作对应的SQL语句等,可以配置日志输出。打印SQL语句可以判断我们写的SQL在哪步出现问题

配置方式如下:

mybatis-plus:
  configuration:
    # 日志
    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl

测试:
在这里插入图片描述

四、基本使用

基本使用,这里先介绍基本的增删改:

4.1 增加(插入)

 @Test
    void insertUser(){
        User user = new User();
        user.setUserName("麦当");
        user.setPassword("22222");
        int insert = userMapper.insert(user);
    }

SQL语句:
在这里插入图片描述

结果:
在这里插入图片描述

4.2 删除

@Test
    void deleteById(){
        Long id = 1675425759138750468L;
        int i = userMapper.deleteById(id);
    }

SQL:
在这里插入图片描述

4.3 修改

 @Test
    void updateUser(){
        User user = new User();
        user.setId(1L);
        user.setUserName("诸葛青");
        int i = userMapper.updateById(user);
    }

SQL:
在这里插入图片描述

五、条件构造器Wrapper

5.1 概述

我们在实际操作数据库的时候会涉及到很多的条件。所以MP为我们提供了一个功能强大的条件构造器 Wrapper 。使用它可以让我们非常方便的构造条件。

​ 其继承体系如下:
在这里插入图片描述
在其子类AbstractWrapper中提供了很多用于构造Where条件的方法。

AbstractWrapper的子类QueryWrapper则额外提供了用于针对Select语法的select方法。可以用来设置查询哪些列。

AbstractWrapper的子类UpdateWrapper则额外提供了用于针对SET语法的set方法。可以用来设置对哪些列进行更新。

5.2 常用的AbstractWrapper方法

eq:equals,等于
gt:greater than ,大于 >
ge:greater than or equals,大于等于≥
lt:less than,小于<
le:less than or equals,小于等于≤
between:相当于SQL中的BETWEEN
like:模糊匹配。like(“name”,“黄”),相当于SQL的name like ‘%黄%’
likeRight:模糊匹配右半边。likeRight(“name”,“黄”),相当于SQL的name like ‘黄%’
likeLeft:模糊匹配左半边。likeLeft(“name”,“黄”),相当于SQL的name like ‘%黄’
notLike:notLike(“name”,“黄”),相当于SQL的name not like ‘%黄%’
isNull
isNotNull
and:SQL连接符AND
or:SQL连接符OR
in: in(“age",{1,2,3})相当于 age in(1,2,3)
groupBy: groupBy(“id”,“name”)相当于 group by id,name
orderByAsc :orderByAsc(“id”,“name”)相当于 order by id ASC,name ASC
orderByDesc :orderByDesc (“id”,“name”)相当于 order by id DESC,name DESC

示例一:

@Test
    void AbstractWrapperTest(){
        QueryWrapper<User> queryWrapper = new QueryWrapper<>();
        //设置查询年龄为12
        queryWrapper.eq("age",12);
        queryWrapper.eq("address","北京");
        List<User> users = userMapper.selectList(queryWrapper);
        Stream.of(users)
                .forEach(System.out::println);
    }
}

示例二:

 @Test
    void AbstractWrapperTest02(){
        QueryWrapper<User> queryWrapper = new QueryWrapper<>();
        //设置查询条件为age在12、13、18、20之中
       queryWrapper.in("age",12,13,18,20);
       //设置查询条件为id在1-10之间
       queryWrapper.between("id",1,10);
       //
        queryWrapper.like("name","也");
        List<User> users = userMapper.selectList(queryWrapper);
        Stream.of(users)
                .forEach(System.out::println);
    }

示例三:

  @Test
    void AbstractWrapperTest03(){
        QueryWrapper<User> queryWrapper = new QueryWrapper<>();
        //设置查询条件为age在12、13、18、20之中
        queryWrapper.in("id",1,2,3,4);
        queryWrapper.gt("age",11);
        queryWrapper.orderByAsc("age");
        List<User> users = userMapper.selectList(queryWrapper);
        Stream.of(users)
                .forEach(System.out::println);
    }

5.3 常用的QueryWrapper方法

QueryWrapper的 select 可以设置要查询的列。

示例一:
select(String… sqlSelect) 方法的测试为要查询的列名

@Test
    void QueryWrapperTest01(){
        QueryWrapper<User> userQueryWrapper = new QueryWrapper<>();
        userQueryWrapper.select("age","name");
        List<User> users = userMapper.selectList(userQueryWrapper);
        Stream.of(users)
                .forEach(System.out::println);
    }

示例二、

select(Class<T> entityClass, Predicate<TableFieldInfo> predicate)

方法的第一个参数为实体类的字节码对象,第二个参数为Predicate类型,可以使用lambda的写法,过滤要查询的字段 (主键除外) 。

   @Test
    void QueryWrapperTest02(){
        QueryWrapper<User> userQueryWrapper = new QueryWrapper<>();
        userQueryWrapper.select(User.class, new Predicate<TableFieldInfo>() {
            @Override
            public boolean test(TableFieldInfo tableFieldInfo) {
                return "user_name".equals(tableFieldInfo.getColumn());
            }
        });
        List<User> users = userMapper.selectList(userQueryWrapper);
        Stream.of(users)
                .forEach(System.out::println);
    }

Lambda表达式写法:

 @Test
    void QueryWrapperTest02(){
        QueryWrapper<User> userQueryWrapper = new QueryWrapper<>();
        userQueryWrapper.select(User.class,q->{
            return "user_name".equals(q.getColumn());
        });
        List<User> users = userMapper.selectList(userQueryWrapper);
        Stream.of(users)
                .forEach(System.out::println);
    }

示例三:

select(Predicate<TableFieldInfo> predicate)

方法第一个参数为Predicate类型,可以使用lambda的写法,过滤要查询的字段 (主键除外) 。

@Test
    void QueryWrapperTest03(){
        QueryWrapper<User> userQueryWrapper = new QueryWrapper<>(new User());
        userQueryWrapper.select(new Predicate<TableFieldInfo>() {
            @Override
            public boolean test(TableFieldInfo tableFieldInfo) {
                return "user_name".equals(tableFieldInfo.getColumn());
            }
        });
        List<User> users = userMapper.selectList(userQueryWrapper);
        Stream.of(users)
                .forEach(System.out::println);
    }

5.4 常用UpdateWrapper方法

我们前面在使用update方法时需要创建一个实体类对象传入,用来指定要更新的列及对应的值。但是如果需要更新的列比较少时,创建这么一个对象显的有点麻烦和复杂。

​ 我们可以使用UpdateWrapper的set方法来设置要更新的列及其值。同时这种方式也可以使用Wrapper去指定更复杂的更新条件。

示例:

@Test
    void UpdateWrapperTest01(){
        UpdateWrapper<User> userUpdateWrapper = new UpdateWrapper<>();
        userUpdateWrapper.gt("age",12);
        userUpdateWrapper.set("name","王也1");
        int update = userMapper.update(null, userUpdateWrapper);
    }

5.5 Lambda条件构造器

我们前面在使用条件构造器时列名都是用字符串的形式去指定。这种方式无法在编译期确定列名的合法性。

​ 所以MP提供了一个Lambda条件构造器可以让我们直接以实体类的方法引用的形式来指定列名。这样就可以弥补上述缺陷。

 @Test
    void LambdaQueryWrapperTest(){
        LambdaQueryWrapper<User> lambdaQueryWrapper = new LambdaQueryWrapper<>();
        lambdaQueryWrapper.gt(User::getAge,12);
        lambdaQueryWrapper.like(User::getUserName,"也");
        List<User> users = userMapper.selectList(lambdaQueryWrapper);
        Stream.of(users)
                .forEach(System.out::println);
    }

六、自定义Sql

虽然MP为我们提供了很多常用的方法,并且也提供了条件构造器。但是如果真的遇到了复制的SQL时,我们还是需要自己去定义方法,自己去写对应的SQL,这样SQL也更有利于后期维护。

​ 因为MP是对mybatis做了增强,所以还是支持之前Mybatis的方式去自定义方法。

​ 同时也支持在使用Mybatis的自定义方法时使用MP的条件构造器帮助我们进行条件构造。

6.1 准备数据库环境

CREATE TABLE `orders` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  `price` int(11) DEFAULT NULL COMMENT '价格',
  `remark` varchar(100) DEFAULT NULL COMMENT '备注',
  `user_id` int(11) DEFAULT NULL COMMENT '用户id',
  `update_time` timestamp NULL DEFAULT NULL COMMENT '更新时间',
  `create_time` timestamp NULL DEFAULT NULL COMMENT '创建时间',
  `version` int(11) DEFAULT '1' COMMENT '版本',
  `del_flag` int(1) DEFAULT '0' COMMENT '逻辑删除标识,0-未删除,1-已删除',
  `create_by` varchar(100) DEFAULT NULL COMMENT '创建人',
  `update_by` varchar(100) DEFAULT NULL COMMENT '更新人',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8;

/*Data for the table `orders` */

insert  into `orders`(`id`,`price`,`remark`,`user_id`,`update_time`,`create_time`,`version`,`del_flag`,`create_by`,`update_by`) values (1,2000,'无',2,'2021-08-24 21:02:43','2021-08-24 21:02:46',1,0,NULL,NULL),(2,3000,'无',3,'2021-08-24 21:03:32','2021-08-24 21:03:35',1,0,NULL,NULL),(3,4000,'无',2,'2021-08-24 21:03:39','2021-08-24 21:03:41',1,0,NULL,NULL);

6.2 创建实体类

@Data
@NoArgsConstructor
@AllArgsConstructor
public class Orders  {

    private Long id;

    /**
     * 价格
     */
    private Integer price;

    /**
     * 备注
     */
    private String remark;

    /**
     * 用户id
     */
    private Integer userId;

    /**
     * 更新时间
     */
    private LocalDateTime updateTime;

    /**
     * 创建时间
     */
    private LocalDateTime createTime;

    /**
     * 版本
     */
    private Integer version;

    /**
     * 逻辑删除标识,0-未删除,1-已删除
     */
    private Integer delFlag;


}

6.3 Mybatis方式

一、定义方法:

User findBy(Long id);

二、先配置xml文件的存放目录

 mapper-locations: classpath*:/mapper/**/*.xml

三、xml映射文件中编写SQL

<?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.daozhang.mybatisplus.mapper.UserMapper">
    <select id="findBy" resultType="com.daozhang.mybatisplus.entity.User">
        select * from user where id=#{id}
    </select>
</mapper>

测试:

@Test
    void FindByTest(){
        User by = userMapper.findBy(1L);
        Stream.of(by)
                .forEach(System.out::println);
    }

结果:
在这里插入图片描述

6.4 Mybatis方式结合条件构造器

我们在使用上述方式自定义方法时。如果也希望我们的自定义方法能像MP自带方法一样使用条件构造器来进行条件构造的话只需要使用如下方式即可。
①方法定义中添加Warpper类型的参数

添加Warpper类型的参数,并且要注意给其指定参数名。

User findUserByWrapper(@Param(Constants.WRAPPER) Wrapper<User> wrapper);

②在SQL语句中获取Warpper拼接的SQL片段进行拼接。

<select id="findUserByWrapper" resultType="com.daozhang.mybatisplus.entity.User">
        select * from user ${ew.customSqlSegment}
    </select>
@Test
    void findByWrapperTest(){
        LambdaQueryWrapper<User> lambdaQueryWrapper = new LambdaQueryWrapper<>();
        lambdaQueryWrapper.eq(User::getAge,12);
        User userByWrapper = userMapper.findUserByWrapper(lambdaQueryWrapper);
        Stream.of(userByWrapper)
                .forEach(System.out::println);
    }

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

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

相关文章

TF卡/U盘扩容

1. 问题 在使用大于镜像、对TF卡/U盘烧录镜像以后&#xff0c;TF卡/U盘会出现一部分的空闲内存无法被使用&#xff0c;导致出现使用空间不足的报错&#xff0c;或运行大型项目不成功。 注意&#xff1a;本教程仅针对自行烧录镜像的用户&#xff0c;TF卡/U盘内如有出厂镜像则可…

【数据挖掘】时间序列教程【四】

3.3 划分变体 我们可以对上述 的主模型采用方差分析方法,并将中的总变异分解为 为残差平方和和可归因于各种频率的变化。 第二行是可能的,因为平方的所有交叉项都等于零,即对于所有 ,

基于JavaSwing的五子棋游戏设计

点击以下链接获取源码&#xff1a; https://download.csdn.net/download/qq_64505944/87987074?spm1001.2014.3001.5503 运行截图&#xff1a;

4.22. 卷积定理

1. 时域&#xff1a; 我们知道卷积运算是为了求系统的零状态响应的&#xff0c;即&#xff0c;如果输入给系统的信号是f(t)&#xff0c;系统函数是h(t)&#xff0c;那系统的输出是什么&#xff1f; 就是按照上述方式卷积得到 那上述的卷积在频率域是什么呢&#xff1f; 2. 卷积…

windows系统下的nvm环境安装

1、下载 https://github.com/coreybutler/nvm-windows/releases 直接下载zip包 并安装 2、安装 注意&#xff1a;尽量按照默认路径安装 否则可能出现 nvm 安装完成 后面下载使用node的时候有问题 3、安装完成检测 打开cmd命令 输入 nvm -v出现版本号 则安装成功 4、se…

FullGC调优100倍,掌握这3招,吊打JVM调优

前言&#xff1a; 在40岁老架构师尼恩的读者社区&#xff08;50&#xff09;中&#xff0c;很多小伙伴拿不到offer&#xff0c;或者拿不到好的offer。 尼恩经常给大家 优化项目&#xff0c;优化简历&#xff0c;挖掘技术亮点。 在指导简历的过程中&#xff0c; 线上问题排查…

【实用教程】教你一招 IDE 中比较骚的操作技巧!

我靠&#xff0c;这是个高手&#xff01;这真是个高手&#xff01; IDEA 有个很牛逼的功能&#xff0c;那就是后缀补全&#xff08;不是自动补全&#xff09;&#xff0c;很多人竟然不知道这个操作&#xff0c;还在手动敲代码。 这个功能可以使用代码补全来模板式地补全语句&…

02_04_02实时调度类_线程优先级代码实战

知识回忆 基础知识 Linux内核当中有3种调度策略: . SCHED_ OTHER分时调度策略;(普通进程) SCHED_ FIFO 实时调度策略,先到先服务; SCHED RR实时调度策略&#xff0c;时间片轮转。 备注:如果有相同优先级的实时进程(根据优先级计算的调度权值是一样的)已经准备好&#xff0c;FI…

vim和vimplus安装详细步骤

1、vim安装 sudo apt update sudo apt install vim依次执行以上命令&#xff0c;安装好vim编辑器&#xff0c;安装好之后&#xff0c;直接使用vim hello.c进行测试&#xff0c;如果可以进入就没有问题。 2、vimplus安装 2.1 检查vim版本 vim --version vim --version | gre…

微信小程序入门教程

微信小程序入门教程 1、前言1. 相关介绍2. 开发工具 2、微信小程序注册3、 构建第一个微信小程序3.1 微信开发者工具3.1.1 小程序创建3.1.2 小程序项目结构目录介绍 3.2 Hbuilder 4、小程序的发布 1、前言 1. 相关介绍 要学习制作微信小程序&#xff0c;首先要先了解微信公众…

【数据库工具】 图文版介绍Xampp工具的使用实战

前言 有时候懒得安装数据库&#xff0c;就可以使用一些集成工具&#xff0c;比如XAMPP就是一个流行的软件包&#xff0c;便于搭建本地web环境&#xff0c;使用里面的mysql也是相当方便&#xff0c;今天我们就一起来看一下。 &#x1f3e0;个人主页&#xff1a;我是沐风晓月 &…

使用 Keil 环境来写 EK TM4C123G 代码

EK TM4C123G 处理器介绍 就这么一个红板子&#xff0c;上边有两个处理器芯片&#xff1a; 靠上边的芯片&#xff0c;用作仿真/调试器&#xff0c;可以先忽略&#xff1b; 我们重点关注的芯片&#xff0c;位于板子下侧中间。 从丝印上&#xff0c;可以看出芯片的型号为&#…

软件UI工程师的职责模板

软件UI工程师的职责模板1 职责&#xff1a; 1.负责产品的UI视觉设计(手机软件界面 网站界面 图标设计产品广告及 企业文化的创意设计等); 2.负责公司各种客户端软件客户端的UI界面及相关图标制作; 3.设定产品界面的整体视觉风格; 4.为开发工程师创建详细的界面说明文档&…

网联V2X跟踪式微波雷达使用说明书

1 设备简介 网联 V2X跟踪式微波雷达跟踪式微波雷达传感器&#xff0c; 主要应用于高速公路、城市道普通公路等场景&#xff0c; 通过发射 FMCW调频连续波信号调频连续波信号 &#xff0c;接收路面目标物的回波信号获取目标物的距离、速度和角信息。 传感器通过 以太网或者光纤 …

Linux MQTT环境搭建详细步骤

关于MQTT的安装之前写过一次&#xff0c;但是不够详细&#xff0c;这里重新补充一下&#xff0c;以后用到的时候更方便。 1. 安装MQTT服务器 上网搜索apache activemq&#xff0c;找到它的官网https://activemq.apache.org/。 下载Linux版本。写文档时版本为ActiveMQ 5.18.1 …

改进的白鲸优化算法

改进的白鲸优化算法 一、算法灵感二、算法介绍2.1 初始化2.2 探索阶段2.3 开发阶段2.4 鲸落阶段 三、改进的白鲸优化算法3.1 集体行动策略3.2 小孔成像策略3.3 二次插值策略3.4 IBWO伪代码 一、算法灵感 白鲸优化算法(Beluga whale optimization, BWO)是2022年提出的一种元启发…

面试必备之安卓APP测试知识大全(值得收藏)

目录 一、安卓系统知识概述 1.1 安卓系统架构 1.2 安卓权限系统 1.3 认识adb与安卓间的通信 二、安卓APP测试流程图&#xff08;转&#xff09; 三、安卓App测试点 3.1 UI测试 3.2 兼容性测试 3.3 安装卸载/本地升级测试OTA 3.4 版本在线升级测试FOTA 3.5 交互测试 …

记录--让整个网站界面无滚动条

这里给大家分享我在网上总结出来的一些知识&#xff0c;希望对大家有所帮助 界面无滚动条 滚动条的优化也有很多种&#xff0c;比如随便再网上搜索美化浏览器滚动条样式&#xff0c;就会出现些用css去美化滚动条的方案。 那种更好呢&#xff1f; 没有更好只有更合适 像默认的滚…

【网络安全入门】001、基础入门-概念名词

文章目录 基础入门-概念名词1、域名&#xff08;1&#xff09;什么是域名&#xff08;2&#xff09;域名在哪里注册&#xff08;3&#xff09;什么是二级域名多级域名&#xff08;4&#xff09;域名发现对于安全测试的意义&#xff1f; 2、DNS&#xff08;1&#xff09;什么是D…

C语言编程:坐标系的平移和旋转

本文总结博主在工作中遇到的坐标系转换相关问题&#xff0c;以及C语言编程实现。 文章目录 1 问题场景2 公式推导2.1 旋转坐标系推导2.2 平移坐标系推导2.3 完整公式 3 C语言编程 1 问题场景 对于ADAS算法开发&#xff0c;在工作中遇到过很多需要坐标系转换的场景。例如&…