JDK11+mybatis-plus+shardingsphere分库分表

news2024/12/22 9:20:35

1、引入jar
dynamic-datasource-spring-boot-starter:2.5.6
sharding-jdbc-spring-boot-starter:4.1.1

<dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>dynamic-datasource-spring-boot-starter</artifactId>
        </dependency>
        <!-- 分库分表-->
        <dependency>
            <groupId>org.apache.shardingsphere</groupId>
            <artifactId>sharding-jdbc-spring-boot-starter</artifactId>
            <exclusions>
                <exclusion>
                    <groupId>org.codehaus.groovy</groupId>
                    <artifactId>groovy</artifactId>
                </exclusion>
            </exclusions>
        </dependency>

        <dependency>
            <groupId>org.apache.shardingsphere</groupId>
            <artifactId>sharding-jdbc-spring-namespace</artifactId>
        </dependency>

        <dependency>
            <groupId>org.codehaus.groovy</groupId>
            <artifactId>groovy</artifactId>
        </dependency>

2、配置

#mysql数据库com.baomidou.dynamic.datasource.spring.boot.autoconfigure.hikari.HikariCpConfig(需要引入book-mysql.yml属性信息)
spring:
  datasource:
    dynamic:
      primary: collection
      datasource:
        collection:
          username: ENC(vZaezUSyvM1a75RjyRUpRZM/lASLKLbn)
          password: ENC(gzHe0K7Bdn0/C5fXvBkOhubOWiuQ9G8v)
          driver-class-name: com.mysql.cj.jdbc.Driver
          url: jdbc:mysql://10.0.0.63:3306/book_collection?useUnicode=true&characterEncoding=UTF-8&useSSL=false&allowMultiQueries=true&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=GMT%2b8 
  #分库分表配置
    #分库分表配置
  shardingsphere:
    datasource:
      names: sharding-collection
      sharding-collection:
        type: com.zaxxer.hikari.HikariDataSource
        driver-class-name: com.mysql.cj.jdbc.Driver
        jdbc-url: jdbc:mysql://10.0.0.63:3306/book_collection?useUnicode=true&characterEncoding=UTF-8&useSSL=false&allowMultiQueries=true&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=GMT%2b8 
        username: ENC(vZaezUSyvM1a75RjyRUpRZM/lASLKLbn)
        password: ENC(gzHe0K7Bdn0/C5fXvBkOhubOWiuQ9G8v)
  sharding:
    tables:
      # 章节名称表 分表:10
      c_book_chapter:
        # 真实表 c_book_chapter_0 - c_book_chapter_9
        actual-data-nodes: sharding-collection.c_book_chapter|_$->{0..9}
        # 分库策略
        database-strategy:
          none:
        # 分表策略
        table-strategy:
          inline:
            #分表字段
            sharding-column: id
            # 分片算法行表达式,需符合groovy语法 '& Integer.MAX_VALUE' 位运算使hash值为正数
            algorithm-expression: c_crawling_chapter_$->{(id.hashCode() & Integer.MAX_VALUE) % 10}
      # 章节名称表 分表:10
      c_book_chapter_content:
        # 真实表 c_book_chapter_content_0 - c_book_chapter_content_19
        actual-data-nodes: sharding-collection.c_book_chapter_content_$->{0..10}
        # 分库策略
        database-strategy:
          none:
        # 分表策略
        table-strategy:
          inline:
            #分表字段
            sharding-column: id
            # 分片算法行表达式,需符合groovy语法 '& Integer.MAX_VALUE' 位运算使hash值为正数
            algorithm-expression: c_book_chapter_content_$->{(id.hashCode() & Integer.MAX_VALUE) % 10} 

3、建表
在这里插入图片描述
4、把创建的DataSource加入动态数据源Map,让@DS可以获取ShardingDataSource

package com.book.shard.config;

