SpringBoot整合MyBatis-Plus详解(二)

news2024/11/18 7:39:01

文章目录

    • SpringBoot整合MyBatis-Plus详解(二)
      • MyBatis-Plus简介
      • 条件构造器和常用接口⭐
        • Wrapper介绍
        • QueryWrapper(Mapper接口提供的)和QueryChainWrapper(Service接口提供的)
          • 案例1:组装查询条件
          • 案例2:组装排序条件
          • 案例3:组装删除条件
          • 案例4:条件的优先级
          • 案例5:指定查询的字段(默认是查询全部字段)
          • 案例6:实现子查询
        • UpdateWrapper
        • condition
          • 未使用condition
          • 使用condition来化简上面的代码(相当于if语句)
          • LambdaQueryWrapper
          • LambdaUpdateWrapper
      • MyBatis Plus插件⭐
        • 插件1:MyBatis Plus分页插件
          • 编写MyBatis Plus插件配置类
          • 测试分页
          • xml自定义分页
            • 在UserMapper中自定义接口方法
            • UserMapper.xml中编写SQL
            • 测试分页
        • 插件2:MyBatis Plus乐观锁插件
          • 模拟修改冲突
            • 数据库中增加商品表和插入数据
            • 新建实体类
            • 新建mapper接口
            • 测试
          • Mybatis Plus实现乐观锁
            • 给乐观锁标记属性加上@Version注解
            • 在配置类中配置乐观锁插件
            • 测试修改冲突
      • MyBatis Plus代码生成器⭐
        • 引入maven依赖
        • 编写代码快速生成方法(生成t_user表的代码)
      • MyBatisX插件⭐
        • 在IDEA上安装MyBatisX插件
        • MyBatisX插件功能1:Mapper和XML之间跳转
        • MyBatisX插件功能2:代码生成

SpringBoot整合MyBatis-Plus详解(二)

项目所在仓库

MyBatis-Plus简介

简介

  • MyBatis-Plus(简称 MP)是一个 MyBatis的增强工具,在 MyBatis 的基础上只做增强不做改变,为
    简化开发、提高效率而生

MyBatis-Plus特性

  • 无侵入:只做增强不做改变,引入它不会对现有工程产生影响,如丝般顺滑
  • 损耗小:启动即会自动注入基本 CURD,性能基本无损耗,直接面向对象操作
  • 强大的 CRUD 操作:内置通用 Mapper、通用 Service,仅仅通过少量配置即可实现单表大部分 CRUD 操作,更有强大的条件构造器,满足各类使用需求
  • 支持 Lambda 形式调用:通过 Lambda 表达式,方便的编写各类查询条件,无需再担心字段写错
  • 支持主键自动生成:支持多达 4 种主键策略(内含分布式唯一 ID 生成器 - Sequence),可自由配置,完美解决主键问题
  • 支持 ActiveRecord 模式:支持 ActiveRecord 形式调用,实体类只需继承 Model 类即可进行强大的 CRUD 操作
  • 支持自定义全局通用操作:支持全局通用方法注入( Write once, use anywhere )
  • 内置代码生成器:采用代码或者 Maven 插件可快速生成 Mapper 、 Model 、 Service 、 Controller 层代码,支持模板引擎,更有超多自定义配置等您来使用
  • 内置分页插件:基于 MyBatis 物理分页,开发者无需关心具体操作,配置好插件之后,写分页等同于普通 List 查询
  • 分页插件支持多种数据库:支持 MySQL、MariaDB、Oracle、DB2、H2、HSQL、SQLite、Postgre、SQLServer 等多种数据库
  • 内置性能分析插件:可输出 SQL 语句以及其执行时间,建议开发测试时启用该功能,能快速揪出慢查询
  • 内置全局拦截插件:提供全表 delete 、 update 操作智能分析阻断,也可自定义拦截规则,预防误操作

MyBatis-Plus支持的数据库

  • MySQL,Oracle,DB2,H2,HSQL,SQLite,PostgreSQL,SQLServer,Phoenix,Gauss ,ClickHouse,Sybase,OceanBase,Firebird,Cubrid,Goldilocks,csiidb

MyBatis-Plus的架构设计

条件构造器和常用接口⭐

