【快速使用ShardingJDBC的哈希分片策略进行分表】

文章目录

  • 🔊博主介绍
  • 🥤本文内容
    • 🍊1.引入maven依赖
    • 🍊2.启动类上添加注解@MapperScan
    • 🍊3.添加application.properties配置
    • 🍊4.普通的自定义实体类
    • 🍊5.写个测试类验证一下
    • 🍊6.控制台打印的日志
    • 🍊7.观察一下数据库的数据
    • 🍊8.maven的setting文件
    • 🍊9.视频演示
  • 📢文章总结
  • 📥博主目标

🔊博主介绍

🌟我是廖志伟,一名Java开发工程师、Java领域优质创作者、CSDN博客专家、51CTO专家博主、阿里云专家博主、清华大学出版社签约作者、产品软文专业写手、技术文章评审老师、问卷调查设计师、个人社区创始人、开源项目贡献者。🌎跑过十五公里、🚀徒步爬过衡山、🔥有过三个月减肥20斤的经历、是个喜欢躺平的狠人。

📕拥有多年一线研发和团队管理经验,研究过主流框架的底层源码(Spring、SpringBoot、Spring MVC、SpringCould、Mybatis、Dubbo、Zookeeper),消息中间件底层架构原理(RabbitMQ、RockerMQ、Kafka)、Redis缓存、MySQL关系型数据库、 ElasticSearch全文搜索、MongoDB非关系型数据库、Apache ShardingSphere分库分表读写分离、设计模式、领域驱动DDD、Kubernetes容器编排等。

📙有过从0到1的项目高并发项目开发与管理经验,对JVM调优、MySQL调优、Redis调优 、ElasticSearch调优、消息中间件调优、系统架构调优都有着比较全面的实战经验。

📘有过云端搭建服务器环境,自动化部署CI/CD,弹性伸缩扩容服务器(最高200台),了解过秒级部署(阿里云的ACK和华为云的云容器引擎CCE)流程,能独立开发和部署整个后端服务,有过分库分表的实战经验。

🎥经过多年在CSDN创作上千篇文章的经验积累,我已经拥有了不错的写作技巧,与清华大学出版社签下了四本书籍的合约,并将陆续在明年出版。这些书籍包括了基础篇、进阶篇、架构篇的📌《Java项目实战—深入理解大型互联网企业通用技术》📌,以及📚《解密程序员的思维密码–沟通、演讲、思考的实践》📚。具体出版计划会根据实际情况进行调整,希望各位读者朋能够多多支持!


文章目录

  • 🔊博主介绍
  • 🥤本文内容
    • 🍊1.引入maven依赖
    • 🍊2.启动类上添加注解@MapperScan
    • 🍊3.添加application.properties配置
    • 🍊4.普通的自定义实体类
    • 🍊5.写个测试类验证一下
    • 🍊6.控制台打印的日志
    • 🍊7.观察一下数据库的数据
    • 🍊8.maven的setting文件
    • 🍊9.视频演示
  • 📢文章总结
  • 📥博主目标

🌾阅读前,快速浏览目录和章节概览可帮助了解文章结构、内容和作者的重点。了解自己希望从中获得什么样的知识或经验是非常重要的。建议在阅读时做笔记、思考问题、自我提问,以加深理解和吸收知识。

💡在这个美好的时刻,本人不再啰嗦废话,现在毫不拖延地进入文章所要讨论的主题。接下来,我将为大家呈现正文内容。

🥤本文内容

CSDN

🍊1.引入maven依赖

在pom.xml中添加依赖

<!-- Maven 构建配置 -->
<build>
    <!-- 插件列表 -->
    <plugins>
        <!-- Maven 编译插件 -->
        <plugin>
            <!-- 插件所在 groupId -->
            <groupId>org.apache.maven.plugins</groupId>
            <!-- 插件所在 artifactId -->
            <artifactId>maven-compiler-plugin</artifactId>
            <!-- 插件配置 -->
            <configuration>
                <!-- 源码编译版本 -->
                <source>8</source>
                <!-- 目标编译版本 -->
                <target>8</target>
            </configuration>
        </plugin>
    </plugins>
</build>

<!-- Maven 依赖管理配置 -->
<dependencyManagement>
    <!-- 依赖列表 -->
    <dependencies>
        <!-- Spring Boot 依赖管理 -->
        <dependency>
            <!-- 依赖所在 groupId -->
            <groupId>org.springframework.boot</groupId>
            <!-- 依赖所在 artifactId -->
            <artifactId>spring-boot-dependencies</artifactId>
            <!-- 依赖版本 -->
            <version>2.3.1.RELEASE</version>
            <!-- 依赖类型 -->
            <type>pom</type>
            <!-- 依赖范围 -->
            <scope>import</scope>
        </dependency>
    </dependencies>
</dependencyManagement>

<!-- 项目依赖列表 -->
<dependencies>
    <!-- 分库分表组件 Sharding JDBC -->
    <dependency>
        <!-- 依赖所在 groupId -->
        <groupId>org.apache.shardingsphere</groupId>
        <!-- 依赖所在 artifactId -->
        <artifactId>sharding-jdbc-spring-boot-starter</artifactId>
        <!-- 依赖版本 -->
        <version>4.1.1</version>
    </dependency>
    <!-- Spring Boot 核心依赖 -->
    <dependency>
        <!-- 依赖所在 groupId -->
        <groupId>org.springframework.boot</groupId>
        <!-- 依赖所在 artifactId -->
        <artifactId>spring-boot-starter</artifactId>
    </dependency>
    <!-- Spring Boot 测试依赖 -->
    <dependency>
        <!-- 依赖所在 groupId -->
        <groupId>org.springframework.boot</groupId>
        <!-- 依赖所在 artifactId -->
        <artifactId>spring-boot-starter-test</artifactId>
    </dependency>
    <!-- 数据源连接池组件 Druid -->
    <dependency>
        <!-- 依赖所在 groupId -->
        <groupId>com.alibaba</groupId>
        <!-- 依赖所在 artifactId -->
        <artifactId>druid</artifactId>
        <!-- 依赖版本 -->
        <version>1.1.22</version>
    </dependency>
    <!-- MySQL 驱动依赖 -->
    <dependency>
        <!-- 依赖所在 groupId -->
        <groupId>mysql</groupId>
        <!-- 依赖所在 artifactId -->
        <artifactId>mysql-connector-java</artifactId>
    </dependency>
    <!-- MyBatis-Plus 集成依赖 -->
    <dependency>
        <!-- 依赖所在 groupId -->
        <groupId>com.baomidou</groupId>
        <!-- 依赖所在 artifactId -->
        <artifactId>mybatis-plus-boot-starter</artifactId>
        <!-- 依赖版本 -->
        <version>3.0.5</version>
    </dependency>