import com.baomidou.dynamic.datasource.DynamicRoutingDataSource;
import com.baomidou.dynamic.datasource.provider.AbstractDataSourceProvider;
import com.baomidou.dynamic.datasource.provider.DynamicDataSourceProvider;
import com.baomidou.dynamic.datasource.spring.boot.autoconfigure.DataSourceProperty;
import com.baomidou.dynamic.datasource.spring.boot.autoconfigure.DynamicDataSourceAutoConfiguration;
import com.baomidou.dynamic.datasource.spring.boot.autoconfigure.DynamicDataSourceProperties;
import com.book.common.constant.Constant;
import com.zaxxer.hikari.HikariDataSource;
import org.apache.shardingsphere.shardingjdbc.jdbc.adapter.AbstractDataSourceAdapter;
import org.apache.shardingsphere.shardingjdbc.spring.boot.SpringBootConfiguration;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.boot.jdbc.metadata.DataSourcePoolMetadata;
import org.springframework.boot.jdbc.metadata.DataSourcePoolMetadataProvider;
import org.springframework.boot.jdbc.metadata.HikariDataSourcePoolMetadata;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;

import javax.annotation.Resource;
import javax.sql.DataSource;
import java.util.Map;

/**
 * Description:
 * <p>
 * 需要存在 spring.shardingsphere.datasource.names属性
 * </p>
 *
 * @Author: leo.xiong
 * @CreateDate: 2023/5/25 16:47
 * @Email: leo.xiong@suyun360.com
 * @Since:
 */
@Configuration(value = "shardingConfiguration")
public class ShardingConfig {
    /**
     * 测试SQL,默认使用Mysql
     */
    @Value("${spring.datasource.dynamic.hikari.connection-test-query:select 1}")
    private String testSql;
    /**
     * 动态数据源配置项
     */
    @Autowired
    private DynamicDataSourceProperties properties;
    /**
     * shardingjdbc有四种数据源,需要根据业务注入不同的数据源
     *
     * <p>1. 未使用分片, 脱敏的名称(默认): shardingDataSource;
     * <p>2. 主从数据源: masterSlaveDataSource;
     * <p>3. 脱敏数据源:encryptDataSource;
     * <p>4. 影子数据源:shadowDataSource
     * 实现 ${@link SpringBootConfiguration} 加载Bean对象
     */
    @Resource(name = Constant.BeanName.SHARDING_DATASOURCE)
    private AbstractDataSourceAdapter shardingDataSource;

    /**
     * 动态数据源Bean
     * {@link DynamicDataSourceAutoConfiguration}
     *
     * @return
     */
    @Bean
    public DynamicDataSourceProvider dynamicDataSourceProvider() {
        Map<String, DataSourceProperty> datasourceMap = properties.getDatasource();
        return new AbstractDataSourceProvider() {
            @Override
            public Map<String, DataSource> loadDataSources() {
                Map<String, DataSource> dataSourceMap = createDataSourceMap(datasourceMap);
                //把分库分表的数据源加入到动态数据源的map中,使之可以通过@DS(数据源名称加载)
                for (Map.Entry<String, DataSource> dataSourceEntry : shardingDataSource.getDataSourceMap().entrySet()) {
                    String key = dataSourceEntry.getKey();
                    dataSourceMap.put(key, shardingDataSource);
                }
                return dataSourceMap;
            }
        };
    }

    /**
     * 将动态数据源设置为首选的
     * 当spring存在多个数据源时, 自动注入的是首选的对象
     * 设置为主要的数据源之后,就可以支持shardingjdbc原生的配置方式了
     *
     * @return
     */
    @Primary
    @Bean
    public DataSource dataSource(DynamicDataSourceProvider dynamicDataSourceProvider) {
        DynamicRoutingDataSource dataSource = new DynamicRoutingDataSource();
        dataSource.setPrimary(properties.getPrimary());
        dataSource.setStrict(properties.getStrict());
        dataSource.setStrategy(properties.getStrategy());
        dataSource.setProvider(dynamicDataSourceProvider);
        dataSource.setP6spy(properties.getP6spy());
//        dataSource.setSeata(properties.getSeata());
        return dataSource;
    }

