当前位置: 首页 > article >正文

MyBatis-plus笔记 (上)

简介

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

mybatis-plus总结:

注意:mybatis-puls仅局限于单表操作。

  自动生成单表的CRUD功能

  提供丰富的条件拼接方式

  全自动ORM类型持久层框架

快速入门

代码举例:

正常创建一个springboot的工程

Application.yaml文件:

# 连接池配置

spring:

  datasource:

    type: com.alibaba.druid.pool.DruidDataSource

    druid:

      url: jdbc:mysql:///mybatis-example

      username: root

      password: abc123LQ

      driver-class-name: com.mysql.cj.jdbc.Driver

启动类:

@SpringBootApplication

@MapperScan("com.atguigu.mapper")

public class Main {

    public static void main(String[] args) {

        SpringApplication.run(Main.class,args);

        System.out.println("Hello world!");

    }

}

mapper接口:

/**

 * mybatis-plus使用步骤:

 * 正常创建实体类,创建mapper接口,注意此时不需要我们再创建mapper.xml文件了

 * 让mapper接口继承BaseMapper<实体类>

 *     BaseMapper 提供了增删改查的方法。

 */

public interface UserMapper extends BaseMapper<User> {

}

实体类:

测试类

/**

 * springboot测试类

 * 之前的测试类需要使用@SpringJUnitConfig(value = 配置类.class----------指定配置类

 * 现在只需加一个@SpringBootTest即可:

 *      自动帮我们完成ioc的初始化

 */

@SpringBootTest

public class SpringBootMybatisPlusTest {

    @Autowired

    private UserMapper userMapper;

    @Test

    public void test(){

        List<User> users = userMapper.selectList(null);

        System.out.println("users = " + users);

    }

}

基于baseMapper的crud增强 

通用 CRUD 封装BaseMapper接口, `Mybatis-Plus` 启动时自动解析实体表关系映射转换为 `Mybatis` 内部对象注入容器! 内部包含常见的单表操作!

Insert方法

// 插入一条记录

// T 就是要插入的实体对象

// 默认主键生成策略为雪花算法(后面讲解)

int insert(T entity);

|类型|

参数名|

描述|

|T|

entity|

实体对象|

Delete方法

// 根据 entity 条件,删除记录

int delete(@Param(Constants.WRAPPER) Wrapper<T> wrapper);

// 删除(根据ID 批量删除)

int deleteBatchIds(@Param(Constants.COLLECTION) Collection<? extends Serializable> idList);

// 根据 ID 删除

int deleteById(Serializable id);

// 根据 columnMap 条件,删除记录

int deleteByMap(@Param(Constants.COLUMN_MAP) Map<String, Object> columnMap);

|类型

|参数名

|描述|

|Wrapper<T>

|wrapper

|实体对象封装操作类(可以为 null)|

|Collection<? extends Serializable>

|idList|

主键 ID 列表(不能为 null 以及 empty)|

|Serializable

|id

|主键 ID|

|Map<String, Object>

|columnMap

|表字段 map 对象|

Update方法

注意:传入对象的属性为空时,元数据不做修改;所以建议再创建实体类时,将基础类型做为包装类型,

例如int age,如果该对象没有给id赋值的话,那么对象的id0而不是为空,这样再修改数据时就会将对象的id列修改为0

// 根据 whereWrapper 条件,更新记录

int update(@Param(Constants.ENTITY) T updateEntity,

            @Param(Constants.WRAPPER) Wrapper<T> whereWrapper);//第一个装要修改的数据,第二个装修改条件

// 根据 ID 修改  主键属性必须值

int updateById(@Param(Constants.ENTITY) T entity);

|类型|

参数名|

描述|

|Wrapper<T>|

wrapper|

实体对象封装操作类(可以为 null)|

|Collection<? extends Serializable>

|idList|

主键 ID 列表(不能为 null 以及 empty)|

|Serializable|

id|

主键 ID|

|Map<String, Object>

|columnMap

|表字段 map 对象|

Select方法

// 根据 ID 查询

T selectById(Serializable id);

// 根据 entity 条件,查询一条记录