</dependencies>

🍊2.启动类上添加注解@MapperScan

扫描对应的mapper路径

@MapperScan("com.example.shardingDemo.mapper")
@SpringBootApplication
public class ShardingJDBCApplication {
    public static void main(String[] args) {
        SpringApplication.run(ShardingJDBCApplication.class,args);
    }
}

🍊3.添加application.properties配置

# 哈希分片策略

# 设置数据源名称为 m1
spring.shardingsphere.datasource.names=m1
# 设置数据源类型为 Druid 数据源
spring.shardingsphere.datasource.m1.type=com.alibaba.druid.pool.DruidDataSource
# 设置数据源驱动为 MySQLJDBC 驱动
spring.shardingsphere.datasource.m1.driver-class-name=com.mysql.cj.jdbc.Driver
# 设置数据源连接 URL,连接本地 MySQL 数据库的 coursedb 库
spring.shardingsphere.datasource.m1.url=jdbc:mysql://192.168.122.128:3306/masterdemo?serverTimezone=GMT%2B8
# 设置连接数据库所需的用户名和密码
spring.shardingsphere.datasource.m1.username=root
spring.shardingsphere.datasource.m1.password=bfb8f36cc2616995
# 设置分片表的实际数据节点,对应两个数据表:m1.t_course_1 和 m1.t_course_2
spring.shardingsphere.sharding.tables.course.actual-data-nodes=m1.t_course_$->{1..2}
# 设置分片键为 cid
spring.shardingsphere.sharding.tables.course.key-generator.column=cid
# 设置分布式 ID 生成算法为 SNOWFLAKE 算法,worker ID1
spring.shardingsphere.sharding.tables.course.key-generator.type=SNOWFLAKE
# Spring Boot 应用配置项:ShardingSphere 分库分表配置之课程表的主键生成策略配置项,属性名: worker.id,属性值: 1 (表示该应用程序所使用的 Snowflake 算法的工作节点 ID1)
spring.shardingsphere.sharding.tables.course.key-generator.props.worker.id=1
# 设置分表算法为 inline 分片算法,分片列为 cid,分片规则为课程编号为奇数的记录在 m1.t_course_1 表中,课程编号为偶数的记录在 m1.t_course_2 表中
spring.shardingsphere.sharding.tables.course.table-strategy.inline.sharding-column=cid
# table-strategy.inline:表示使用内联表达式的分片策略。lgorithm-expression:表示表名生成算法表达式。t_course_$->{cid%2+1}:表示生成的表名,即t_course_后面接下标为(cid%2+1)的表。
# cid是表中的一个自增主键,%2表示对2取余数,+1表示取余结果加1,即cid值为偶数进入到t_course_1表,cid值为奇数进入到t_course_2表。
spring.shardingsphere.sharding.tables.course.table-strategy.inline.algorithm-expression=t_course_$->{cid%2+1}
# 设置 SQL 显示开启,方便调试
spring.shardingsphere.props.sql.show=true
# 允许覆盖 Bean 定义,用于调试时快速更新配置
spring.main.allow-bean-definition-overriding=true

🍊4.普通的自定义实体类

public class Course {
    private Long cid;
    private String cname;
    private Long userId;
    private String cstatus;
    //省略get/set方法了

🍊5.写个测试类验证一下

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.example.shardingDemo.entity.Course;
import com.example.shardingDemo.entity.Dict;
import com.example.shardingDemo.entity.User;
import com.example.shardingDemo.mapper.CourseMapper;
import com.example.shardingDemo.mapper.DictMapper;
import com.example.shardingDemo.mapper.UserMapper;
import org.apache.shardingsphere.api.hint.HintManager;
import org.junit.Test;
import org.junit.jupiter.api.Tags;
import org.junit.runner.RunWith;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;
import javax.annotation.Resource;
import java.util.List;

@RunWith(SpringRunner.class)
@SpringBootTest
public class ShardingJDBCTest {
    @Resource
    CourseMapper courseMapper;

    @Test
    public void addCourse(){
        for(int i = 0 ; i < 10 ; i ++){
            Course c = new Course();
            c.setCid(Long.valueOf(i));
            c.setCname("shardingsphere");
            c.setUserId(Long.valueOf(""+(1000+i)));
            c.setCstatus("1");
            courseMapper.insert(c);
        }
    }
}

🍊6.控制台打印的日志


  .   ____          _            __ _ _
 /\\ / ___'_ __ _ _(_)_ __  __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
 \\/  ___)| |_)| | | | | || (_| |  ) ) ) )
  '  |____| .__|_| |_|_| |_\__, | / / / /
 =========|_|==============|___/=/_/_/_/
 :: Spring Boot ::        (v2.3.1.RELEASE)