    /**
     * 新版Spring中,Spring数据源健康检查用到 sharding jdbc 时,该组件没有完全实现MySQL驱动导致的问题
     * 是由于 ShardingDataSource 内部是封装了真实数据源的,所以 ShardingDataSource 并不需要进行健康检查
     *
     * @return
     */
    @Bean
    @ConditionalOnProperty(prefix = "spring.shardingsphere.datasource", name = "names")
    DataSourcePoolMetadataProvider dataSourcePoolMetadataProvider() {
        return dataSource -> dataSource instanceof HikariDataSource
                // 这里如果所使用的数据源没有对应的 DataSourcePoolMetadata 实现的话也可以全部使用 NotAvailableDataSourcePoolMetadata
                ? new HikariDataSourcePoolMetadata((HikariDataSource) dataSource)
                : new NotAvailableDataSourcePoolMetadata(testSql);
    }

    /**
     * 不可用的数据源池元数据.
     */
    private static class NotAvailableDataSourcePoolMetadata implements DataSourcePoolMetadata {

        private String testSql;

        public NotAvailableDataSourcePoolMetadata(String testSql) {
            this.testSql = testSql;
        }

        @Override
        public Float getUsage() {
            return null;
        }

        @Override
        public Integer getActive() {
            return null;
        }

        @Override
        public Integer getMax() {
            return null;
        }

        @Override
        public Integer getMin() {
            return null;
        }

        @Override
        public String getValidationQuery() {
            return testSql;
        }

        @Override
        public Boolean getDefaultAutoCommit() {
            return null;
        }
    }
}

5、使用动态数据源指定分表数据源
在这里插入图片描述
6、调试
打开org.apache.shardingsphere.shardingjdbc.spring.boot.SpringBootConfiguration类,断点在,查看shardingRule规则是否正常加载,之后看代码是否正常启动
在这里插入图片描述
在这里插入图片描述
7、结果
在这里插入图片描述
8、总结:
1、先加载分库分表规则
2、根据@DS的值获取数据源,数据源就是配置的name,会作为map的key
3、获取指定的数据源后,会包装获取对应org.apache.shardingsphere.shardingjdbc.jdbc.core.connection.ShardingConnection
4、根据ShardingConnection.prepareStatement开始更换表信息;
5、根据数据库语言获取对应的解析,如MYSQL等;
6、开始根据规则进行路由到对应的节点,对应的数据库和表;
7、替换SQL;
8、执行SQL;

多种配置方式

#分库分表配置,找到对应的库对应的表
spring:
  main:
    allow-bean-definition-overriding: true
  shardingsphere:
    datasource:
      #数据库名称
      names: ds0,ds1
      ds0:
        driver-class-name: com.mysql.cj.jdbc.Driver
        type: com.zaxxer.hikari.HikariDataSource
        jdbc-url: jdbc:mysql://xxx:3300/edu_db_2?serverTimezone=UTC&useUnicode=true&characterEncoding=utf8&characterSetResults=utf8&useSSL=false&verifyServerCertificate=false&autoReconnct=true&autoReconnectForPools=true&allowMultiQueries=true
        password: root
        username: root
      ds1:
        driver-class-name: com.mysql.cj.jdbc.Driver
        type: com.zaxxer.hikari.HikariDataSource
        jdbc-url: jdbc:mysql://127.0.0.1:3306/edu_db_1?serverTimezone=UTC&useUnicode=true&characterEncoding=utf8&characterSetResults=utf8&useSSL=false&verifyServerCertificate=false&autoReconnct=true&autoReconnectForPools=true&allowMultiQueries=true
        password: root
        username: root
    #打印sql
    props:
      sql:
        show: true
    sharding:
      #分表
      tables:
        #数据分表规则
        #指定所需分的数据库和表的分布情况
        course:    #表前缀
          actual-data-nodes: ds$->{0..1}.course_$->{1..2}
          # 使用SNOWFLAKE算法生成主键
          key-generator:
            column: cid
            type: SNOWFLAKE
          table-strategy:
            inline:
              #分表规则
              algorithm-expression: course_$->{cid % 2 + 1}
              #指定主键
              sharding-column: cid
          #分库
          database-strategy:
            inline:
              algorithm-expression: ds$->{user_id % 2}
              sharding-column: user_id
			  