Wrapper介绍
  • Wrapper : 条件构造抽象类,最顶端父类
    • AbstractWrapper : 用于查询条件封装,生成 sql 的 where 条件
      • QueryWrapper : 查询条件封装
      • UpdateWrapper : Update 条件封装
      • AbstractLambdaWrapper : 使用Lambda 语法
        • LambdaQueryWrapper :用于Lambda语法使用的查询Wrapper
        • LambdaUpdateWrapper : Lambda 更新封装Wrapper
  • eq相等 、 ne不相等、 gt大于、 lt小于 、 ge大于等于 、 le 小于等于
QueryWrapper(Mapper接口提供的)和QueryChainWrapper(Service接口提供的)
案例1:组装查询条件
	@Test
    void test01(){

        //查询用户名包含a,年龄在20到30之间,并且邮箱不为null的用户信息
        //SELECT id,username AS name,age,email,is_deleted FROM t_user WHERE is_deleted=0 AND (username LIKE ? AND age BETWEEN ? AND ? AND email IS NOT NULL)

        //方式1:QueryWrapper
//        QueryWrapper<User> queryWrapper=new QueryWrapper<>();
//
//        queryWrapper.like("username","a")
//                .between("age",20,30)
//                .isNotNull("email");
//
//
//        List<User> users = userMapper.selectList(queryWrapper);
//
//        users.forEach(System.out::println);


        //方式2:QueryChainWrapper
        QueryChainWrapper<User> chainWrapper = userService.query()
                .like("username", "a")
                .between("age", 20, 30)
                .isNotNull("email");

        List<User> users = chainWrapper.list();

        users.forEach(System.out::println);

    }
案例2:组装排序条件
	@Test
    void test02(){

        //按年龄降序查询用户,如果年龄相同则按id升序排列
        // SELECT uid,username AS name,age,email,is_deleted FROM t_user WHERE is_deleted=0 ORDER BY age DESC,uid ASC

        //方式1:QueryWrapper
//        QueryWrapper<User> queryWrapper = new QueryWrapper<>();
//        queryWrapper.orderByDesc("age")
//                .orderByAsc("uid");
//
//        List<User> users = userMapper.selectList(queryWrapper);
//
//        users.forEach(System.out::println);


        //方式2:QueryChainWrapper

        QueryChainWrapper<User> userQueryChainWrapper = userService.query()
                .orderByDesc("age")
                .orderByAsc("uid");
        List<User> userList = userQueryChainWrapper.list();

        userList.forEach(System.out::println);

    }
案例3:组装删除条件
	@Test
    void test03(){

        //删除email为空的用户
        //DELETE FROM t_user WHERE (email IS NULL)

        //QueryWrapper
        QueryWrapper<User> queryWrapper = new QueryWrapper<>();
        queryWrapper.isNull("email");
        userMapper.delete(queryWrapper);


    }
案例4:条件的优先级
	@Test
    void test04(){

        //将(年龄大于20并且用户名中包含有a)或邮箱为null的用户信息修改
        //UPDATE t_user SET age=?, email=? WHERE (username LIKE ? AND (age > ? OR email IS NULL))

        //lambda表达式内的逻辑优先运算
        QueryWrapper<User> queryWrapper = new QueryWrapper<>();
        queryWrapper
                .like("username","a")
                .and(i -> i.gt("age", 20).or().isNull("email"));

        User user = new User();
        user.setAge(18);
        user.setEmail("666333@qq.com");
        userMapper.update(user,queryWrapper);


    }
案例5:指定查询的字段(默认是查询全部字段)
	@Test
    void test05(){

        //查询用户信息的username和age字段
        //SELECT username,age FROM t_user WHERE is_deleted=0

        //方式1:QueryWrapper
//        QueryWrapper<User> queryWrapper = new QueryWrapper<>();
//
//        queryWrapper
//                .select("username","age"); //指定查询的字段(默认是查找全部字段)
//
//        List<User> users = userMapper.selectList(queryWrapper);
//
//        users.forEach(System.out::println);

        //方式2:QueryChainWrapper
        List<User> list = userService
                .query()
                .select("username", "age") //指定查询的字段(默认是查找全部字段)
                .list(); //list方法直接拿到结果集

        list.forEach(System.out::println);

    }