2023-11-08 18:02:14.029  INFO 11092 --- [           main] c.e.a.ShardingJDBCTest                   : Starting ShardingJDBCTest on WIN-20230222ULN with PID 11092 (started by Administrator in E:\WarkSpace\基础篇书籍\第8章\apache-shardingsphere-demo)
2023-11-08 18:02:14.032  INFO 11092 --- [           main] c.e.a.ShardingJDBCTest                   : No active profile set, falling back to default profiles: default
2023-11-08 18:02:14.414  INFO 11092 --- [           main] trationDelegate$BeanPostProcessorChecker : Bean 'stringToNoneShardingStrategyConfigurationConverter' of type [org.apache.shardingsphere.spring.boot.converter.StringToNoneShardingStrategyConfigurationConverter] is not eligible for getting processed by all BeanPostProcessors (for example: not eligible for auto-proxying)
2023-11-08 18:02:14.422  INFO 11092 --- [           main] trationDelegate$BeanPostProcessorChecker : Bean 'spring.shardingsphere.sharding-org.apache.shardingsphere.shardingjdbc.spring.boot.sharding.SpringBootShardingRuleConfigurationProperties' of type [org.apache.shardingsphere.shardingjdbc.spring.boot.sharding.SpringBootShardingRuleConfigurationProperties] is not eligible for getting processed by all BeanPostProcessors (for example: not eligible for auto-proxying)
2023-11-08 18:02:14.422  INFO 11092 --- [           main] trationDelegate$BeanPostProcessorChecker : Bean 'spring.shardingsphere.masterslave-org.apache.shardingsphere.shardingjdbc.spring.boot.masterslave.SpringBootMasterSlaveRuleConfigurationProperties' of type [org.apache.shardingsphere.shardingjdbc.spring.boot.masterslave.SpringBootMasterSlaveRuleConfigurationProperties] is not eligible for getting processed by all BeanPostProcessors (for example: not eligible for auto-proxying)
2023-11-08 18:02:14.426  INFO 11092 --- [           main] trationDelegate$BeanPostProcessorChecker : Bean 'spring.shardingsphere.encrypt-org.apache.shardingsphere.shardingjdbc.spring.boot.encrypt.SpringBootEncryptRuleConfigurationProperties' of type [org.apache.shardingsphere.shardingjdbc.spring.boot.encrypt.SpringBootEncryptRuleConfigurationProperties] is not eligible for getting processed by all BeanPostProcessors (for example: not eligible for auto-proxying)
2023-11-08 18:02:14.426  INFO 11092 --- [           main] trationDelegate$BeanPostProcessorChecker : Bean 'spring.shardingsphere.shadow-org.apache.shardingsphere.shardingjdbc.spring.boot.shadow.SpringBootShadowRuleConfigurationProperties' of type [org.apache.shardingsphere.shardingjdbc.spring.boot.shadow.SpringBootShadowRuleConfigurationProperties] is not eligible for getting processed by all BeanPostProcessors (for example: not eligible for auto-proxying)
2023-11-08 18:02:14.430  INFO 11092 --- [           main] trationDelegate$BeanPostProcessorChecker : Bean 'spring.shardingsphere-org.apache.shardingsphere.shardingjdbc.spring.boot.common.SpringBootPropertiesConfigurationProperties' of type [org.apache.shardingsphere.shardingjdbc.spring.boot.common.SpringBootPropertiesConfigurationProperties] is not eligible for getting processed by all BeanPostProcessors (for example: not eligible for auto-proxying)
2023-11-08 18:02:14.549  INFO 11092 --- [           main] trationDelegate$BeanPostProcessorChecker : Bean 'org.apache.shardingsphere.shardingjdbc.spring.boot.SpringBootConfiguration' of type [org.apache.shardingsphere.shardingjdbc.spring.boot.SpringBootConfiguration$$EnhancerBySpringCGLIB$$f2dcf3ef] is not eligible for getting processed by all BeanPostProcessors (for example: not eligible for auto-proxying)
2023-11-08 18:02:14.736  INFO 11092 --- [           main] com.alibaba.druid.pool.DruidDataSource   : {dataSource-1} inited
2023-11-08 18:02:15.200  INFO 11092 --- [           main] o.a.s.core.log.ConfigurationLogger       : ShardingRuleConfiguration:
tables:
  course:
    actualDataNodes: m1.t_course_$->{1..2}
    keyGenerator:
      column: cid
      props:
        worker.id: '1'
      type: SNOWFLAKE
    logicTable: course
    tableStrategy:
      inline:
        algorithmExpression: t_course_$->{cid%2+1}
        shardingColumn: cid

2023-11-08 18:02:15.200  INFO 11092 --- [           main] o.a.s.core.log.ConfigurationLogger       : Properties:
sql.show: 'true'

2023-11-08 18:02:15.208  INFO 11092 --- [           main] ShardingSphere-metadata                  : Loading 1 logic tables' meta data.
2023-11-08 18:02:15.254  INFO 11092 --- [           main] ShardingSphere-metadata                  : Loading 8 tables' meta data.
2023-11-08 18:02:15.285  INFO 11092 --- [           main] ShardingSphere-metadata                  : Meta data load finished, cost 85 milliseconds.
 _ _   |_  _ _|_. ___ _ |    _ 
| | |\/|_)(_| | |_\  |_)||_|_\ 
     /               |         
                        3.0.5 