#垂直分库			  
spring:
  main:
    allow-bean-definition-overriding: true
  shardingsphere:
    datasource:
      #数据库名称
      names: ds0,ds1,ds2
      ds0:
        driver-class-name: com.mysql.cj.jdbc.Driver
        type: com.zaxxer.hikari.HikariDataSource
        jdbc-url: jdbc:mysql://8.131.119.145:3300/edu_db_2?serverTimezone=UTC&useUnicode=true&characterEncoding=utf8&characterSetResults=utf8&useSSL=false&verifyServerCertificate=false&autoReconnct=true&autoReconnectForPools=true&allowMultiQueries=true
        password: root
        username: root
      ds1:
        driver-class-name: com.mysql.cj.jdbc.Driver
        type: com.zaxxer.hikari.HikariDataSource
        jdbc-url: jdbc:mysql://127.0.0.1:3306/edu_db_1?serverTimezone=UTC&useUnicode=true&characterEncoding=utf8&characterSetResults=utf8&useSSL=false&verifyServerCertificate=false&autoReconnct=true&autoReconnectForPools=true&allowMultiQueries=true
        password: root
        username: root
      ds2:
        driver-class-name: com.mysql.cj.jdbc.Driver
        type: com.zaxxer.hikari.HikariDataSource
        jdbc-url: jdbc:mysql://127.0.0.1:3306/user_db?serverTimezone=UTC&useUnicode=true&characterEncoding=utf8&characterSetResults=utf8&useSSL=false&verifyServerCertificate=false&autoReconnct=true&autoReconnectForPools=true&allowMultiQueries=true
        password: root
        username: root
    #打印sql
    props:
      sql:
        show: true
    sharding:
      #分表
      tables:
        #数据分表规则
        #指定所需分的数据库和表的分布情况
        t_user: #表前缀
          actual-data-nodes: ds$->{2}.t_user
          # 使用SNOWFLAKE算法生成主键
          key-generator:
            column: user_id
            type: SNOWFLAKE
          table-strategy:
            inline:
              #分表规则(无规则就是这样,专库专表)
              algorithm-expression: t_user
              #指定主键
              sharding-column: user_id

        course:    #表前缀
          actual-data-nodes: ds$->{0..1}.course_$->{1..2}
          # 使用SNOWFLAKE算法生成主键
          key-generator:
            column: cid
            type: SNOWFLAKE
          table-strategy:
            inline:
              #分表规则
              algorithm-expression: course_$->{cid % 2 + 1}
              #指定主键
              sharding-column: cid

          #分库
          database-strategy:
            inline:
              algorithm-expression: ds$->{user_id % 2}
              sharding-column: user_id			  