T selectOne(@Param(Constants.WRAPPER) Wrapper<T> queryWrapper);

// 查询(根据ID 批量查询)

List<T> selectBatchIds(@Param(Constants.COLLECTION) Collection<? extends Serializable> idList);

// 根据 entity 条件,查询全部记录

List<T> selectList(@Param(Constants.WRAPPER) Wrapper<T> queryWrapper);

// 查询(根据 columnMap 条件)

List<T> selectByMap(@Param(Constants.COLUMN_MAP) Map<String, Object> columnMap);

// 根据 Wrapper 条件,查询全部记录

List<Map<String, Object>> selectMaps(@Param(Constants.WRAPPER) Wrapper<T> queryWrapper);

// 根据 Wrapper 条件,查询全部记录。注意: 只返回第一个字段的值

List<Object> selectObjs(@Param(Constants.WRAPPER) Wrapper<T> queryWrapper);

// 根据 entity 条件,查询全部记录(并翻页)

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);

|类型

|参数名

|描述|

|Serializable

|id|

主键 ID|

|Wrapper<T>

|queryWrapper|

实体对象封装操作类(可以为 null)|

|Collection<? extends Serializable>

|idList

|主键 ID 列表(不能为 null 以及 empty)|

|Map<String, Object>

|columnMap|

表字段 map 对象|

|IPage<T>

|page

|分页查询条件(可以为 RowBounds.DEFAULT)|

测试代码:

@SpringBootTest

public class MyBatisPlusTest {

    @Autowired

    private UserMapper userMapper;

    @Test

    public void test1(){

        User user = new User();

        user.setAge(88);

        user.setName("Jerry2");

        user.setEmail("test6@baomidou.com");

        int i = userMapper.insert(user);

        System.out.println("i = " + i);

    }

    @Test

    public void test2(){

        //根据id删除

        int i = userMapper.deleteById(6);

        System.out.println("i = " + i);

        //根据age=88 name=Jerry2删除

        HashMap map = new HashMap();

        map.put("age",88);

        map.put("name","Jerry2");

        int i1 = userMapper.deleteByMap(map);

        System.out.println("i1 = " + i1);

        //userMapper.delete(wrapper)

        //wrapper是条件封装对象,内部可以无限的封装条件

    }

    @Test

    public void test3(){

        //根据主键修改:updatebyId()传入的对象id必须又值

        // 将id=1的age改0为30

        User user = new User();

        user.setId(1L);

        user.setAge(30);

        int i = userMapper.updateById(user);

        System.out.println("i = " + i);

        //update() 传入对象可以没有id值

        //将所有人的年龄改为22

        User user1 = new User();

        user1.setAge(22);

        int update = userMapper.update(user1, null);//null代表每=没条件

        System.out.println("update = " + update);

    }

    @Test

    public void test4(){

        //通过id查询数据

        User user = userMapper.selectById(1);

        System.out.println("user = " + user);

        //根据ids集合查询

        List<Long> ids = new ArrayList<>();

        ids.add(1L);

        ids.add(2L);

        List list = userMapper.selectBatchIds(ids);

        System.out.println("list = " + list);

    }

}

 自定义与多表映射

mybatis-plus的默认mapperxml位置

mybatis-plus: # mybatis-plus的配置

  # 默认位置 private String[] mapperLocations = new String[]{"classpath*:/mapper/**/*.xml"};   

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

自定义mapper方法:

public interface UserMapper extends BaseMapper<User> {

    //正常自定义方法!

    //可以使用注解@Select或者mapper.xml实现

    List<User> queryAll();

}

基于mapper.xml实现:

<?xml version="1.0" encoding="UTF-8" ?>

<!DOCTYPE mapper

        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"

        "https://mybatis.org/dtd/mybatis-3-mapper.dtd">

<!-- namespace = 接口的全限定符 -->

<mapper namespace="com.atguigu.mapper.UserMapper">

   <select id="queryAll" resultType="user" >

       select * from user

   </select>

</mapper>

基于Service的crud增强