2023-11-08 18:02:15.391  WARN 11092 --- [           main] c.b.m.core.toolkit.TableInfoHelper       : Warn: Could not find @TableId in Class: com.example.apacheshardingspheredemo.entity.Course.
2023-11-08 18:02:15.466  WARN 11092 --- [           main] c.b.m.core.toolkit.TableInfoHelper       : Warn: Could not find @TableId in Class: com.example.apacheshardingspheredemo.entity.Dict.
2023-11-08 18:02:15.479  WARN 11092 --- [           main] c.b.m.core.toolkit.TableInfoHelper       : Warn: Could not find @TableId in Class: com.example.apacheshardingspheredemo.entity.User.
2023-11-08 18:02:15.577  INFO 11092 --- [           main] c.e.a.ShardingJDBCTest                   : Started ShardingJDBCTest in 1.698 seconds (JVM running for 2.242)
2023-11-08 18:02:15.949  INFO 11092 --- [           main] ShardingSphere-SQL                       : Logic SQL: INSERT INTO course  ( cid,
cname,
user_id,
cstatus )  VALUES  ( ?,
?,
?,
? )
2023-11-08 18:02:15.949  INFO 11092 --- [           main] ShardingSphere-SQL                       : SQLStatement: InsertStatementContext(super=CommonSQLStatementContext(sqlStatement=org.apache.shardingsphere.sql.parser.sql.statement.dml.InsertStatement@7ab1ad9, tablesContext=org.apache.shardingsphere.sql.parser.binder.segment.table.TablesContext@5ee6fdc4), tablesContext=org.apache.shardingsphere.sql.parser.binder.segment.table.TablesContext@5ee6fdc4, columnNames=[cid, cname, user_id, cstatus], insertValueContexts=[InsertValueContext(parametersCount=4, valueExpressions=[ParameterMarkerExpressionSegment(startIndex=64, stopIndex=64, parameterMarkerIndex=0), ParameterMarkerExpressionSegment(startIndex=67, stopIndex=67, parameterMarkerIndex=1), ParameterMarkerExpressionSegment(startIndex=70, stopIndex=70, parameterMarkerIndex=2), ParameterMarkerExpressionSegment(startIndex=73, stopIndex=73, parameterMarkerIndex=3)], parameters=[0, shardingsphere, 1000, 1])], generatedKeyContext=Optional[GeneratedKeyContext(columnName=cid, generated=false, generatedValues=[0])])
2023-11-08 18:02:15.949  INFO 11092 --- [           main] ShardingSphere-SQL                       : Actual SQL: m1 ::: INSERT INTO t_course_1  ( cid,
cname,
user_id,
cstatus )  VALUES  (?, ?, ?, ?) ::: [0, shardingsphere, 1000, 1]
2023-11-08 18:02:15.966  INFO 11092 --- [           main] ShardingSphere-SQL                       : Logic SQL: INSERT INTO course  ( cid,
cname,
user_id,
cstatus )  VALUES  ( ?,
?,
?,
? )
2023-11-08 18:02:15.966  INFO 11092 --- [           main] ShardingSphere-SQL                       : SQLStatement: InsertStatementContext(super=CommonSQLStatementContext(sqlStatement=org.apache.shardingsphere.sql.parser.sql.statement.dml.InsertStatement@7ab1ad9, tablesContext=org.apache.shardingsphere.sql.parser.binder.segment.table.TablesContext@43fd77d8), tablesContext=org.apache.shardingsphere.sql.parser.binder.segment.table.TablesContext@43fd77d8, columnNames=[cid, cname, user_id, cstatus], insertValueContexts=[InsertValueContext(parametersCount=4, valueExpressions=[ParameterMarkerExpressionSegment(startIndex=64, stopIndex=64, parameterMarkerIndex=0), ParameterMarkerExpressionSegment(startIndex=67, stopIndex=67, parameterMarkerIndex=1), ParameterMarkerExpressionSegment(startIndex=70, stopIndex=70, parameterMarkerIndex=2), ParameterMarkerExpressionSegment(startIndex=73, stopIndex=73, parameterMarkerIndex=3)], parameters=[1, shardingsphere, 1001, 1])], generatedKeyContext=Optional[GeneratedKeyContext(columnName=cid, generated=false, generatedValues=[1])])
2023-11-08 18:02:15.966  INFO 11092 --- [           main] ShardingSphere-SQL                       : Actual SQL: m1 ::: INSERT INTO t_course_2  ( cid,
cname,
user_id,
cstatus )  VALUES  (?, ?, ?, ?) ::: [1, shardingsphere, 1001, 1]
2023-11-08 18:02:15.966  INFO 11092 --- [           main] ShardingSphere-SQL                       : Logic SQL: INSERT INTO course  ( cid,
cname,
user_id,
cstatus )  VALUES  ( ?,
?,
?,
? )
2023-11-08 18:02:15.966  INFO 11092 --- [           main] ShardingSphere-SQL                       : SQLStatement: InsertStatementContext(super=CommonSQLStatementContext(sqlStatement=org.apache.shardingsphere.sql.parser.sql.statement.dml.InsertStatement@7ab1ad9, tablesContext=org.apache.shardingsphere.sql.parser.binder.segment.table.TablesContext@32ba5c65), tablesContext=org.apache.shardingsphere.sql.parser.binder.segment.table.TablesContext@32ba5c65, columnNames=[cid, cname, user_id, cstatus], insertValueContexts=[InsertValueContext(parametersCount=4, valueExpressions=[ParameterMarkerExpressionSegment(startIndex=64, stopIndex=64, parameterMarkerIndex=0), ParameterMarkerExpressionSegment(startIndex=67, stopIndex=67, parameterMarkerIndex=1), ParameterMarkerExpressionSegment(startIndex=70, stopIndex=70, parameterMarkerIndex=2), ParameterMarkerExpressionSegment(startIndex=73, stopIndex=73, parameterMarkerIndex=3)], parameters=[2, shardingsphere, 1002, 1])], generatedKeyContext=Optional[GeneratedKeyContext(columnName=cid, generated=false, generatedValues=[2])])
2023-11-08 18:02:15.966  INFO 11092 --- [           main] ShardingSphere-SQL                       : Actual SQL: m1 ::: INSERT INTO t_course_1  ( cid,
cname,
user_id,
cstatus )  VALUES  (?, ?, ?, ?) ::: [2, shardingsphere, 1002, 1]
2023-11-08 18:02:15.971  INFO 11092 --- [           main] ShardingSphere-SQL                       : Logic SQL: INSERT INTO course  ( cid,
cname,
user_id,
cstatus )  VALUES  ( ?,
?,
?,
? )
2023-11-08 18:02:15.971  INFO 11092 --- [           main] ShardingSphere-SQL                       : SQLStatement: InsertStatementContext(super=CommonSQLStatementContext(sqlStatement=org.apache.shardingsphere.sql.parser.sql.statement.dml.InsertStatement@7ab1ad9, tablesContext=org.apache.shardingsphere.sql.parser.binder.segment.table.TablesContext@702f4124), tablesContext=org.apache.shardingsphere.sql.parser.binder.segment.table.TablesContext@702f4124, columnNames=[cid, cname, user_id, cstatus], insertValueContexts=[InsertValueContext(parametersCount=4, valueExpressions=[ParameterMarkerExpressionSegment(startIndex=64, stopIndex=64, parameterMarkerIndex=0), ParameterMarkerExpressionSegment(startIndex=67, stopIndex=67, parameterMarkerIndex=1), ParameterMarkerExpressionSegment(startIndex=70, stopIndex=70, parameterMarkerIndex=2), ParameterMarkerExpressionSegment(startIndex=73, stopIndex=73, parameterMarkerIndex=3)], parameters=[3, shardingsphere, 1003, 1])], generatedKeyContext=Optional[GeneratedKeyContext(columnName=cid, generated=false, generatedValues=[3])])
2023-11-08 18:02:15.971  INFO 11092 --- [           main] ShardingSphere-SQL                       : Actual SQL: m1 ::: INSERT INTO t_course_2  ( cid,
cname,
user_id,
cstatus )  VALUES  (?, ?, ?, ?) ::: [3, shardingsphere, 1003, 1]
2023-11-08 18:02:15.975  INFO 11092 --- [           main] ShardingSphere-SQL                       : Logic SQL: INSERT INTO course  ( cid,
cname,
user_id,
cstatus )  VALUES  ( ?,
?,
?,
? )
2023-11-08 18:02:15.975  INFO 11092 --- [           main] ShardingSphere-SQL                       : SQLStatement: InsertStatementContext(super=CommonSQLStatementContext(sqlStatement=org.apache.shardingsphere.sql.parser.sql.statement.dml.InsertStatement@7ab1ad9, tablesContext=org.apache.shardingsphere.sql.parser.binder.segment.table.TablesContext@22ff1372), tablesContext=org.apache.shardingsphere.sql.parser.binder.segment.table.TablesContext@22ff1372, columnNames=[cid, cname, user_id, cstatus], insertValueContexts=[InsertValueContext(parametersCount=4, valueExpressions=[ParameterMarkerExpressionSegment(startIndex=64, stopIndex=64, parameterMarkerIndex=0), ParameterMarkerExpressionSegment(startIndex=67, stopIndex=67, parameterMarkerIndex=1), ParameterMarkerExpressionSegment(startIndex=70, stopIndex=70, parameterMarkerIndex=2), ParameterMarkerExpressionSegment(startIndex=73, stopIndex=73, parameterMarkerIndex=3)], parameters=[4, shardingsphere, 1004, 1])], generatedKeyContext=Optional[GeneratedKeyContext(columnName=cid, generated=false, generatedValues=[4])])
2023-11-08 18:02:15.975  INFO 11092 --- [           main] ShardingSphere-SQL                       : Actual SQL: m1 ::: INSERT INTO t_course_1  ( cid,
cname,
user_id,
cstatus )  VALUES  (?, ?, ?, ?) ::: [4, shardingsphere, 1004, 1]
2023-11-08 18:02:15.975  INFO 11092 --- [           main] ShardingSphere-SQL                       : Logic SQL: INSERT INTO course  ( cid,
cname,
user_id,
cstatus )  VALUES  ( ?,
?,
?,
? )
2023-11-08 18:02:15.975  INFO 11092 --- [           main] ShardingSphere-SQL                       : SQLStatement: InsertStatementContext(super=CommonSQLStatementContext(sqlStatement=org.apache.shardingsphere.sql.parser.sql.statement.dml.InsertStatement@7ab1ad9, tablesContext=org.apache.shardingsphere.sql.parser.binder.segment.table.TablesContext@4d825dbe), tablesContext=org.apache.shardingsphere.sql.parser.binder.segment.table.TablesContext@4d825dbe, columnNames=[cid, cname, user_id, cstatus], insertValueContexts=[InsertValueContext(parametersCount=4, valueExpressions=[ParameterMarkerExpressionSegment(startIndex=64, stopIndex=64, parameterMarkerIndex=0), ParameterMarkerExpressionSegment(startIndex=67, stopIndex=67, parameterMarkerIndex=1), ParameterMarkerExpressionSegment(startIndex=70, stopIndex=70, parameterMarkerIndex=2), ParameterMarkerExpressionSegment(startIndex=73, stopIndex=73, parameterMarkerIndex=3)], parameters=[5, shardingsphere, 1005, 1])], generatedKeyContext=Optional[GeneratedKeyContext(columnName=cid, generated=false, generatedValues=[5])])
2023-11-08 18:02:15.975  INFO 11092 --- [           main] ShardingSphere-SQL                       : Actual SQL: m1 ::: INSERT INTO t_course_2  ( cid,
cname,
user_id,
cstatus )  VALUES  (?, ?, ?, ?) ::: [5, shardingsphere, 1005, 1]
2023-11-08 18:02:15.979  INFO 11092 --- [           main] ShardingSphere-SQL                       : Logic SQL: INSERT INTO course  ( cid,
cname,
user_id,
cstatus )  VALUES  ( ?,
?,
?,
? )
2023-11-08 18:02:15.979  INFO 11092 --- [           main] ShardingSphere-SQL                       : SQLStatement: InsertStatementContext(super=CommonSQLStatementContext(sqlStatement=org.apache.shardingsphere.sql.parser.sql.statement.dml.InsertStatement@7ab1ad9, tablesContext=org.apache.shardingsphere.sql.parser.binder.segment.table.TablesContext@63814bbe), tablesContext=org.apache.shardingsphere.sql.parser.binder.segment.table.TablesContext@63814bbe, columnNames=[cid, cname, user_id, cstatus], insertValueContexts=[InsertValueContext(parametersCount=4, valueExpressions=[ParameterMarkerExpressionSegment(startIndex=64, stopIndex=64, parameterMarkerIndex=0), ParameterMarkerExpressionSegment(startIndex=67, stopIndex=67, parameterMarkerIndex=1), ParameterMarkerExpressionSegment(startIndex=70, stopIndex=70, parameterMarkerIndex=2), ParameterMarkerExpressionSegment(startIndex=73, stopIndex=73, parameterMarkerIndex=3)], parameters=[6, shardingsphere, 1006, 1])], generatedKeyContext=Optional[GeneratedKeyContext(columnName=cid, generated=false, generatedValues=[6])])
2023-11-08 18:02:15.979  INFO 11092 --- [           main] ShardingSphere-SQL                       : Actual SQL: m1 ::: INSERT INTO t_course_1  ( cid,
cname,
user_id,
cstatus )  VALUES  (?, ?, ?, ?) ::: [6, shardingsphere, 1006, 1]
2023-11-08 18:02:15.983  INFO 11092 --- [           main] ShardingSphere-SQL                       : Logic SQL: INSERT INTO course  ( cid,
cname,
user_id,
cstatus )  VALUES  ( ?,
?,
?,
? )
2023-11-08 18:02:15.983  INFO 11092 --- [           main] ShardingSphere-SQL                       : SQLStatement: InsertStatementContext(super=CommonSQLStatementContext(sqlStatement=org.apache.shardingsphere.sql.parser.sql.statement.dml.InsertStatement@7ab1ad9, tablesContext=org.apache.shardingsphere.sql.parser.binder.segment.table.TablesContext@70b196d3), tablesContext=org.apache.shardingsphere.sql.parser.binder.segment.table.TablesContext@70b196d3, columnNames=[cid, cname, user_id, cstatus], insertValueContexts=[InsertValueContext(parametersCount=4, valueExpressions=[ParameterMarkerExpressionSegment(startIndex=64, stopIndex=64, parameterMarkerIndex=0), ParameterMarkerExpressionSegment(startIndex=67, stopIndex=67, parameterMarkerIndex=1), ParameterMarkerExpressionSegment(startIndex=70, stopIndex=70, parameterMarkerIndex=2), ParameterMarkerExpressionSegment(startIndex=73, stopIndex=73, parameterMarkerIndex=3)], parameters=[7, shardingsphere, 1007, 1])], generatedKeyContext=Optional[GeneratedKeyContext(columnName=cid, generated=false, generatedValues=[7])])
2023-11-08 18:02:15.983  INFO 11092 --- [           main] ShardingSphere-SQL                       : Actual SQL: m1 ::: INSERT INTO t_course_2  ( cid,
cname,
user_id,
cstatus )  VALUES  (?, ?, ?, ?) ::: [7, shardingsphere, 1007, 1]
2023-11-08 18:02:15.983  INFO 11092 --- [           main] ShardingSphere-SQL                       : Logic SQL: INSERT INTO course  ( cid,
cname,
user_id,
cstatus )  VALUES  ( ?,
?,
?,
? )
2023-11-08 18:02:15.983  INFO 11092 --- [           main] ShardingSphere-SQL                       : SQLStatement: InsertStatementContext(super=CommonSQLStatementContext(sqlStatement=org.apache.shardingsphere.sql.parser.sql.statement.dml.InsertStatement@7ab1ad9, tablesContext=org.apache.shardingsphere.sql.parser.binder.segment.table.TablesContext@72001c71), tablesContext=org.apache.shardingsphere.sql.parser.binder.segment.table.TablesContext@72001c71, columnNames=[cid, cname, user_id, cstatus], insertValueContexts=[InsertValueContext(parametersCount=4, valueExpressions=[ParameterMarkerExpressionSegment(startIndex=64, stopIndex=64, parameterMarkerIndex=0), ParameterMarkerExpressionSegment(startIndex=67, stopIndex=67, parameterMarkerIndex=1), ParameterMarkerExpressionSegment(startIndex=70, stopIndex=70, parameterMarkerIndex=2), ParameterMarkerExpressionSegment(startIndex=73, stopIndex=73, parameterMarkerIndex=3)], parameters=[8, shardingsphere, 1008, 1])], generatedKeyContext=Optional[GeneratedKeyContext(columnName=cid, generated=false, generatedValues=[8])])
2023-11-08 18:02:15.983  INFO 11092 --- [           main] ShardingSphere-SQL                       : Actual SQL: m1 ::: INSERT INTO t_course_1  ( cid,
cname,
user_id,
cstatus )  VALUES  (?, ?, ?, ?) ::: [8, shardingsphere, 1008, 1]
2023-11-08 18:02:15.987  INFO 11092 --- [           main] ShardingSphere-SQL                       : Logic SQL: INSERT INTO course  ( cid,
cname,
user_id,
cstatus )  VALUES  ( ?,
?,
?,
? )
2023-11-08 18:02:15.987  INFO 11092 --- [           main] ShardingSphere-SQL                       : SQLStatement: InsertStatementContext(super=CommonSQLStatementContext(sqlStatement=org.apache.shardingsphere.sql.parser.sql.statement.dml.InsertStatement@7ab1ad9, tablesContext=org.apache.shardingsphere.sql.parser.binder.segment.table.TablesContext@7d90644f), tablesContext=org.apache.shardingsphere.sql.parser.binder.segment.table.TablesContext@7d90644f, columnNames=[cid, cname, user_id, cstatus], insertValueContexts=[InsertValueContext(parametersCount=4, valueExpressions=[ParameterMarkerExpressionSegment(startIndex=64, stopIndex=64, parameterMarkerIndex=0), ParameterMarkerExpressionSegment(startIndex=67, stopIndex=67, parameterMarkerIndex=1), ParameterMarkerExpressionSegment(startIndex=70, stopIndex=70, parameterMarkerIndex=2), ParameterMarkerExpressionSegment(startIndex=73, stopIndex=73, parameterMarkerIndex=3)], parameters=[9, shardingsphere, 1009, 1])], generatedKeyContext=Optional[GeneratedKeyContext(columnName=cid, generated=false, generatedValues=[9])])
2023-11-08 18:02:15.987  INFO 11092 --- [           main] ShardingSphere-SQL                       : Actual SQL: m1 ::: INSERT INTO t_course_2  ( cid,
cname,
user_id,
cstatus )  VALUES  (?, ?, ?, ?) ::: [9, shardingsphere, 1009, 1]
2023-11-08 18:02:15.995  INFO 11092 --- [extShutdownHook] com.alibaba.druid.pool.DruidDataSource   : {dataSource-1} closing ...
2023-11-08 18:02:15.995  INFO 11092 --- [extShutdownHook] com.alibaba.druid.pool.DruidDataSource   : {dataSource-1} closed
Disconnected from the target VM, address: '127.0.0.1:52128', transport: 'socket'