#公共表操作			  
spring:
  main:
    allow-bean-definition-overriding: true
  shardingsphere:
    datasource:
      #数据库名称
      names: ds0,ds1,ds2
      ds0:
        driver-class-name: com.mysql.cj.jdbc.Driver
        type: com.zaxxer.hikari.HikariDataSource
        jdbc-url: jdbc:mysql://8.131.119.145:3300/edu_db_2?serverTimezone=UTC&useUnicode=true&characterEncoding=utf8&characterSetResults=utf8&useSSL=false&verifyServerCertificate=false&autoReconnct=true&autoReconnectForPools=true&allowMultiQueries=true
        password: root
        username: root
      ds1:
        driver-class-name: com.mysql.cj.jdbc.Driver
        type: com.zaxxer.hikari.HikariDataSource
        jdbc-url: jdbc:mysql://127.0.0.1:3306/edu_db_1?serverTimezone=UTC&useUnicode=true&characterEncoding=utf8&characterSetResults=utf8&useSSL=false&verifyServerCertificate=false&autoReconnct=true&autoReconnectForPools=true&allowMultiQueries=true
        password: root
        username: root
      ds2:
        driver-class-name: com.mysql.cj.jdbc.Driver
        type: com.zaxxer.hikari.HikariDataSource
        jdbc-url: jdbc:mysql://127.0.0.1:3306/user_db?serverTimezone=UTC&useUnicode=true&characterEncoding=utf8&characterSetResults=utf8&useSSL=false&verifyServerCertificate=false&autoReconnct=true&autoReconnectForPools=true&allowMultiQueries=true
        password: root
        username: root
    #打印sql
    props:
      sql:
        show: true
    sharding:
      #分表
      tables:
        #数据分表规则
        #指定所需分的数据库和表的分布情况
        t_user: #表前缀
          actual-data-nodes: ds$->{2}.t_user
          # 使用SNOWFLAKE算法生成主键
          key-generator:
            column: user_id
            type: SNOWFLAKE
          table-strategy:
            inline:
              #分表规则(无规则就是这样,专库专表)
              algorithm-expression: t_user
              #指定主键
              sharding-column: user_id

        course:    #表前缀
          actual-data-nodes: ds$->{0..1}.course_$->{1..2}
          # 使用SNOWFLAKE算法生成主键
          key-generator:
            column: cid
            type: SNOWFLAKE
          table-strategy:
            inline:
              #分表规则
              algorithm-expression: course_$->{cid % 2 + 1}
              #指定主键
              sharding-column: cid

          #分库
          database-strategy:
            inline:
              algorithm-expression: ds$->{user_id % 2}
              sharding-column: user_id

        #公共表配置
        t_udict:
            # 使用SNOWFLAKE算法生成主键
            key-generator:
              column: dictid
              type: SNOWFLAKE
      #公共表配置
      broadcast-tables: t_udict		
	  
#读写分离	  
spring:
  main:
    allow-bean-definition-overriding: true
  shardingsphere:
    datasource:
      #数据库名称
      names: ds0,s0
      #主服务器
      ds0:
        driver-class-name: com.mysql.cj.jdbc.Driver
        type: com.zaxxer.hikari.HikariDataSource
        jdbc-url: jdbc:mysql://8.131.119.145:3300/user_db?serverTimezone=UTC&useUnicode=true&characterEncoding=utf8&characterSetResults=utf8&useSSL=false&verifyServerCertificate=false&autoReconnct=true&autoReconnectForPools=true&allowMultiQueries=true
        password: root
        username: root
      #从服务器
      s0:
        driver-class-name: com.mysql.cj.jdbc.Driver
        type: com.zaxxer.hikari.HikariDataSource
        jdbc-url: jdbc:mysql://127.0.0.1:3306/user_db?serverTimezone=UTC&useUnicode=true&characterEncoding=utf8&characterSetResults=utf8&useSSL=false&verifyServerCertificate=false&autoReconnct=true&autoReconnectForPools=true&allowMultiQueries=true
        password: root
        username: root
    #打印sql
    props:
      sql:
        show: true
    sharding:
      master-slave-rules:
        #load-balance-algorithm-type: round_robin

        #指向的主数据库名称
        ds0:
          master-data-source-name: ds0
          #多个丛用逗号隔开
          slave-data-source-names: s0
      tables:
        t_user:
          actual-data-nodes: ds0.t_user
	  

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

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

相关文章

微调样本质量胜于数量 LIMA: Less Is More for Alignment

1、总体介绍 大型语言模型的训练分为两个阶段&#xff1a;&#xff08;1&#xff09;从原始文本中进行无监督的预训练&#xff0c;以学习通用的表征&#xff1b;&#xff08;2&#xff09;大规模的指令学习和强化学习&#xff0c;以更好地适应最终任务和用户的偏好。 作者通过…

作为网络安全工程师,都有哪些公司可以选?