通用 Service CRUD 封装IService接口,进一步封装 CRUD 采用 `get 查询单行` `remove 删除` `list 查询集合` `page 分页` 前缀命名方式区分 `Mapper` 层避免混淆,

IService接口中提供了一般的crud的实现,一半没实现还是抽象方法,强制自定义实现另一半crud方法。

将另一半,没有实现的crud方法再ServiceImpl中实现了

对比Mapper接口CRUD区别:

- service添加了批量方法

- service层的方法自动添加事务

-mapper层重点是对单条数据的操作,而service层则增加了批量操作

步骤:

①实现IService接口

②继承ServiceImlp  ServiceImpl<实体类对应的Mapper接口, 实体类>

实现代码:

service接口

public interface UserService extends IService<User> {

}

service实现类

public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements UserService {

}

CRUD方法测试代码:

@SpringBootTestpublic class MyBatisPlusTest {@Autowiredprivate UserService userService;@Testpublic void test_save(){List<User> list = new ArrayList<>();User user = new User();user.setAge(18);user.setEmail("JJ");user.setName("驴蛋蛋");list.add(user);User user1 = new User();user1.setAge(18);user1.setEmail("JJ");user1.setName("狗剩子");list.add(user1);boolean b = userService.saveBatch(list);System.out.println("b = " + b);}@Testpublic void test_saveOrUpdate(){//如果id有值那么就修改;没有就插入User user = new User();user.setAge(18);user.setEmail("JJ");user.setName("驴蛋蛋22");boolean b = userService.saveOrUpdate(user);System.out.println("b = " + b);}@Testpublic void test_remove(){boolean b = userService.removeById(1907418896856911874L);System.out.println("b = " + b);}@Testpublic void tes_update(){User user = new User();user.setId(1L);user.setAge(18);user.setEmail("JJ");user.setName("驴蛋蛋22");boolean b = userService.updateById(user);System.out.println("b = " + b);}@Testpublic void test_getOrList(){User byId = userService.getById(1L);//get返回的是单个对象List<User> list = userService.list(null);//查询全部,返回是的集合}}

分页查询的使用

启动类:

@SpringBootApplication

@MapperScan("com.atguigu.mapper")

public class Main {

    public static void main(String[] args) {

        SpringApplication.run(Main.class,args);

    }

    /**

     * 将mybatis-plus插件导入到ioc容器步骤:

     * ①创建一个方法,在该方法中创建一个装所有插件的对象mybatisPlusInterceptor

     *          在方法中通过该对象添加想要的插件

     * ②返回该对象,同时将该对象加入到ioc容器中

     */

    //将mybatis-plus插件导入到ioc容器

    @Bean

    public MybatisPlusInterceptor plusInterceptor(){

        //创建一个mybatis-plus插件集合,所有的插件都集中在此(分页插件,乐观锁插件...)

        MybatisPlusInterceptor mybatisPlusInterceptor = new MybatisPlusInterceptor();

        mybatisPlusInterceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL));

        return mybatisPlusInterceptor;

    }

}

测试类:

@SpringBootTest

@MapperScan("com.atguigu.mapper")

public class MyBatisPlusTest {

    /**

     * 使用分页插件的步骤:

     * ①带入插件(在启动类中)

     * ②使用:

     *     创建一个page对象,传入页码数与页容量,

     *     mapper接口中有一个查询+分页的方法selectPage(page,查询条件)

     *     最后分页查询的结果会封装在page中

     *     通过page调用方法,可以获得当前页的数据,总页数,页容量...

     */

    @Autowired

    private UserMapper userMapper;

    @Test

    public void test_page(){

        //创建一个page对象,传入页码数与页容量

        Page<User> page = new Page<>(1, 3);

        //mapper接口中有一个查询+分页的方法----------selectPage(page,查询条件)

        userMapper.selectPage(page,null);

        //selectPage(page,查询条件)此方法调用后,会将结果封装到page中

        long current = page.getCurrent();//获取当前页码

        long size = page.getSize();//获取页容量

        List<User> records = page.getRecords();//获取当前页的数据

        long total = page.getTotal();//获取总条数

        System.out.println(records);

    }

}

分页添加到自定义方法