🍊7.观察一下数据库的数据

course_1表的数据如图下所示:
course_1表

可以发现course_1表的cid都是偶数。

course_2表的数据如图所示:
course_2表

可以发现course_2表的cid都是奇数。

🍊8.maven的setting文件

为了避免部分同学下载依赖包不一致导致maven依赖下载不下来,我这里给上自己的配置文件,代码如下所示:

<?xml version="1.0" encoding="UTF-8"?>
<!-- Maven 的配置文件 -->
<settings xmlns="http://maven.apache.org/SETTINGS/1.1.0" 
          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
          xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.1.0
        http://maven.apache.org/xsd/settings-1.1.0.xsd">
  <!-- 设置本地仓库的路径 -->
  <localRepository>D:\Java\ReMaven</localRepository>
  <!-- 设置镜像 -->
  <mirrors>
  	<mirror>
      <id>central</id>
      <url>https://repo1.maven.org/maven2/</url>
      <mirrorOf>*</mirrorOf>
    </mirror>
    <!-- 定义一个镜像 -->
    <!-- <mirror>
      <id>aliyunmaven</id> 
      <name>Alibaba Maven Mirror</name> 
      <url>http://maven.aliyun.com/nexus/content/groups/public/</url> 
      <mirrorOf>central</mirrorOf> 
    </mirror>
	-->
	<mirror>
	  <id>aliyunmaven</id><!-- 镜像的id -->
	  <mirrorOf>*</mirrorOf><!-- 镜像代理的仓库id,这里将中央仓库的地址替换为阿里云的地址 -->
	  <name>阿里云公共仓库</name><!-- 镜像的名称 -->
	  <url>https://maven.aliyun.com/repository/public</url><!-- 镜像的地址 -->
	</mirror>
  </mirrors>
  <!-- 设置代理 -->
  <proxies></proxies>
  <!-- 设置私有仓库的认证信息 -->
  <servers></servers>
  <!-- 定义构建时添加的环境参数 -->
  <profiles>
    <!-- 定义一个profile -->
    <profile>
      <id>jdk-1.8</id> <!-- profile的id -->
      <activation> <!-- 激活条件 -->
        <activeByDefault>true</activeByDefault> <!-- 默认激活 -->
        <jdk>1.8</jdk> <!-- 使用的JDK版本 -->
      </activation>
      <properties> <!-- 定义环境变量 -->
        <maven.compiler.source>1.8</maven.compiler.source> <!-- 编译代码的源版本 -->
        <maven.compiler.target>1.8</maven.compiler.target> <!-- 编译代码的目标版本 -->
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <!-- 项目源码的编码方式 -->
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding> <!-- 项目输出的编码方式 -->
        <java.version>1.8</java.version> <!-- 使用的Java版本 -->
      </properties>
    </profile>
  </profiles>
  <!-- 设置默认激活的环境 -->
  <activeProfiles>
    <activeProfile>jdk-1.8</activeProfile> <!-- 默认激活的profile -->
  </activeProfiles>