招聘平台 首选内推 其次是公司自有招聘平台 再是第三方平台&#xff1a;boos直聘、前程无忧、拉钩、猎聘、牛客、牛聘 乙方 启明星辰 商标&#xff1a;云众可信&#xff0c;云子可信 投资&#xff1a;网御星云&#xff0c;恒安嘉新 拳头产品&#xff1a;Secin 社区、天清…

企企通×天能股份SRM一期项目成功上线,持续深化企业采购数字化

近期&#xff0c;企企通凭借在赋能客户数字化转型方面的优秀实践与丰富的解决方案&#xff0c;荣获天能电池集团股份有限公司&#xff08;以下简称“天能股份”&#xff09;颁发的“2022年度数字化优秀供应商奖”&#xff0c;同时&#xff0c;企企通SRM项目还获得天能股份采购管…

vue-cli4打包优化

项目开始时webpack配置 vue-cli3以后&#xff0c;我们修改webpack配置&#xff0c;需要自己在项目根路径下创建vue.config.js文件。 一、 配置 proxy 跨域 使用vue-cli发开项目&#xff0c;在本地开发环境中&#xff0c;如果遇到跨域的问题。可以通过配置proxy的方式&#xff…

uniapp(二) 之 uniapp 搭建与组件库的引用

小扩展&#xff1a; rpx&#xff08;responsive pixel&#xff09;:可以根据屏幕宽度自适应。规定屏幕宽度为750rpx。如果iphon6上&#xff0c;屏幕宽度为375px,共有750个像素&#xff0c;则750rpx 375培训 750物理像素&#xff0c;1rpx 0.5px 1物理像素。 页面跳转&#xff…

你知道TikTok的推荐算法吗?TikTok数据分析平台哪家好?

作为当下最受欢迎的社交媒体&#xff0c;TikTok这几年的成绩大家也是有目共睹了&#xff0c;超10亿的月活加上大量活跃的年轻人&#xff0c;让无数企业和品牌为之心动。入局的人越来越多&#xff0c;想要在众多竞争者中脱颖而出&#xff0c;入局前需要了解TikTok底层逻辑和推荐…

Treadlocal源码实例详解

我们都知道treadlocal维护变量时候&#xff0c;可以为每个线程维护一个独立的副本&#xff0c;改变的是自己线程的数据。 ThreadLocal公用方法有四个&#xff1a;get&#xff0c;set&#xff0c;remove&#xff0c;intiValue 既然threadLocalMap是局部变量&#xff0c;所以他存…

内网安全:内网渗透.(拿到内网主机最高权限 vulntarget 靶场 1)

内网安全&#xff1a;内网渗透.&#xff08;拿到内网主机最高权限&#xff09; 内网穿透又被称为NAT穿透&#xff0c;内网端口映射外网&#xff0c;在处于使用了NAT设备的私有TCP/IP网络中的主机之间建立连接的问题。通过映射端口&#xff0c;让外网的电脑找到处于内网的电脑。…

中国人民大学与加拿大女王大学金融硕士——人生选对方向很重要

有人说&#xff0c;人生最重要的不是财富、不是荣誉&#xff0c;而是选择一条正确的道路。选择正确的方向&#xff0c;对一个人的成长和事业的成功与否&#xff0c;起着决定作用。有了方向&#xff0c;你前进的每一步都跟接近幸福。在职计划读研的你有了解过中国人民大学与加拿…

Linux - 第23节 - Linux高级IO(一)

1.IO的基本概念 IO的概念&#xff1a; I/O&#xff08;input/output&#xff09;也就是输入和输出&#xff0c;在著名的冯诺依曼体系结构当中&#xff0c;将数据从输入设备拷贝到内存就叫做输入&#xff0c;将数据从内存拷贝到输出设备就叫做输出。 • 对文件进行的读写操作本质…

SpringBoot注解详解,建议收藏!