①在mapper接口中正常自定义方法

注意此方法的放回值类型一定是IPage<实体类>,且定包含一个参数 IPage<实体类> pagepage对象用于装当前的页码数与页容量,最后返回结果也会封装到page对象。

②最后在mapper.xml文件中编写对应的sql语句

代码举例:

mapper接口:

public interface UserMapper extends BaseMapper<User> {

    //定义一个根据年龄参数查询,并且分页的方法 age > xx

   /**

     * 因为分页查询的结果会封装回page,所以方法的返回值填IPage<实体类>

     *     方法的形参要有一个IPage<实体类>的page对象,用来装当前页数与页容量,封装结果

     */

    IPage<User> queryByAge(IPage<User> page,@Param("age") Integer age);

}

Mapper.xml文件

<mapper namespace="com.atguigu.mapper.UserMapper">

    <!-- 查询结果填集合的泛型 -->

    <select id="queryByAge" resultType="user">

        <!-- sql语句不能添加分号,后面要拼接分页sql -->

        select * from user where age > #{age}

    </select>

</mapper>

 条件构造器与queryWrapper体验

条件构造器继承结构:

Wrapper : 条件构造抽象类,最顶端父类

- AbstractWrapper : 用于查询条件封装,生成 sql 的 where 条件

    - QueryWrapper : 查询/删除条件封装

    - UpdateWrapper : 修改条件封装

    - AbstractLambdaWrapper : 使用Lambda 语法

        - LambdaQueryWrapper :用于Lambda语法使用的查询Wrapper

        - LambdaUpdateWrapper : Lambda 更新封装Wrapper

基于QueryWapper组装条件:

测试代码:

@SpringBootTest

@MapperScan("com.atguigu.mapper")

public class MybatisPlusQueryWrapperTest {

    @Autowired

    private UserMapper userMapper;

/** 包含某个字符条件,范围条件,不为空条件---------------------like(),between(),isNotNull()

 *     查询用户名包含a,年龄在2030之间,并且邮箱不为null的用户信息

 *     用queryWrapper实现:

 *         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)

 */

@Test

    public void test_01(){

        QueryWrapper<User> queryWrapper=new QueryWrapper<>();

        queryWrapper.like("name","a");

        queryWrapper.between("age",20,30);

        queryWrapper.isNotNull("email");

        //链式调用:

       // queryWrapper.like("name","a").between("age",20,30).isNotNull("email");

        List<User> users = userMapper.selectList(queryWrapper);

        System.out.println("users = " + users);

    }

    /**

     * 排序---------------orderByASC()

     * 按年龄降序查询用户,如果年龄相同则按id升序排列

     *  实现:

     *     SELECT id,username AS name,age,email,is_deleted FROM t_user WHERE

     *     is_deleted=0 ORDER BY age DESC,id ASC

     */

    @Test

    public void test_02(){

        QueryWrapper<User> queryWrapper = new QueryWrapper<>();

        queryWrapper.orderByDesc("age").orderByAsc("id");

        List<User> userList = userMapper.selectList(queryWrapper);

        System.out.println("userList = " + userList);

    }

    /**

     * or条件连接--------------------or()

     * 注意:多个条件之间默认用and拼接,想要使用or拼接,就调用or()

     *      or()第一个条件是or,其他的仍是and

     *  将年龄大于20并且用户名中包含有a或邮箱为null的用户信息修改

     *     UPDATE t_user SET age=?, email=? WHERE

     *     username LIKE ? AND age > ? OR email IS NULL)

     */

    /**

     * 查询指定列(默认查询所有列)-------------select(指定列)

     * //查询用户信息的nameage字段

     *     //SELECT name,age FROM t_user where id >1

     */

    @Test

    public void test_05(){

        QueryWrapper<User> queryWrapper = new QueryWrapper<>();

        queryWrapper.select("name","age");

        queryWrapper.gt("id",1L);

        List<User> users = userMapper.selectList(queryWrapper);

        System.out.println("users = " + users);

    }