</settings>

🍊9.视频演示

这里提供一个视频演示,简单讲解一下,视频发布在哔哩哔哩平台上。

快速使用ShardingJDBC的哈希分片策略进行分表

CSDN

📢文章总结

对本篇文章进行总结:

🔔以上就是今天要讲的内容,阅读结束后,反思和总结所学内容,并尝试应用到现实中,有助于深化理解和应用知识。与朋友或同事分享所读内容,讨论细节并获得反馈,也有助于加深对知识的理解和吸收。

以梦为马,不负韶华

🔔如果您需要转载或者搬运这篇文章的话,非常欢迎您私信我哦~

🚀🎉希望各位读者大大多多支持用心写文章的博主,现在时代变了,🚀🎉 信息爆炸,酒香也怕巷子深🔥,博主真的需要大家的帮助才能在这片海洋中继续发光发热🎨,所以,🏃💨赶紧动动你的小手,点波关注❤️,点波赞👍,点波收藏⭐,甚至点波评论✍️,都是对博主最好的支持和鼓励!

  • 💂 博客主页: 我是廖志伟
  • 👉开源项目:java_wxid
  • 🌥 哔哩哔哩:我是廖志伟
  • 🎏个人社区:幕后大佬
  • 🔖个人微信号SeniorRD
  • 🎉微信号二维码SeniorRD