一、简介 基于 SpringBoot 平台开发的项目数不胜数&#xff0c;与常规的基于Spring开发的项目最大的不同之处&#xff0c;SpringBoot 里面提供了大量的注解用于快速开发&#xff0c;而且非常简单&#xff0c;基本可以做到开箱即用! 那 SpringBoot 为开发者提供了多少注解呢?…

《大数据技术与应用》课程实验报告|week12|实验8|Pig——高级编程环境|验证评估函数

目录 一、实验内容 二、实验目的 三、实验设备 四、实验步骤 步骤一 步骤二 步骤三 步骤四 步骤五 步骤六 步骤七 步骤八 步骤九 步骤十 步骤十一 步骤十二 步骤十三 步骤十四 步骤十五 步骤十六 五、实验结果 六、实验小结 一、实验内容 验证19.5节中的…

亚马逊云科技携手木卫四,为汽车行业智能安全赋能

木卫四&#xff08;北京&#xff09;科技有限公司在汽车网络安全领域拥有独特专业知识&#xff0c;其融合人工智能算法的安全检测引擎可以不依赖车辆中安装的代理软件&#xff0c;只需几周即可快速部署实施&#xff0c;是汽车网络安全领域的技术领先者。 在亚马逊云科技初创团…

chatgpt赋能python:Python同一行多个语句:如何提高你的编程效率?

Python同一行多个语句&#xff1a;如何提高你的编程效率&#xff1f; Python是一种优雅的编程语言&#xff0c;拥有简洁易懂的语法&#xff0c;可以帮助你快速编写可以在各种领域使用的高级代码。其中&#xff0c;Python同一行多个语句&#xff0c;是一种可以大大提高编程效率…

Springboot +spring security,基于内存模型实现授权

一.简介 1.1概念 所谓授权&#xff0c;举个例子&#xff1a;某个用户想要访问某个资源(接口、页面、功能等)&#xff0c;我们应该先去检查该用户是否具备对应的权限&#xff0c;如果具备就允许访问&#xff0c;如果不具备&#xff0c;则不允许访问。也就是说&#xff0c;授权…

第二十二章行为型模式—备忘录模式

文章目录 备忘录模式解决的问题结构实例“白箱” 备忘录模式“黑箱” 备忘录模式 存在的问题适用场景 行为型模式用于描述程序在运行时复杂的流程控制&#xff0c;即描述多个类或对象之间怎样相互协作共同完成单个对象无法单独完成的任务&#xff0c;它涉及算法与对象间职责的分…

【QQ聊天界面、创建模型、懒加载数据 Objective-C语言】

一、今天我们要做的就是这个案例 1.我们今天要做的案例,做好了之后的效果就是这样 这个案例,和昨天那个微博的案例是非常相像的, 哪些相像呢, 1)整体是不是也是能滚动啊, 2)能滚动,它不仅仅是一个UIScrollView 它里面,这个也是一行、两行、三行、四行、 所以说,…

Java核心知识点常考面试题(持续更新中)

Java核心知识点常考面试题&#xff08;持续更新中&#xff09; 线程与线程池Java锁机制轻量级锁重量级锁 线程与线程池 一、线程 1、线程的状态 2、线程的创建方式 &#xff08;1&#xff09;继承 Thread 类&#xff1b; &#xff08;2&#xff09;实现 Runnable 接口&#…

大学计算机专业 学习Python学习路线图(最新版)

这是我刚开始学习python时的一套学习路线&#xff0c;从入门到上手。&#xff08;不敢说精通&#xff0c;哈哈~&#xff09; 希望对大家有帮助哈~ 大家需要高清得完整python学习路线可以 一、Python入门、环境搭建、变量、数据类型 二、数据库编程 三、Linux系统 四、网页编…

工信部—高级软件开发工程师认证

工业和信息化部教育与考试中心是工业和信息化部直属事业单位&#xff0c;承担计算机技术与软件专业技术资格考试、通信专业技术人员职业水平考试、电子通信行业职业技能鉴定、全国信息技术人才培养工程、产业工人网络平台建设等人才培养选拔工作。 软件工程师(Software Enginee…