案例6:实现子查询
	@Test
    void test06(){

        //查询id小于等于3的用户信息
        //SELECT uid,username AS name,age,email,is_deleted FROM t_user WHERE is_deleted=0 AND (uid IN (select uid from t_user where uid <= 3))

        //方式1:QueryWrapper
//        QueryWrapper<User> queryWrapper = new QueryWrapper<>();
//        queryWrapper.inSql("uid","select uid from t_user where uid <= 3");
//
//        List<User> users = userMapper.selectList(queryWrapper);
//
//        users.forEach(System.out::println);

        //方式2:QueryChainWrapper
        List<User> userList = userService
                .query()
                .inSql("uid", "select uid from t_user where uid <= 3")
                .list();

        userList.forEach(System.out::println);

    }
UpdateWrapper
@Test
void test07()
{

    //好处:当我们使用了UpdateWrapper时,不需要传入entity了,可以通过set方法修改值

    //UPDATE t_user SET username=?,age=? WHERE is_deleted=0 AND (uid = ?)
    
    UpdateWrapper<User> updateWrapper = new UpdateWrapper<>();
    updateWrapper
            .set("username","新名字111")
            .set("age",32)
            .eq("uid",5L);

    userMapper.update(null,updateWrapper);

}
condition
未使用condition
@Test
void test08()
{
    String username=null;
    Integer smallAge=15;
    Integer bigAge=30;

    //SELECT uid,username AS name,age,email,is_deleted FROM t_user WHERE is_deleted=0 AND (age >= ? AND age <= ?)
    QueryWrapper<User> queryWrapper = new QueryWrapper<>();

    if (StringUtils.isNotBlank(username)) { //如果用户名不为空,则添加下面的条件
        queryWrapper
                .like("username",username);
    }
    if(smallAge != null){
        queryWrapper
                .ge("age",smallAge);
    }
    if(bigAge != null){
        queryWrapper
                .le("age",bigAge);
    }


    userMapper.selectList(queryWrapper);

}
使用condition来化简上面的代码(相当于if语句)

在这里插入图片描述

@Test
void test09()
{
    String username=null;
    Integer smallAge=15;
    Integer bigAge=30;

    //SELECT uid,username AS name,age,email,is_deleted FROM t_user WHERE is_deleted=0 AND (age >= ? AND age <= ?)
    QueryWrapper<User> queryWrapper = new QueryWrapper<>();
    queryWrapper
            .like(StringUtils.isNotBlank(username),"username",username)
            .ge(smallAge!=null,"age",smallAge)
            .le(bigAge!=null,"age",bigAge);

    userMapper.selectList(queryWrapper);

}
LambdaQueryWrapper
  • 好处就是:使用lambda表达式来代替表的字段,防止我们在开发中写表的字段错误。
@Test
void test10(){
    String username=null;
    Integer smallAge=15;
    Integer bigAge=30;

    LambdaQueryWrapper<User> lambdaQueryWrapper = new LambdaQueryWrapper<>();

    lambdaQueryWrapper.like(StringUtils.isNotBlank(username),User::getName,username);
    lambdaQueryWrapper.ge(smallAge!=null,User::getAge,smallAge);
    lambdaQueryWrapper.le(bigAge!=null,User::getAge,bigAge);

    userMapper.selectList(lambdaQueryWrapper);
    

}
LambdaUpdateWrapper
  • 好处就是:使用lambda表达式来代替表的字段,防止我们在开发中写表的字段错误。
@Test
void test11(){

    LambdaUpdateWrapper<User> lambdaUpdateWrapper = new LambdaUpdateWrapper<>();
    lambdaUpdateWrapper
            .set(User::getName,"新名字222")
            .set(User::getAge,55)
            .eq(User::getUid,5L);

    userMapper.update(null,lambdaUpdateWrapper);

}

MyBatis Plus插件⭐

插件1:MyBatis Plus分页插件
编写MyBatis Plus插件配置类
package com.boot.config;

import com.baomidou.mybatisplus.annotation.DbType;
import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;
import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

/**
 * @author youzhengjie 2022-08-17 20:44:12
 */

//Mybatis-Plus配置类
@Configuration
public class MybatisPlusConfiguration {