📥博主目标

探寻内心世界,博主分享人生感悟与未来目标

  • 🍋程序开发这条路不能停,停下来容易被淘汰掉,吃不了自律的苦,就要受平庸的罪,持续的能力才能带来持续的自信。我本是一个很普通的程序员,放在人堆里,除了与生俱来的盛世美颜,就剩180的大高个了,就是我这样的一个人,默默写博文也有好多年了。
  • 📺有句老话说的好,牛逼之前都是傻逼式的坚持,希望自己可以通过大量的作品、时间的积累、个人魅力、运气、时机,可以打造属于自己的技术影响力。
  • 💥内心起伏不定,我时而激动,时而沉思。我希望自己能成为一个综合性人才,具备技术、业务和管理方面的精湛技能。我想成为产品架构路线的总设计师,团队的指挥者,技术团队的中流砥柱,企业战略和资本规划的实战专家。
  • 🎉这个目标的实现需要不懈的努力和持续的成长,但我必须努力追求。因为我知道,只有成为这样的人才,我才能在职业生涯中不断前进并为企业的发展带来真正的价值。在这个不断变化的时代,我们必须随时准备好迎接挑战,不断学习和探索新的领域,才能不断地向前推进。我坚信,只要我不断努力,我一定会达到自己的目标。

🔔有需要对自己进行综合性评估,进行职业方向规划,我可以让技术大牛帮你模拟面试、针对性的指导、传授面试技巧、简历优化、进行技术问题答疑等服务。

可访问:https://java_wxid.gitee.io/tojson/

开发人员简历优化、面试突击指导、技术问题解答

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【原创】java+jsp+servlet简单图书管理系统设计与实现

摘要&#xff1a; 图书管理系统是一个专门针对图书馆管理而设计的系统&#xff0c;它可以帮助图书管理员有效的对图书进行管理&#xff0c;在图书管理系统的设计中&#xff0c;首先要考虑的是系统的需求分析&#xff0c;该系统的设计与实现涉及多个方面&#xff0c;包括数据库…

RSA 2048位算法的主要参数N,E,P,Q,DP,DQ,Qinv,D分别是什么意思 哪个是通常所说的公钥与私钥 -安全行业基础篇5

非对称加密算法RSA 在RSA 2048位算法中&#xff0c;常见的参数N、E、P、Q、DP、DQ、Qinv和D代表以下含义&#xff1a; N&#xff08;Modulus&#xff09;&#xff1a;模数&#xff0c;是两个大素数P和Q的乘积。N的长度决定了RSA算法的安全性。 E&#xff08;Public Exponent&a…

09-MySQL主从复制

01-主从复制原理 MySQL主从复制是一种用于实现数据备份、读写分离和扩展性的技术。它基于二进制日志&#xff08;Binary Log&#xff09;来将主数据库上的更改操作同步到一个或多个从数据库。 MySQL主从复制的基本原理如下&#xff1a; 主服务器&#xff08;Master&#xff0…

数据结构-栈和队列力扣题

目录 有效的括号 用队列实现栈 用栈实现队列 设计循环队列 有效的括号 题目链接&#xff1a;力扣&#xff08;LeetCode&#xff09; 思路&#xff1a; 这道题可以用栈来解决&#xff0c;先让字符串中的左括号 ( &#xff0c; [ &#xff0c; { 入栈&#xff0c;s指向字符串下…

U-Mail信创邮件系统解决方案