    /**

     * condition判断组织条件:(实现动态语句)

     * 每个方法夺回==都会有一个boolean condition,允许我们的一位放一个比较表达式 ;true 则整个条件生效 false 则不生效

     * 要求:前端传入两个参数 name age

     * name不为空,作为条件-查询

     * age>18,做为条件,查询等于 age=

     */

    @Test

    public void test6(){

        QueryWrapper<User> queryWrapper = new QueryWrapper<>();

        String name="xx";

        Integer age=18;

        queryWrapper.eq(StringUtils.isNotBlank("name"),"name",name);

        queryWrapper.eq(age!=null&&age>18,"age",age);

        List<User> users = userMapper.selectList(queryWrapper);

        System.out.println("users = " + users);

    }

}

UpdateWrapper使用

@SpringBootTest

public class MyBatisPlusUpdateWrapperTest {

    @Autowired

    private UserMapper userMapper;

    /**

     * 使用queryWrapper修改值:

     * ①准备要修改的实体类数据

     * ②不能改为null

     * 使用UpdateWrapper

     * ①直接可以携带修改数据 set("列名","")

     * ②指定任意修改值

     */

    @Test

    public void test1(){

        UpdateWrapper<User> updateWrapper = new UpdateWrapper();

        updateWrapper.gt("age",20).like("name","a").or().isNull("email")

                .set("email",null)

                .set("age",90);

        int update = userMapper.update(null,updateWrapper);

        System.out.println("update = " + update);

    }

lambdaWrapper使用

LambdaQueryWrapperLambdaUpdateWrapper是对QueryWrapperUpdateWrapper的升级,增加了一个列名的提示:

我们可以使用lambda表达式来写列名,以防列名出现错误

lambda表达式回顾:

Lambda 表达式是 Java 8 引入的一种函数式编程特性,它提供了一种更简洁、更直观的方式来表示匿名函数或函数式接口的实现。Lambda 表达式可以用于简化代码,提高代码的可读性和可维护性。

Lambda 表达式的语法可以分为以下几个部分:

1 参数列表: 参数列表用小括号 () 括起来,可以指定零个或多个参数。如果没有参数,可以省略小括号;如果只有一个参数,可以省略小括号。

例如:(a, b), x ->, () ->

2 箭头符号: 箭头符号 -> 分割参数列表和 Lambda 表达式的主体部分。

3 Lambda 表达式的主体: Lambda 表达式的主体部分可以是一个表达式或一个代码块。如果是一个表达式,可以省略 return 关键字;如果是多条语句的代码块,需要使用大括号 {} 括起来,并且需要明确指定 return 关键字。

例如:单个表达式:x -> x * x

代码块:(x, y) -> { int sum = x + y; return sum; }

方法引用回顾:

方法引用是 Java 8 中引入的一种语法特性,它提供了一种简洁的方式来直接引用已有的方法或构造函数。方法引用可以替代 Lambda 表达式,使代码更简洁、更易读。

1 静态方法引用: 引用静态方法,语法为 类名::静态方法名。

2 实例方法引用: 引用实例方法,语法为 实例对象::实例方法名。

3 对象方法引用: 引用特定对象的实例方法,语法为 类名::实例方法名。

4 构造函数引用: 引用构造函数,语法为 类名::new

具体使用:

总结:"列名"=类名::getXXX

@SpringBootTest

public class MyBatisPlusLambdaQueryWrapperTest {

    @Autowired

    private UserMapper userMapper;

    @Test

