spring整合mybatis的核心思路(数据源切换)

news2024/9/20 6:38:00

文章目录

    • 1. 整合思路
    • 2. 最简单的整合步骤
      • 1. 导入依赖
      • 2. 准备基础类
        • User
        • UserMapper
        • userMapper.xml
        • MybatisConfig
      • 3. 测试
        • TestMybatisSpring
    • 3. 整合多个mybatis配置
      • 1. 修改MybatisConfig
      • 2. 测试
        • TestMybatisSpring
    • 4. AbstractRoutingDataSource实现源切换
      • 1. 准备基础类
        • Person
        • PersonMapper
        • CustomizeRoutingDataSource
      • 2. 修改MyBatisConfig
      • 3. 测试
        • TestMybatisSpring
    • 5. mybatis插件实现切换数据源
      • 1. DsPlugin
      • 2. 修改MybatisConfig
      • 3.测试
        • TestMybatisSpring

1. 整合思路

@MapperScan注解 -> 引入了MapperScannerRegistrar注册器 -> 该注册器向容器中MapperScannerConfigurer这个configurer是个BeanDefinitionRegistryPostProcessor,它在重写的postProcessBeanDefinitionRegistry方法中使用了ClassPathMapperScanner来扫描指定的包中的mapper接口 -> ClassPathMapperScanner(如果未指定sqlSessionTemplateBeanName,也没有指定sqlSessionFactoryBeanName,将会设置按类型自动注入SqlSessionFactory和SqlSessionTemplate(实现了SqlSession接口,委托给SqlSessionInterceptor,即每次调用SqlSession中的任何方法都会走SqlSessionInterceptor#invoke方法,这是为了控制事务),仅须其中一个即可) -> 扫包中的每一个beanDefinition都会设置beanClass为MapperFactoryBean,而MapperFactoryBean#getObject方法就会获取sqlSessionTemplate(它实现了SqlSession接口),并调用sqlSessionTemplate.getMapper(接口类)方法,来获取动态代理 -> 而每次使用动态代理的方法都会调用sqlSessionTemplate -> 而sqlSessionTemplate则也会委托给SqlSessionInterceptor-> 此时去从SqlSessionFactory获取sqlSession

2. 最简单的整合步骤

在这里插入图片描述

1. 导入依赖

<?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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.zzhua</groupId>
    <artifactId>mybatis-spring-demo</artifactId>
    <version>1.0-SNAPSHOT</version>

    <dependencies>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context</artifactId>
            <version>5.0.2.RELEASE</version>
        </dependency>

        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-jdbc</artifactId>
            <version>5.0.2.RELEASE</version>
        </dependency>

        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis</artifactId>
            <version>3.5.2</version>
        </dependency>

        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis-spring</artifactId>
            <version>2.0.7</version>
        </dependency>

        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>8.0.17</version>
        </dependency>



        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>1.18.16</version>
        </dependency>

    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.6.0</version>
                <configuration>
                    <source>1.8</source>
                    <target>1.8</target>
                </configuration>
            </plugin>

        </plugins>
    </build>


</project>

2. 准备基础类

User

@Data
public class User {

    private String userAccount;

}

UserMapper

public interface UserMapper {

    List<User> findAll();

    @Select("select * from `user` u where u.user_account = #{userAccount}")
    User findOne(String userAccount);

}

userMapper.xml

<?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.zzhua.mapper.UserMapper">

   <select id="findAll" resultType="user">
       select * from `user`
   </select>


</mapper>

MybatisConfig

package com.zzhua.config;

import org.apache.ibatis.session.ExecutorType;
import org.apache.ibatis.session.SqlSessionFactory;
import org.mybatis.spring.SqlSessionFactoryBean;
import org.mybatis.spring.SqlSessionTemplate;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.io.support.PathMatchingResourcePatternResolver;
import org.springframework.jdbc.datasource.DriverManagerDataSource;

import java.io.IOException;

@Configuration
@MapperScan(basePackages = "com.zzhua.mapper")
public class MybatisConfig {

    @Bean // 如果不配置该bean,将会抛出Caused by: java.lang.IllegalArgumentException: Property 'sqlSessionFactory' or 'sqlSessionTemplate' are required异常
    public SqlSessionFactoryBean sqlSessionFactoryBean() throws IOException { // 代码写法可参考SqlSessionFactoryBean#afterPropertiesSet

        SqlSessionFactoryBean sqlSessionFactoryBean = new SqlSessionFactoryBean();

        // 设置数据源
        DriverManagerDataSource driverManagerDataSource = new DriverManagerDataSource();
        driverManagerDataSource.setUrl("jdbc:mysql://127.0.0.1/user?serverTimezone=Asia/Shanghai&useUnicode=true&characterEncoding=utf-8&zeroDateTimeBehavior=convertToNull&useSSL=false&allowPublicKeyRetrieval=true");
        driverManagerDataSource.setDriverClassName("com.mysql.cj.jdbc.Driver");
        driverManagerDataSource.setUsername("root");
        driverManagerDataSource.setPassword("root");
        sqlSessionFactoryBean.setDataSource(driverManagerDataSource);

        // 自定义Configuration
        org.apache.ibatis.session.Configuration configuration = new org.apache.ibatis.session.Configuration();
        configuration.setMapUnderscoreToCamelCase(true);
        configuration.getTypeAliasRegistry().registerAliases("com.zzhua.pojo");
        sqlSessionFactoryBean.setConfiguration(configuration);

        // 指定mapper.xml文件
        PathMatchingResourcePatternResolver resourcePatternResolver = new PathMatchingResourcePatternResolver();
        sqlSessionFactoryBean.setMapperLocations(resourcePatternResolver.getResources("classpath:com/zzhua/mapper/**.xml"));

        return sqlSessionFactoryBean; // # 之后会调用SqlSessionFactoryBean#afterPropertiesSet()方法
    }

    @Bean
    public SqlSessionTemplate sqlSessionTemplate(SqlSessionFactory sqlSessionFactory) {
        return new SqlSessionTemplate(sqlSessionFactory, ExecutorType.BATCH);
    }

}

3. 测试

TestMybatisSpring

public class TestMybatisSpring {
    public static void main(String[] args) {

        AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(MybatisConfig.class);

        UserMapper userMapper = context.getBean(UserMapper.class);

        List<User> userList = userMapper.findAll();
        System.out.println(userList);

        User user = userMapper.findOne("zzhua");
        System.out.println(user);


    }
}

3. 整合多个mybatis配置

创建2个数据库,一个user库(里面有一张user表)和user2库(里面有一张user2表)。现在需要使用mybatis来操作这2个库中的表。
在这里插入图片描述

1. 修改MybatisConfig

@Configuration
@MapperScan(basePackages = "com.zzhua.dao.mapper", sqlSessionFactoryRef = "sqlSessionFactoryBean")
public class MybatisConfig {

    @Bean // 如果不配置该bean,将会抛出Caused by: java.lang.IllegalArgumentException: Property 'sqlSessionFactory' or 'sqlSessionTemplate' are required异常
    public SqlSessionFactoryBean sqlSessionFactoryBean() throws IOException { // 代码写法可参考SqlSessionFactoryBean#afterPropertiesSet

        SqlSessionFactoryBean sqlSessionFactoryBean = new SqlSessionFactoryBean();

        // 设置数据源
        DriverManagerDataSource driverManagerDataSource = new DriverManagerDataSource();
        driverManagerDataSource.setUrl("jdbc:mysql://127.0.0.1/user?serverTimezone=Asia/Shanghai&useUnicode=true&characterEncoding=utf-8&zeroDateTimeBehavior=convertToNull&useSSL=false&allowPublicKeyRetrieval=true");
        driverManagerDataSource.setDriverClassName("com.mysql.cj.jdbc.Driver");
        driverManagerDataSource.setUsername("root");
        driverManagerDataSource.setPassword("root");
        sqlSessionFactoryBean.setDataSource(driverManagerDataSource);

        // 自定义Configuration
        org.apache.ibatis.session.Configuration configuration = new org.apache.ibatis.session.Configuration();
        configuration.setMapUnderscoreToCamelCase(true);
        configuration.getTypeAliasRegistry().registerAliases("com.zzhua.pojo");
        sqlSessionFactoryBean.setConfiguration(configuration);

        // 指定mapper.xml文件
        PathMatchingResourcePatternResolver resourcePatternResolver = new PathMatchingResourcePatternResolver();
        sqlSessionFactoryBean.setMapperLocations(resourcePatternResolver.getResources("classpath:com/zzhua/mapper/**.xml"));

        return sqlSessionFactoryBean; // # 之后会调用SqlSessionFactoryBean#afterPropertiesSet()方法
    }

    @Configuration
    @MapperScan(basePackages = "com.zzhua.dao.mapper2", sqlSessionFactoryRef = "sqlSessionFactoryBean2")
    public static class MybatisConfig2 {

        @Bean
        // 如果不配置该bean,将会抛出Caused by: java.lang.IllegalArgumentException: Property 'sqlSessionFactory' or 'sqlSessionTemplate' are required异常
        public SqlSessionFactoryBean sqlSessionFactoryBean2() throws IOException { // 代码写法可参考SqlSessionFactoryBean#afterPropertiesSet

            SqlSessionFactoryBean sqlSessionFactoryBean = new SqlSessionFactoryBean();

            // 设置数据源
            DriverManagerDataSource driverManagerDataSource = new DriverManagerDataSource();
            driverManagerDataSource.setUrl("jdbc:mysql://127.0.0.1/user2?serverTimezone=Asia/Shanghai&useUnicode=true&characterEncoding=utf-8&zeroDateTimeBehavior=convertToNull&useSSL=false&allowPublicKeyRetrieval=true");
            driverManagerDataSource.setDriverClassName("com.mysql.cj.jdbc.Driver");
            driverManagerDataSource.setUsername("root");
            driverManagerDataSource.setPassword("root");
            sqlSessionFactoryBean.setDataSource(driverManagerDataSource);

            // 自定义Configuration
            org.apache.ibatis.session.Configuration configuration = new org.apache.ibatis.session.Configuration();
            configuration.setMapUnderscoreToCamelCase(true);
            configuration.getTypeAliasRegistry().registerAliases("com.zzhua.pojo");
            sqlSessionFactoryBean.setConfiguration(configuration);

            // 指定mapper.xml文件
            PathMatchingResourcePatternResolver resourcePatternResolver = new PathMatchingResourcePatternResolver();
            sqlSessionFactoryBean.setMapperLocations(resourcePatternResolver.getResources("classpath:com/zzhua/mapper2/**.xml"));

            return sqlSessionFactoryBean; // # 之后会调用SqlSessionFactoryBean#afterPropertiesSet()方法
        }
    }

}

2. 测试

TestMybatisSpring

public class TestMybatisSpring {
    public static void main(String[] args) {

        AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(MybatisConfig.class);

        UserMapper userMapper = context.getBean(UserMapper.class);

        List<User> userList = userMapper.findAll();
        System.out.println(userList);

        User user = userMapper.findOne("zzhua");
        System.out.println(user);

        System.out.println("--------------");

        UserMapper2 userMapper2 = context.getBean(UserMapper2.class);
        List<User2> userList2 = userMapper2.findAll2();
        System.out.println(userList2);

        User2 user2 = userMapper2.findOne2("zzhua2");
        System.out.println(user2);

    }
}

4. AbstractRoutingDataSource实现源切换

在user库中新建一张person表

1. 准备基础类

Person

@Data
public class Person {

    private String name;

}

PersonMapper

public interface PersonMapper {

    @Insert("insert into person values(#{name} )")
    void addPerson(String name);

    @Select("select * from person")
    List<Person> getPersons();

}

CustomizeRoutingDataSource

public class CustomizeRoutingDataSource extends AbstractRoutingDataSource {

    private static final ThreadLocal<String> DS_KEY = new ThreadLocal<>();

    @Override
    protected Object determineCurrentLookupKey() {
        return DS_KEY.get();
    }

    public static void setDsKey(String dsKey) {
        DS_KEY.set(dsKey);
    }

    public static void clearDsKey() {
        DS_KEY.remove();
    }

}

2. 修改MyBatisConfig

@Configuration
@MapperScan(basePackages = "com.zzhua.dao.mapper", sqlSessionFactoryRef = "sqlSessionFactoryBean")
public class MybatisConfig {

    @Bean
    public DataSource userDataSource() {
        DriverManagerDataSource driverManagerDataSource = new DriverManagerDataSource();
        driverManagerDataSource.setUrl("jdbc:mysql://127.0.0.1/user?serverTimezone=Asia/Shanghai&useUnicode=true&characterEncoding=utf-8&zeroDateTimeBehavior=convertToNull&useSSL=false&allowPublicKeyRetrieval=true");
        driverManagerDataSource.setDriverClassName("com.mysql.cj.jdbc.Driver");
        driverManagerDataSource.setUsername("root");
        driverManagerDataSource.setPassword("root");
        return driverManagerDataSource;
    }

    @Bean
    public DataSource user2DataSource() {
        DriverManagerDataSource driverManagerDataSource = new DriverManagerDataSource();
        driverManagerDataSource.setUrl("jdbc:mysql://127.0.0.1/user2?serverTimezone=Asia/Shanghai&useUnicode=true&characterEncoding=utf-8&zeroDateTimeBehavior=convertToNull&useSSL=false&allowPublicKeyRetrieval=true");
        driverManagerDataSource.setDriverClassName("com.mysql.cj.jdbc.Driver");
        driverManagerDataSource.setUsername("root");
        driverManagerDataSource.setPassword("root");
        return driverManagerDataSource;
    }

    @Primary
    @Bean
    public DataSource primaryDataSource() {
    
        CustomizeRoutingDataSource routingDataSource = new CustomizeRoutingDataSource();

        // 指定默认数据源
        routingDataSource.setDefaultTargetDataSource(userDataSource());

        // 指定 标识->数据源 的map
        HashMap<Object, Object> dsMap = new HashMap<>();
        dsMap.put("user", userDataSource());
        dsMap.put("user2", user2DataSource());
        routingDataSource.setTargetDataSources(dsMap);


        return routingDataSource;
    }

    @Bean // 如果不配置该bean,将会抛出Caused by: java.lang.IllegalArgumentException: Property 'sqlSessionFactory' or 'sqlSessionTemplate' are required异常
    public SqlSessionFactoryBean sqlSessionFactoryBean(DataSource primaryDataSource) throws IOException { // 代码写法可参考SqlSessionFactoryBean#afterPropertiesSet

        SqlSessionFactoryBean sqlSessionFactoryBean = new SqlSessionFactoryBean();

        // 设置数据源
        sqlSessionFactoryBean.setDataSource(primaryDataSource);

        // 自定义Configuration
        org.apache.ibatis.session.Configuration configuration = new org.apache.ibatis.session.Configuration();
        configuration.setMapUnderscoreToCamelCase(true);
        configuration.getTypeAliasRegistry().registerAliases("com.zzhua.pojo");
        sqlSessionFactoryBean.setConfiguration(configuration);

        // 指定mapper.xml文件
        PathMatchingResourcePatternResolver resourcePatternResolver = new PathMatchingResourcePatternResolver();
        sqlSessionFactoryBean.setMapperLocations(resourcePatternResolver.getResources("classpath:com/zzhua/mapper/**.xml"));

        return sqlSessionFactoryBean; // # 之后会调用SqlSessionFactoryBean#afterPropertiesSet()方法
    }

}

3. 测试

TestMybatisSpring

public class TestMybatisSpring {

    public static void main(String[] args) {

        AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(MybatisConfig.class);

        PersonMapper personMapper = context.getBean(PersonMapper.class);

        // 可使用注解 + AOP的方式简化代码, 在执行数据库操作之前设置所要操作的数据源标识

        CustomizeRoutingDataSource.setDsKey("user");
        personMapper.addPerson("zzhua");
        personMapper.addPerson("zj");
        List<Person> persons = personMapper.getPersons();
        System.out.println(persons);
        CustomizeRoutingDataSource.clearDsKey();


        CustomizeRoutingDataSource.setDsKey("user2");
        personMapper.addPerson("zzhua2");
        personMapper.addPerson("zj2");
        List<Person> persons2 = personMapper.getPersons();
        System.out.println(persons2);
        CustomizeRoutingDataSource.clearDsKey();

    }
}

5. mybatis插件实现切换数据源

在这里插入图片描述

1. DsPlugin

// Interceptor可拦截mybatis的四大对象中的方法
//      四大对象包括: Executor、StatementHandler、ParameterHandler、ResultSetHandler
@Intercepts({
    @Signature(
            type = Executor.class,
            method = "update",
            args = {MappedStatement.class, Object.class}
    ),
    @Signature(
            type = Executor.class,
            method = "query",
            args = {MappedStatement.class, Object.class, RowBounds.class, ResultHandler.class}
    )
})
public class DsPlugin implements Interceptor {
    @Override
    public Object intercept(Invocation invocation) throws Throwable {

        Object[] args = invocation.getArgs();

        MappedStatement ms = ((MappedStatement) args[0]);

        if (SqlCommandType.SELECT.equals(ms.getSqlCommandType())) {
            CustomizeRoutingDataSource.setDsKey("user");
        } else {
            CustomizeRoutingDataSource.setDsKey("user2");
        }

        Object result = invocation.proceed();
        CustomizeRoutingDataSource.clearDsKey();
        return result;
    }
}

2. 修改MybatisConfig

@Configuration
@MapperScan(basePackages = "com.zzhua.dao.mapper", sqlSessionFactoryRef = "sqlSessionFactoryBean")
public class MybatisConfig {

    @Bean
    public DataSource userDataSource() {
        DriverManagerDataSource driverManagerDataSource = new DriverManagerDataSource();
        driverManagerDataSource.setUrl("jdbc:mysql://127.0.0.1/user?serverTimezone=Asia/Shanghai&useUnicode=true&characterEncoding=utf-8&zeroDateTimeBehavior=convertToNull&useSSL=false&allowPublicKeyRetrieval=true");
        driverManagerDataSource.setDriverClassName("com.mysql.cj.jdbc.Driver");
        driverManagerDataSource.setUsername("root");
        driverManagerDataSource.setPassword("root");
        return driverManagerDataSource;
    }

    @Bean
    public DataSource user2DataSource() {
        DriverManagerDataSource driverManagerDataSource = new DriverManagerDataSource();
        driverManagerDataSource.setUrl("jdbc:mysql://127.0.0.1/user2?serverTimezone=Asia/Shanghai&useUnicode=true&characterEncoding=utf-8&zeroDateTimeBehavior=convertToNull&useSSL=false&allowPublicKeyRetrieval=true");
        driverManagerDataSource.setDriverClassName("com.mysql.cj.jdbc.Driver");
        driverManagerDataSource.setUsername("root");
        driverManagerDataSource.setPassword("root");
        return driverManagerDataSource;
    }

    @Primary
    @Bean
    public DataSource primaryDataSource() {
        CustomizeRoutingDataSource routingDataSource = new CustomizeRoutingDataSource();

        // 指定默认数据源
        routingDataSource.setDefaultTargetDataSource(userDataSource());

        // 指定 标识->数据源 的map
        HashMap<Object, Object> dsMap = new HashMap<>();
        dsMap.put("user", userDataSource());
        dsMap.put("user2", user2DataSource());
        routingDataSource.setTargetDataSources(dsMap);


        return routingDataSource;
    }

    @Bean // 如果不配置该bean,将会抛出Caused by: java.lang.IllegalArgumentException: Property 'sqlSessionFactory' or 'sqlSessionTemplate' are required异常
    public SqlSessionFactoryBean sqlSessionFactoryBean(DataSource primaryDataSource) throws IOException { // 代码写法可参考SqlSessionFactoryBean#afterPropertiesSet

        SqlSessionFactoryBean sqlSessionFactoryBean = new SqlSessionFactoryBean();

        // 设置数据源
        sqlSessionFactoryBean.setDataSource(primaryDataSource);

        // 自定义Configuration
        org.apache.ibatis.session.Configuration configuration = new org.apache.ibatis.session.Configuration();
        configuration.setMapUnderscoreToCamelCase(true);
        configuration.getTypeAliasRegistry().registerAliases("com.zzhua.pojo");

        // 添加插件
        configuration.addInterceptor(new DsPlugin());

        sqlSessionFactoryBean.setConfiguration(configuration);

        // 指定mapper.xml文件
        PathMatchingResourcePatternResolver resourcePatternResolver = new PathMatchingResourcePatternResolver();
        sqlSessionFactoryBean.setMapperLocations(resourcePatternResolver.getResources("classpath:com/zzhua/mapper/**.xml"));

        return sqlSessionFactoryBean; // # 之后会调用SqlSessionFactoryBean#afterPropertiesSet()方法
    }

}

3.测试

TestMybatisSpring

public class TestMybatisSpring {
    public static void main(String[] args) {

        AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(MybatisConfig.class);

        PersonMapper personMapper = context.getBean(PersonMapper.class);

        personMapper.addPerson("zzhua11");
        personMapper.addPerson("zj11");

        List<Person> persons = personMapper.getPersons();
        System.out.println(persons);
    }
}

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

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

相关文章

JVM的栈内存

每当启动一个新线程时&#xff0c;Java虚拟机都会为它分配一个Java栈。Java栈以帧为单位保存线程的运行状态。虚拟机只会直接对Java栈执行两种操作&#xff1a;以帧为单位的压栈和出栈。 某个线程正在执行的方法被称为该线程的当前方法&#xff0c;当前方法使用的栈帧称为当前帧…

车载以太网 - SomeIP测试 - 初识 - 01

SOA,Service-Oriented Architecture,即面向服务的架构 SOA是一种面向服务的架构,定义了“服务器”和“客户端”,前者是服务、数据的提供者,后者是订阅了所需要的服务或者数据。应用程序之间是公三耦合,并通过服务总线作为中间件进行通信。SOA更像是一种框架,需要将信息从…

【JavaGuide面试总结】Java集合篇·下

【JavaGuide面试总结】Java集合篇下1.HashMap 的长度为什么是 2 的幂次方2.HashMap 有哪几种常见的遍历方式?3.HashSet 如何检查重复?4.ConcurrentHashMap 和 Hashtable 的区别5.ConcurrentHashMap 线程安全的具体实现方式/底层具体实现JDK1.8 之前JDK1.8 之后6.JDK 1.7 和 J…

从零编写linux0.11 - 第九章 文件系统(一)

从零编写linux0.11 - 第九章 文件系统&#xff08;一&#xff09; 编程环境&#xff1a;Ubuntu 20.04、gcc-9.4.0 代码仓库&#xff1a;https://gitee.com/AprilSloan/linux0.11-project linux0.11源码下载&#xff08;不能直接编译&#xff0c;需进行修改&#xff09; 本章…

【青训营】Go的一些性能优化技巧

一、Slice切片的性能优化 对Slice进行内存预分配 尽可能在使用make()初始化函数的时候提供容量信息&#xff0c;因为切片本质是一个数组片段的描述&#xff0c;其源码如下&#xff1a; type slice struct{array unsafe.Pointerlen int// 长度cap int// 容量 }如果没有指定容…

22.1.28打卡 Codeforces Round #847 (Div. 3) A~E

https://codeforces.com/contest/1790A. Polycarp and the Day of Pi题意问你第一个和"314159265358979323846264338327"不同的字符串下标1是什么如果全部相同输出最后一个下标1/* ⣿⣿⣿⣿⣿⣿⡷⣯⢿⣿⣷⣻⢯⣿⡽⣻⢿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣇⠸⣿⣿⣆…

Python基于LSTM预测特斯拉股票

Python基于LSTM预测特斯拉股票 提示&#xff1a;前言 Python基于LSTM预测特斯拉股票 股票预测是指&#xff1a;对股市具有深刻了解的证券分析人员根据股票行情的发展进行的对未来股市发展方向以及涨跌程度的预测行为。这种预测行为只是基于假定的因素为既定的前提条件为基础的…

通用智能基础模型假说

🍿*★,*:.☆欢迎您/$:*.★* 🍿 https://dongfangyou.blog.csdn.net/article/details/128761358 通过上面说的 人本身自带一个 各种行为反馈的评价模型 拥有这个模型便可拥有通用智能 简单的分析一下该模型到底应该由什么组成 最基础的模型是什么 首先人类最基础的模型应该…

【小程序】类taro语法中小程序端使用f2

前言 最近在类taro框架中小程序端使用最新版f2。&#xff08;这里我使用rax&#xff09;并封装了库&#xff0c;特此记录一下。 使用 想直接用的同学直接在你的rax项目中安装rax-my-f2这个包&#xff0c;他依赖antv/f2与antv/f2-context这2个包。 import { MyCanvas } from…

Kubernetes 笔记(06)— 搭建多节点集群、kubeadm 安装 master/worker/console/flannel 网络插件

1. kubeadm 官网&#xff1a;https://kubernetes.io/zh-cn/docs/reference/setup-tools/kubeadm/ 为了简化 Kubernetes 的部署工作&#xff0c;社区里就出现了一个专门用来在集群中安装 Kubernetes 的工具&#xff0c;名字就叫 kubeadm&#xff0c;意思就是 Kubernetes 管理员…

Java设计模式-状态模式State

介绍 状态模式&#xff08;State Pattern&#xff09;&#xff1a;它主要用来解决对象在多种状态转换时&#xff0c;需要对外输出不同的行为的问题。状态和行为是一一对应的&#xff0c;状态之间可以相互转换。当一个对象的内在状态改变时&#xff0c;允许改变其行为&#xff…

学习记录677@项目管理之配置管理案例

案例 Simple公司的质量管理体系中的配置管理程序文件中有如下规定: (1)由变更控制委员会(CCB)制定项目的配置管理计划; (2)由配置管理员(CMO)创建配置管理环境: (3)由CCB 审核变更计划; (4)项目中配置基线的变更经过变更申请、变更评估、变更实施后便可发布&#xff1b; (5)CC…

Java基础10:常用API(下)

Java基础10&#xff1a;常用API&#xff08;下&#xff09;一、Date二、SimpleDateFormat三、Calendar四、ZoneId五、Instant六、ZoneDateTime七、DateTimeFormatter八、LocalDate、LocalTime、LocalDateTime九、Duration、Period、ChronoUnit十、包装类一、Date Date类是一个…

基于PIL和Tesseract的数字计算验证码识别处理思路

如图,我们在使用python自动化的时候经常会遇到很多各式各样的验证码。这个是一个数字加法的验证码。 干扰项里包含完整的数字、字母信息,普通的OCR识别可能不是很准确。 但是不管怎们样,咱们先把必要的环境搭建起来,试一下Tesseract的识别结果吧。 1、安装Tesseract: 首…

屏蔽360阻止运程执行变更注册表自启动数据的办法

屏蔽360阻止运程执行变更注册表自启动数据的办法 运程服务器上的程序&#xff0c;由于需要。我在服务器中&#xff0c;加入更新升级自身&#xff08;exe&#xff09;文件&#xff0c;并变更操作系统自启动数据的代码。 实践证明&#xff0c;通过客户端&#xff0c;调用运程服务…

全景解析SSD IO QoS性能优化

一、NAND基本原理目前NAND已经从SLC发展到PLC&#xff0c;但是PLC离大规模上市还有一段距离&#xff0c;我们暂时先略过。市面上主要流通的就是4种NAND类型&#xff1a;SLC、MLC、TLC、QLC。随着每个寿命从高到低依次是SLC>MLC>TLC>QLC.随着单个cell含有的bit数越多&a…

Unity MRTK使用详解(Htc vive+LeapMotion)

MRTK-Unity是一个由Microsoft驱动的开源项目&#xff0c;提供了多种组件和功能&#xff0c;用于加速Unity中的跨平台MR应用程序开发。以下是其一些功能&#xff1a; 提供跨平台输入系统和用于空间交互和UI组件。 启用快速原型通过在编辑器中的模拟&#xff0c;让你马上看到变化…

创建大量TCP连接时会受到什么因素的限制?

1.文件描述符资源 用户级限制 我们可以使用ulimit命令查看系统允许当前用户进程打开的文件数限制&#xff1a; ulimit -n 我们可以使用 ulimit -n 文件数 来修改不过这种设置是临时的&#xff0c;只在当前的session中有效。为永久修改用户级文件描述符数限制&#xff0c;可以…

SpringBoot框架介绍及使用

1. 概述 1.1 SpringBoot 简介 简化Spring应用开发的一个框架&#xff1b; 整个Spring技术栈的一个大整合&#xff1b; J2EE开发的一站式解决方案&#xff1b; 1.2 微服务 微服务&#xff1a;架构风格&#xff08;服务微化&#xff09; 一个应用应该是一组小型服务&#xff1b;…

【速记】离散分布的实现算法

离散分布与 zipf 分布 下面的一段代码&#xff0c;能根据数值描述来生成对应概率的离散值&#xff1a; #include <iostream> #include <iomanip> #include <map> #include <random>using namespace std;int main() {std::random_device rd;std::mt19…