    //mybatis-plus插件都要添加到这个mybatis-plus拦截器上面去。
    @Bean
    public MybatisPlusInterceptor mybatisPlusInterceptor(){

        MybatisPlusInterceptor mybatisPlusInterceptor = new MybatisPlusInterceptor();
        //配置分页插件PaginationInnerInterceptor,指定数据库类型为MYSQL
        mybatisPlusInterceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL));

        return mybatisPlusInterceptor;
    }

}
测试分页
	@Test
    void testPage01(){

        //例如:total(总的数据记录数)=10,size(每一页的记录数大小)=5
        //那么就可以分成(10/5=2)页,分别是第1页和第2页,current就是当前页,因为只有2页,所以current只能写1或者2.

        //SELECT uid,username AS name,age,email,is_deleted FROM t_user WHERE is_deleted=0 LIMIT ?,?

        Page<User> userPage = new Page<>(2,5);

        //第一种写法:
//        userMapper.selectPage(userPage,null);

        //第二种写法:
        userService.page(userPage,null);

        //获取分页数据
        List<User> list = userPage.getRecords();
        list.forEach(System.out::println);
        System.out.println("当前页:"+userPage.getCurrent());
        System.out.println("每页显示的条数:"+userPage.getSize());
        System.out.println("总记录数:"+userPage.getTotal());
        System.out.println("总页数:"+userPage.getPages());
        System.out.println("是否有上一页:"+userPage.hasPrevious());
        System.out.println("是否有下一页:"+userPage.hasNext());


    }
xml自定义分页
在UserMapper中自定义接口方法
package com.boot.dao;

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.boot.entity.User;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import org.springframework.stereotype.Repository;

/**
 * @author youzhengjie 2022-08-15 18:42:11
 */

@Mapper
@Repository
// BaseMapper的泛型就是我们需要操作的实体类User
public interface UserMapper extends BaseMapper<User> {

    /**
     * 根据年龄查询用户列表,分页显示
     * @param page 分页对象,xml中可以从里面进行取值,传递参数 Page 即自动分页(注意page必须放在第一位)
     * @param age 年龄
     */

    Page<User> selectPageVo(@Param("page") Page<User> page, @Param("age") Integer age);



}
UserMapper.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.boot.dao.UserMapper">
    
    <select id="selectPageVo" resultType="com.boot.entity.User">
        select * from t_user where age=#{age}
    </select>

</mapper>
测试分页
@Test
void testPage02(){


    Page<User> userPage = new Page<>(1,5);

    //调用刚刚我们自定义的方法
    //select * from t_user where age=? LIMIT ?

    userMapper.selectPageVo(userPage,20);

    //获取分页数据
    List<User> list = userPage.getRecords();
    list.forEach(System.out::println);
    System.out.println("当前页:"+userPage.getCurrent());
    System.out.println("每页显示的条数:"+userPage.getSize());
    System.out.println("总记录数:"+userPage.getTotal());
    System.out.println("总页数:"+userPage.getPages());
    System.out.println("是否有上一页:"+userPage.hasPrevious());
    System.out.println("是否有下一页:"+userPage.hasNext());

}
插件2:MyBatis Plus乐观锁插件
模拟修改冲突
数据库中增加商品表和插入数据
CREATE TABLE t_product
(
 id BIGINT(20) NOT NULL COMMENT '主键ID',
 name VARCHAR(30) NULL DEFAULT NULL COMMENT '商品名称',
 number INT(11) DEFAULT 1 COMMENT '商品数量',
 version INT(11) DEFAULT 0 COMMENT '乐观锁版本号',
 PRIMARY KEY (id)
);

INSERT INTO t_product (id, name, number) VALUES (1, 'iphone13 pro', 0);
新建实体类
package com.boot.entity;

import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.experimental.Accessors;

import java.io.Serializable;

/**
 * @author youzhengjie 2022-08-17 21:56:17
 */

@TableName("t_product")
//lombok注解
@Data
@NoArgsConstructor
@AllArgsConstructor
@Accessors(chain = true)
public class Product implements Serializable {

    @TableId("id")
    private Long id;
    @TableField("name")
    private String name;
    @TableField("number")
    private int number;

    private int version;

}
新建mapper接口
package com.boot.dao;

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.boot.entity.Product;
import org.apache.ibatis.annotations.Mapper;
import org.springframework.stereotype.Repository;

/**
 * @author youzhengjie 2022-08-17 22:12:21
 */
@Mapper
@Repository
public interface ProductMapper extends BaseMapper<Product> {


}
测试
  • 测试前先查看商品库存:

在这里插入图片描述

  • 开始执行测试代码:
	@Test
    void test03(){


        //A用户获取到的
        Product p1 = productMapper.selectById(1L);
        //B用户获取到的
        Product p2 = productMapper.selectById(1L);

        //A用户修改库存
        p1.setNumber(p1.getNumber()+20);
        productMapper.update(p1,null);

        //B用户修改库存
        p2.setNumber(p2.getNumber()+30);
        productMapper.update(p2,null);

        
    }
  • 查看输出日志:

在这里插入图片描述

  • 再次查看数据库:

在这里插入图片描述

Mybatis Plus实现乐观锁
给乐观锁标记属性加上@Version注解

在这里插入图片描述

在配置类中配置乐观锁插件
package com.boot.config;

import com.baomidou.mybatisplus.annotation.DbType;
import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;
import com.baomidou.mybatisplus.extension.plugins.inner.OptimisticLockerInnerInterceptor;
import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

/**
 * @author youzhengjie 2022-08-17 20:44:12
 */

//Mybatis-Plus配置类
@Configuration
public class MybatisPlusConfiguration {

    //mybatis-plus插件都要添加到这个mybatis-plus拦截器上面去。
    @Bean
    public MybatisPlusInterceptor mybatisPlusInterceptor(){

        MybatisPlusInterceptor mybatisPlusInterceptor = new MybatisPlusInterceptor();
        //配置分页插件PaginationInnerInterceptor,指定数据库类型为MYSQL
        mybatisPlusInterceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL));
        //配置乐观锁插件
        mybatisPlusInterceptor.addInnerInterceptor(new OptimisticLockerInnerInterceptor());
        return mybatisPlusInterceptor;
    }

}

在这里插入图片描述

测试修改冲突
	@Test
    void test03(){


        //A用户获取到的
        Product p1 = productMapper.selectById(1L);
        //B用户获取到的
        Product p2 = productMapper.selectById(1L);

        //A用户修改库存
        p1.setNumber(p1.getNumber()+20);
        productMapper.update(p1,null);

        //B用户修改库存
        p2.setNumber(p2.getNumber()+30);
        productMapper.update(p2,null);


    }
  • 查看输出日志:

在这里插入图片描述

  • 查看数据库:

在这里插入图片描述

MyBatis Plus代码生成器⭐

引入maven依赖
<!--        mybatis-plus代码生成器-->
        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-generator</artifactId>
            <version>3.5.2</version>
        </dependency>
<!--       freemarker依赖 (mybatis-plus指定freemarker引擎时一定要引入这个依赖,不然会报错) -->
        <dependency>
            <groupId>org.freemarker</groupId>
            <artifactId>freemarker</artifactId>
            <version>2.3.31</version>
        </dependency>

在这里插入图片描述

编写代码快速生成方法(生成t_user表的代码)
  • 查看我们的t_user表:

在这里插入图片描述

  • 开始执行代码生成程序(通过t_user表生成代码):
package com.boot.generate;

import com.baomidou.mybatisplus.generator.FastAutoGenerator;
import com.baomidou.mybatisplus.generator.config.OutputFile;
import com.baomidou.mybatisplus.generator.engine.FreemarkerTemplateEngine;

import java.util.Collections;

/**
 * @author youzhengjie 2022-08-20 00:28:34
 * mybatis-plus代码生成器程序
 */
public class FastGeneratorTest {

    public static void main(String[] args) {

        FastAutoGenerator
                //mysql的数据源配置
                .create("jdbc:mysql://localhost:3306/mybatis_plus-db?serverTimezone=GMT%2B8&characterEncoding=utf-8&useSSL=false", "root", "18420163207")
                .globalConfig(builder -> {
                    builder.author("youzhengjie") // 设置作者
                            .enableSwagger() // 开启 swagger 模式
                            .fileOverride() // 覆盖已生成文件
                            .outputDir("D://mybatis-plus-generator"); // 指定输出目录
                })
                .packageConfig(builder -> {
                    builder.parent("com.boot") // 设置父包名
                            .moduleName("gen") // 设置父包模块名
                            .pathInfo(Collections.singletonMap(OutputFile.xml, "D://mybatis-plus-generator")); // 设置mapperXml生成路径
                })
                .strategyConfig(builder -> {
                    builder
                            //设置需要生成的表名(该表必须要在我们指定的mysql中存在,mybatis-plus才会根据这个表来生成代码)
                            .addInclude("t_user")
                            // 设置过滤表前缀
                            .addTablePrefix("t_", "c_");
                })
                .templateEngine(new FreemarkerTemplateEngine()) // 使用Freemarker引擎模板,默认的是Velocity引擎模板
                .execute(); //执行

    }

}

  • 输出日志:

在这里插入图片描述

  • 查看刚刚生成的代码结构:

在这里插入图片描述

MyBatisX插件⭐

在IDEA上安装MyBatisX插件

在这里插入图片描述

MyBatisX插件功能1:Mapper和XML之间跳转
  • 随便进入一个Mapper接口(然后点击跳转):

在这里插入图片描述

  • 点击XML文件的图标也可以实现跳转。

在这里插入图片描述

MyBatisX插件功能2:代码生成
  • 1:随便进入Mapper接口,输出你想生成的方法:

在这里插入图片描述在这里插入图片描述

在这里插入图片描述

  • 2:查看生成的方法和代码:

在这里插入图片描述

在这里插入图片描述

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

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

相关文章

隐私计算python实现Paillier同态加密

1.基本概念 Paillier同态加密是一种公钥加密方案&#xff0c;具有同态加密的特性。它由Pascal Paillier于1999年提出。 Paillier同态加密基于数论问题&#xff0c;其安全性基于大整数分解问题和离散对数问题的困难性。该方案可以用于保护隐私数据&#xff0c;同时支持在加密状态…

在类库中使用ASP.NET Core API

解决办法1 官方文档 解决办法2 将类库修改为web项目&#xff0c;然后设置输出为类库形式即可 <Project Sdk"Microsoft.NET.Sdk.Web"><PropertyGroup><TargetFramework>netcoreapp3.1</TargetFramework><OutputType>Library</O…

剑指JUC原理-3.线程常用方法及状态