近年来&#xff0c;在国家政策的大力引导和自身数字化转型需求驱动下&#xff0c;国产化成为国内数字化发展道路上的关键词&#xff0c;企业不断加强自主创新能力&#xff0c;进行信创建设&#xff0c;实现软硬件系统国产化替代&#xff0c;已成为大势所趋。邮件系统作为企业管…

代码随想录训练营Day1:二分查找与移除元素

本专栏内容为&#xff1a;代码随想录训练营学习专栏&#xff0c;用于记录训练营的学习经验分享与总结。 文档讲解&#xff1a;代码随想录 视频讲解&#xff1a;二分查找与移除元素 &#x1f493;博主csdn个人主页&#xff1a;小小unicorn ⏩专栏分类&#xff1a;C &#x1f69a…

某卢小说网站登录密码逆向

js逆向&#xff0c;今晚找了一个小说网站&#xff0c;分析一下登录密码的解密逆向过程&#xff0c;过程不是很难&#xff0c;分享下 学习网站aHR0cHM6Ly91LmZhbG9vLmNvbS9yZWdpc3QvbG9naW4uYXNweA 这个就是加密后的密码&#xff0c;今晚就逆向它&#xff0c;其他参数暂时不研究…

python+pytorch人脸表情识别

概述 基于深度学习的人脸表情识别&#xff0c;数据集采用公开数据集fer2013&#xff0c;可直接运行&#xff0c;效果良好&#xff0c;可根据需求修改训练代码&#xff0c;自己训练模型。 详细 一、概述 本项目以PyTorch为框架&#xff0c;搭建卷积神经网络模型&#xff0c;训…

【中间件篇-Redis缓存数据库02】Redis高级特性和应用(慢查询、Pipeline、事务、Lua)

Redis高级特性和应用(慢查询、Pipeline、事务、Lua) Redis的慢查询 许多存储系统&#xff08;例如 MySQL)提供慢查询日志帮助开发和运维人员定位系统存在的慢操作。所谓慢查询日志就是系统在命令执行前后计算每条命令的执行时间&#xff0c;当超过预设阀值,就将这条命令的相关…

腾讯云双11优惠活动有哪些?详细攻略来了!

2023年腾讯云双11大促活动正在火热进行中&#xff0c;百款热门云产品11.11云上盛惠&#xff0c;领折上折代金券最高再省9999元&#xff0c;助力开发者轻松上云&#xff01; 一、腾讯云双11活动入口 活动地址&#xff1a;点此直达 二、腾讯云双11活动时间 即日起至2023-11-30…

基于SSM的电动车上牌管理系统设计与实现

末尾获取源码 开发语言&#xff1a;Java Java开发工具&#xff1a;JDK1.8 后端框架&#xff1a;SSM 前端&#xff1a;采用JSP技术开发 数据库&#xff1a;MySQL5.7和Navicat管理工具结合 服务器&#xff1a;Tomcat8.5 开发软件&#xff1a;IDEA / Eclipse 是否Maven项目&#x…

2012年计网408

第33题 在 TCP/IP 体系结构中, 直接为 ICMP 提供服务的协议是()A. PPPB. IPC. UDPD. TCP 本题考察TCP/IP体系结构中直接为ICMP协议提供服务的协议。如图所示。这是TCP/IP的四层体系结构。网际层的IP协议是整个体系结构中的核心协议&#xff0c;用于网络互联。网际控制报文协议…

MongoDB副本集特点验证

MongoDB副本集特点验证 mogodb副本集概述副本集搭建副本集结构验证结果源码地址 mogodb副本集概述 MongoDB副本集是将数据同步在多个服务器的过程。 复制提供了数据的冗余备份&#xff0c;并在多个服务器上存储数据副本&#xff0c;提高了数据的可用性&#xff0c; 并可以保证…

To create the 45th Olympic logo by using CSS

You are required to create the 45th Olympic logo by using CSS. The logo is composed of five rings and three rectangles with rounded corners. The HTML code has been given. It is not allowed to add, edit, or delete any HTML elements. 私信完整源码 <!DOCT…

MFC-TCP网络编程服务端-Socket

目录 1、通过Socket建立服务端&#xff1a; 2、UI设计&#xff1a; 3、代码的实现&#xff1a; &#xff08;1&#xff09;、CListenSocket类 &#xff08;2&#xff09;、CConnectSocket类 &#xff08;3&#xff09;、CTcpServerDlg类 1、通过Socket建立服务端&#xff…

分享一本让你真正理解深度学习的书

关注微信公众号&#xff1a;人工智能大讲堂&#xff0c;后台回复udl获取pdf文档。 今天要分享的书是Understanding Deep Learning&#xff0c;作者是西蒙普林斯&#xff0c;英国巴斯大学的荣誉教授&#xff0c;其个人学术能力相当强大&#xff0c;在AI领域有着深厚的学术造诣。…

网络唤醒(Wake-on-LAN, WOL)

远程唤醒最简单的方法&#xff1a;DDNSTOOpenwrt网络唤醒&#xff0c;完美实现。 原帖-远程唤醒_超详细windows设置远程唤醒wol远程连接&#xff08;远程开机&#xff09; WOL Web# 访问 Wake on Lan Over The Interweb by Depicus 可以无需借助软件很方便的从网页前端唤醒远…

MATLAB / Simulink HDL 快速入门

MATLAB / Simulink HDL 快速入门 我们将使用实例讲解MATLAB / Simulink HDL 使用入门。 开始这个项目&#xff0c;首先需要创建一个包含 Stateflow 的新 Simulink 。只需单击画布中的任意位置并开始输入 Stateflow。 此时应该能在画布上看到 Stateflow 图标。双击图标进行编辑。…

使用xlwings获取excel表的行和列以及指定单元格的值

import xlwings as xw app xw.App(visibleFalse) # 隐藏Excel wb app.books.open(文档1.xlsx) # 打开工作簿sht wb.sheets[Sheet1] # 实例化工作表1#获取行数和列数 rows_countsht.range(1, 1).expand().shape[0] cols_countsht.range(1, 1).expand().shape[1] print(row…

Unity 利用UGUI制作圆形进度条

在Unity中使用Image和Text组件就可以制作简单的进度条。 1、首先准备好一张环状的PNG图&#xff0c;如下图。 2、把该图导入Unity中并转换成精灵。 3、在场景中创建Image和Text组件&#xff0c;并把上图中的精灵拖到Image的Source Image中&#xff0c;其中Image组件中的Image …