    public void test_01(){

        QueryWrapper<User> queryWrapper=new QueryWrapper<>();

        queryWrapper.like("name","a");

        queryWrapper.between("age",20,30);

        queryWrapper.isNotNull("email");

        //lambdaQueryWrapper

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

        wrapper.like(User::getName,"a")

                .between(User::getAge,20,30)

                .isNotNull(User::getEmail);

        List<User> users = userMapper.selectList(wrapper);

        System.out.println("users = " + users);

    }

}

相关文章:

MyBatis-plus笔记 (上)

简介 [MyBatis-Plus]&#xff08;简称 MP&#xff09;是一个 [MyBatis]的增强工具&#xff0c;在 MyBatis 的基础上只做增强不做改变&#xff0c;为简化开发、提高效率而生。 mybatis-plus总结&#xff1a; 注意&#xff1a;mybatis-puls仅局限于单表操作。 自动生成单表的C…...

大模型微调数据集怎么搞?基于easydataset实现文档转换问答对json数据集!

微调的难点之一在与数据集。本文介绍一种将文档转换为问答数据集的方法&#xff0c;超级快&#xff01; 上图左侧是我的原文档&#xff0c;右侧是我基于文档生成的数据集。 原理是通过将文档片段发送给ollama本地模型&#xff0c;然后本地模型生成有关问题&#xff0c;并基于文…...

opencv 灰度实验

opencv 灰度实验 1. 最大值法2. 平均值法3. 加权均值法4(直接读取灰度图)cv2.IMREAD_GRAYSCALE5内置将原图转换为灰度图cv2.cvtColor()6 两个极端的灰度值 灰度图与彩色图最大的不同就是&#xff1a;彩色图是由R、G、B三个通道组成&#xff0c;而灰度图只有一个通道&#xff0c…...

安卓基础(无障碍)

配置无障碍服务 在 res/xml 目录下创建一个 accessibility_service_config.xml 文件&#xff0c;用于配置无障碍服务的相关信息&#xff0c;例如要监听的事件类型、反馈类型等。 <?xml version"1.0" encoding"utf-8"?> <!-- 这行代码告诉电脑…...

解决在linux下运行rust/tauri项目出现窗口有内容,但是渲染出来成纯黑问题

起因 最近折腾了一下rust/tauri程序开发&#xff0c;据说这玩意性能非常牛皮就玩了一下&#xff0c;但是我运行打包一直出现一个奇怪问题&#xff0c;窗口能正常打开&#xff0c;但是是纯黑的什么内容都没有&#xff0c;鼠标移上去又发现指针会变换&#xff08;看起来是内容又…...

高性能内存kv数据库Redis(续)

目录 四.主从同步与对象模型 1.Redis 淘汰策略 2.Redis 如何做到 持久化 2.1 redis为什么要实现持久化 2.2fork进程的写时复制机制 2.3大Key的影响 2.4redis做持久化的方式 2.5 aof 2.6 rdb 2.7 redis 持久化方式的优缺点 3.redis里面的高可用体现在哪里&#xff1f; 3.1r…...

从0到1构建企业级消息系统服务体系(一):产品架构视角下的高并发设计与动态响应能力建设

从0到1构建企业级消息系统服务体系&#xff08;一&#xff09;&#xff1a;产品架构视角下的高并发设计与动态响应能力建设 | 从今天开始将持续更新此专题下的文章&#xff0c;讲述从产品角度是如何从0-1的构建一个企业级的消息系统&#xff0c;从系统架构设计、产品架构设计&…...

ElasticSearch中常用的数据类型

一、映射 Elasticsearch中通过映射来指定字段的数据类型&#xff0c;映射方式有2种&#xff0c;静态映射和动态映射。 1.动态映射 使用动态映射时&#xff0c;无须指定字段的数据类型&#xff0c;Elasticshearch会自动根据字段内容来判断映射到哪个数据类型。 比如&#xff…...

【go】--编译

go build -o [编译完成的可执行文件] [需要编译的.go文件]#例如 go build -o myapp main.go#确保编译的结果和当前运行环境相同 #查看arch uname -a在 Linux 中查看和修改 GOOS 和 GOARCH 环境变量&#xff1a; 1. 查看当前 Go 环境变量 # 查看所有Go相关的环境变量 go env# …...

【指纹浏览器系列-chromium编译】

本文提供了一步一步的指导来帮助读者在Windows环境下成功编译Chromium浏览器。涵盖了系统需求、开发环境搭建、代码下载及构建等关键步骤。 官方编译文档&#xff1a;https://github.com/chromium/chromium/blob/main/docs/windows_build_instructions.md 一、系统要求 一台…...

Docker华为云创建私人镜像仓库

Docker华为云创建私人镜像仓库 在华为云官网的 产品 中搜索 容器镜像服务 &#xff1a; 或者在其他页面的搜索栏中搜索 容器镜像服务 &#xff1a; 进入到页面后&#xff0c;点击 创建组织 &#xff08;华为云的镜像仓库称为组织&#xff09;&#xff1a; 设置组织名字后&…...

Ubuntu 22.04安装MySQL : Qwen2.5 模型对话数据收集与微调教程

在Ubuntu 22.04安装MySQL的教程请点击下方链接进行参考: 点击这里获取MySQL安装教程 今天将为大家带来如何微调Qwen2.5模型并连接数据库进行对话的教程。快跟着小编一起试试吧~ ​ 1 大模型 Qwen2.5 微调步骤 1.1 从 github 仓库 克隆项目 克隆存储库:#拉取代码 git clo…...

关于 JDK 中的 jce.jar 的详解,以及与之功能类似的主流加解密工具的详细对比分析

以下是关于 JDK 中的 jce.jar 的详细解析&#xff0c;涵盖其作用、内容、历史背景及使用注意事项&#xff1a; 一、jce.jar 的核心作用 jce.jar 是 Java Cryptography Extension (JCE) 的核心实现库&#xff0c;提供 加密算法支持&#xff0c;包括&#xff1a; 对称加密&…...

React 更新state中的对象

更新 state 中的对象 state 中可以保存任意类型的 JavaScript 值&#xff0c;包括对象。但是&#xff0c;你不应该直接修改存放在 React state 中的对象。相反&#xff0c;当你想要更新一个对象时&#xff0c;你需要创建一个新的对象&#xff08;或者将其拷贝一份&#xff09;…...

【嵌入式八股4】C++:引用、模板、哈希表与 I/O

1. 左值引用与右值引用 左值与右值的定义 左值&#xff1a;指那些可以在表达式后取得地址的对象。换句话说&#xff0c;左值代表一个可以出现在赋值号&#xff08;&#xff09;左边的值&#xff0c;也可以被修改。例如&#xff0c;变量、数组元素、以及通过引用或指针访问的对…...

算法思想之模拟

欢迎拜访&#xff1a;雾里看山-CSDN博客 本篇主题&#xff1a;算法思想之模拟 发布时间&#xff1a;2025.4.14 隶属专栏&#xff1a;算法 目录 算法介绍核心特点常见问题优化方向 例题替换所有的问号题目链接题目描述算法思路代码实现 提莫攻击题目链接题目描述算法思路代码实现…...

测试基础笔记第四天(html)

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 html介绍1. 介绍2.骨架标签3.常用标签标题标签段落标签超链接标签图片标签换行和空格标签布局标签input标签&#xff08;变形金刚&#xff09;form标签列表标签 htm…...

WPF 中的元素继承层次结构 ,以下是对图中内容的详细说明:

顶层基类 DispatcherObject&#xff1a;处于继承体系最顶端&#xff0c;是一个抽象类。它为 WPF 元素提供了与 Dispatcher&#xff08;调度器&#xff09;交互的能力&#xff0c;Dispatcher 负责管理线程间的消息传递&#xff0c;确保 UI 操作在正确的线程&#xff08;通常是 …...

十九、UDP编程和IO多路复用

1、UDP编程 服务端&#xff1a; #include<stdio.h> #include <arpa/inet.h> #include<stdlib.h> #include<string.h> #include <sys/types.h> /* See NOTES */ #include <sys/socket.h> #include <pthread.h> #include &l…...

DeepSeek使用001:Word中配置DeepSeek AI的V3和R1模型

文章目录 Word中配置DeepSeek大模型1、勾选开发工具2、信任中心设置3、添加DeepSeek-V3模型4、获取API KEY5、添加DeepSeek-R1模型6、新建组7、测试使用 Word中配置DeepSeek大模型 1、勾选开发工具 打开【选项】 选择【自定义功能区】 2、信任中心设置 打开【信任中心】&…...

linux tracepoint系列宏定义(TRACE_EVENT,DEFINE_TRACE等)展开过程分析之三 define_trace.h头文件

在linux tracepoint系列宏定义(TRACE_EVENT,DEFINE_TRACE等)展开过程分析之二 文章中&#xff0c;我们知道trace-events-sample.h 文件在包含了tracepoint.h后第一次对TRACE_EVENT(...)等系列宏定义进行了展开,主要是构建tracepoint 调用钩子函数,注册/注销函数。展开的第二阶段…...

TDengine 与其他时序数据库对比:InfluxDB/TimescaleDB 选型指南(二)

四、应用场景分析 &#xff08;一&#xff09;TDengine 适用场景 TDengine 适用于对写入性能和存储效率要求极高的物联网设备数据采集场景。在一个拥有数百万个传感器的智能工厂中&#xff0c;每个传感器每秒都会产生多条数据&#xff0c;TDengine 能够高效地处理这些高并发的…...

华为OD机试真题——攀登者2(2025A卷:200分)Java/python/JavaScript/C++/C语言/GO六种最佳实现

2025 A卷 200分 题型 本文涵盖详细的问题分析、解题思路、代码实现、代码详解、测试用例以及综合分析&#xff1b; 并提供Java、python、JavaScript、C、C语言、GO六种语言的最佳实现方式&#xff01; 华为OD机试真题《攀登者2》&#xff1a; 目录 题目名称&#xff1a;攀登者2…...

Windows卸载重装Docker

卸载 删除C:\Program Files\Docker &#xff0c;如果更改了路径的就找到相关位置进行删除 删除 C:\Users\<用户名>\.docker 清理注册表&#xff0c;不然重装会报错 Exising installation is up to date 按下WindowR唤起命令输入界面&#xff0c;输入regedit打开注…...

JVM 为什么需要即时编译器?

JVM之所以需要即时编译器 (JIT Compiler)&#xff0c;是为了提高 Java 程序的执行性能&#xff0c;弥补纯解释器执行的不足。 我们可以从以下几个角度来分析一下这个问题&#xff1a; 1. 解释器的性能瓶颈: 逐条解释的开销: 解释器需要逐条读取 Java 字节码指令&#xff0c;并…...

双目视觉中矩阵等参数说明及矫正

以下是标定文件中各个参数的详细解释&#xff1a; 1. 图像尺寸 (imageSize) 参数值: [1280, 1024]含义: 相机的图像分辨率&#xff0c;宽度为1280像素&#xff0c;高度为1024像素。 2. 相机内参矩阵 (leftCameraMatrix / rightCameraMatrix) 结构: yaml data: [fx, 0, cx, 0,…...

Android Compose 框架的列表与集合模块之滑动删除与拖拽深入分析(四十八)

Android Compose 框架的列表与集合模块之滑动删除与拖拽深入分析 一、引言 本人掘金号&#xff0c;欢迎点击关注&#xff1a;https://juejin.cn/user/4406498335701950 1.1 Android Compose 简介 在 Android 开发领域&#xff0c;界面的交互性和用户体验至关重要。传统的 A…...

一、LLM 大语言模型初窥:起源、概念与核心原理

一、初识大模型 1.1 人工智能演进与大模型兴起:从A11.0到A12.0的变迁 AI 1.0时代&#xff08;2012-2022年&#xff09; 感知智能的突破&#xff1a;以卷积神经网络&#xff08;CNN&#xff09;为核心&#xff0c;AI在图像识别、语音处理等感知任务中超越人类水平。例如&#…...

PyTorch核心函数详解:gather与where的实战指南

PyTorch中的torch.gather和torch.where是处理张量数据的关键工具&#xff0c;前者实现基于索引的灵活数据提取&#xff0c;后者完成条件筛选与动态生成。本文通过典型应用场景和代码演示&#xff0c;深入解析两者的工作原理及使用技巧&#xff0c;帮助开发者提升数据处理的灵活…...

《Operating System Concepts》阅读笔记:p636-p666

《Operating System Concepts》学习第 58 天&#xff0c;p636-p666 总结&#xff0c;总计 31 页。 一、技术总结 1.system and network threats (1)attack network traffic (2)denial of service (3)port scanning 2.symmetric/asymmetric encryption algorithm (1)symm…...