常用方法 start和run 调用run public static void main(String[] args) {Thread t1 new Thread("t1") {Overridepublic void run() {log.debug(Thread.currentThread().getName());FileReader.read(Constants.MP4_FULL_PATH);}};t1.run();log.debug("do othe…

[已解决]安装的明明是pytorch-gpu,但是condalist却显示cpu版本,而且torch.cuda.is_available 也是flase

问题; 安装了gpu版本的pytorch&#xff0c;但是显示的torch.cuda.is_available(&#xff09;却是flase。 conda list查看 版本显示只有cpuonly 在网上找了半天&#xff0c;也没有解决办法。 仔细看了一下&#xff0c;发现&#xff0c;有个单独的包叫cpuonly&#xff0c;不知道…

【工具问题】IDEA每次关闭的时候都会弹框显示closing project,然后弹框持续很久就像卡住了

idea关闭的时候出现问题 问题展示为什么会出现这种情况怎么解决 问题展示 我idea已经关闭了&#xff0c;但是这个弹框要持续很久才能关闭 为什么会出现这种情况 我的plugins原本是加载不出来的&#xff0c;所以我按照网上说法去做 怎么解决 file->setting,再如图选择…

C语言KR圣经笔记 2.4声明 2.5算术操作符 2.6关系和逻辑操作符

2.4 声明 所有变量在使用前必须声明&#xff0c;尽管某些特定的声明可以由上下文隐式地做出。声明指定了类型&#xff0c;并包含一个或多个该类型的变量列表&#xff0c;如 int lower, upper, step; char c, line[1000]; 多个变量能以任何方式分布在多个声明之中&#xff1b…

SpringBoot整合MyBatis-Plus详解(一)

文章目录 SpringBoot整合MyBatis-Plus详解&#xff08;一&#xff09;MyBatis-Plus简介入门案例开发环境准备环境准备创建数据库和表Pom.xml 编写代码application.properties启动类User实体类创建UserMapper接口入门测试案例添加日志功能&#xff08;在application.properties后…

DVWA-Cross Site Request Forgery (CSRF)

大部分网站都会要求用户登录后,使用相应的权限在网页中进行操作,比如发邮件、购物或者转账等都是基于特定用户权限的操作。浏览器会短期或长期地记住用户的登录信息,但是,如果这个登录信息被恶意利用呢?就有可能发生CSRF CSRF的英文全称为Cross Site Request Forgery,中文…

openEuler 22.03 x86架构下docker运行arm等架构的容器——筑梦之路

为什么要这样做&#xff1f; 随着国产化的普及&#xff0c;国家政策对信创产业的支持&#xff0c;尤其一些金融证券行业、政府单位等&#xff0c;逐渐开始走国产化信创的路线&#xff0c;越来越多接触到国产 CPU &#xff08;arm 平台&#xff0c;比如华为的鲲鹏处理器&#xf…

TSINGSEE青犀基于AI视频识别技术的平安校园安防视频监控方案

一、背景需求 因学校频频出治安事件&#xff0c;所以必须要加强学校的安防工作&#xff0c;目前来看&#xff0c;大部分校园都建设了视频监控来预防保障校园安全。但是传统的视频监控系统&#xff0c;主要通过设备来录像以及人员时时监控来进行。这种监管方式效率十分低下&…

elementui时间日期组件右边自定义图标

效果 改为 首先是将左边的清除图标关闭 然后是将右边的图标设置为display&#xff1a;none,设置宽度&#xff0c;左右内边距 最后是 mounted() {/*思路&#xff1a;通过document文档&#xff0c;选中日期时间选择器元素&#xff0c;然后创建一个i标签&#xff0c;并指定其类…

分布式日志和链路追踪

分布式日志 实现思路 分布式日志框架服务的实现思路基本是一致的&#xff0c;如下&#xff1a; 日志收集器&#xff1a;微服务中引入日志客户端&#xff0c;将记录的日志发送到日志服务端的收集器&#xff0c;然后以某种方式存储数据存储&#xff1a;一般使用ElasticSearch分…

简化路径(C++解法)

题目 给你一个字符串 path &#xff0c;表示指向某一文件或目录的 Unix 风格 绝对路径 &#xff08;以 / 开头&#xff09;&#xff0c;请你将其转化为更加简洁的规范路径。 在 Unix 风格的文件系统中&#xff0c;一个点&#xff08;.&#xff09;表示当前目录本身&#xff1…

【高阶数据结构】并查集和图

目录 1.数据结构--并查集 2.数据结构--图 1.图的基础概念 2.图的简单实现 2.1.邻接矩阵的图实现 2.2.邻接表的图实现 2.3.图的DFS和BFS 2.4.最小生成树 2.4.1.Kruskal(克鲁斯卡尔算法) 2.4.2.Prim&#xff08;普里姆算法&#xff09; 2.5.最短路径 2.5.1.Dijkstra(…

非遗主题网站的设计与实现基于PHP实现

包括源码参考论文 下载地址: https://juzhendongli.store/commodity/details/18

k8s-----26、细粒度权限管理 RBAC

0、导读 每一个用户对API资源进行操作都需要通经过以下三个步骤: 第一步:对客户端访问进行认证操作,确认是否具有访问k8s权限(也就是通过serviceaccount) token(共享秘钥) SSL(双向SSL认证) …通过任何一个认证即表示认证通过,进入下一步第二步:授权检查,确认是否对资源…

openpnp - SlotSchultzFeeder source code bugfix

文章目录 openpnp - SlotSchultzFeeder source code bugfix概述笔记openpnp源码调试环境排查思路开git分支查到的问题 - 1查到的问题 - 2查到的问题 - 3针对以上问题进行的逻辑修正D:\my_openpnp\openpnp_github\src\main\java\org\openpnp\machine\reference\driver\wizards\G…

Redis快速上手篇(六)主从复制

主从复制 主机数据更新后根据配置和策略&#xff0c; 自动同步到备机的master/slaver机制&#xff0c;Master以写为主&#xff0c;Slave以读为主 读写分离&#xff0c;性能扩展&#xff08;主 写 从 读&#xff09; 容灾快速恢复 一主二仆 拷贝多个redis.conf文件include(写绝…

动态规划太难了?是你没有找对方法,四题带你搞懂动态规划!

&#x1f4af; 博客内容&#xff1a;动态规划刷题 &#x1f600; 作  者&#xff1a;陈大大陈 &#x1f680; 个人简介&#xff1a;一个正在努力学技术的准前端&#xff0c;专注基础和实战分享 &#xff0c;欢迎私信&#xff01; &#x1f496; 欢迎大家&#xff1a;这里是CS…

【RV1106/RV1103】RV1103增加RTL8723BS

文章目录 Kernel 部分支持配置 menuconfigWiFi 功能支持Bluetooth 功能支持 原SDK的Busybox配置BT 部分文件系统部分蓝牙测试dbus 安装测试遇到的问题让hci0出来 使用hcitool来操作 Kernel 部分支持 配置 menuconfig WiFi 功能支持 Bluetooth 功能支持 正基和海华的模块都使用…