分库分表 Springboot+ApacheShardingSphere+MybatisPlus+Alidruid使用

    技术2022-07-15  44

    Maven添加

    <?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 https://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.3.1.RELEASE</version> <relativePath/> <!-- lookup parent from repository --> </parent> <groupId>com.example</groupId> <artifactId>sharding</artifactId> <version>0.0.1</version> <name>sharding</name> <description>分库分表</description> <properties> <java.version>1.8</java.version> <lombok.version>1.18.4</lombok.version> <mybatisplus.spring.boot.version>3.1.2</mybatisplus.spring.boot.version> <gson.version>2.8.5</gson.version> <swagger.version>2.9.2</swagger.version> <knife4j.version>2.0.2</knife4j.version> <fastjson.version>1.2.60</fastjson.version> <sharding-sphere.version>4.1.0</sharding-sphere.version> </properties> <dependencies> <dependency> <groupId>io.springfox</groupId> <artifactId>springfox-swagger2</artifactId> <version>${swagger.version}</version> </dependency> <dependency> <groupId>com.github.xiaoymin</groupId> <artifactId>knife4j-spring-boot-starter</artifactId> <version>${knife4j.version}</version> <exclusions> <exclusion> <artifactId>swagger-models</artifactId> <groupId>io.swagger</groupId> </exclusion> </exclusions> </dependency> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <version>${lombok.version}</version> </dependency> <dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus-boot-starter</artifactId> <version>${mybatisplus.spring.boot.version}</version> <exclusions> <exclusion> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus-generator</artifactId> </exclusion> </exclusions> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> </dependency> <dependency> <groupId>com.alibaba</groupId> <artifactId>druid</artifactId> <version>1.1.21</version> </dependency> <dependency> <groupId>com.alibaba</groupId> <artifactId>fastjson</artifactId> <version>${fastjson.version}</version> </dependency> <dependency> <groupId>org.apache.shardingsphere</groupId> <artifactId>sharding-jdbc-spring-boot-starter</artifactId> <version>${sharding-sphere.version}</version> </dependency> <dependency> <groupId>org.apache.shardingsphere</groupId> <artifactId>sharding-jdbc-spring-namespace</artifactId> <version>${sharding-sphere.version}</version> </dependency> <!--shardingsphere end--> <dependency> <groupId>javax.validation</groupId> <artifactId>validation-api</artifactId> <version>1.1.0.Final</version> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> <exclusions> <exclusion> <groupId>org.junit.vintage</groupId> <artifactId>junit-vintage-engine</artifactId> </exclusion> </exclusions> </dependency> </dependencies> <build> <finalName>${project.artifactId}</finalName> <extensions> <extension> <groupId>org.apache.maven.wagon</groupId> <artifactId>wagon-ssh</artifactId> <version>2.8</version> </extension> </extensions> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <configuration> <fork>true</fork> <includeSystemScope>true</includeSystemScope> </configuration> </plugin> <!-- 跳过单元测试 --> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-surefire-plugin</artifactId> <configuration> <skipTests>true</skipTests> </configuration> </plugin> </plugins> </build> <repositories> <repository> <id>public</id> <name>aliyun nexus</name> <url>http://maven.aliyun.com/nexus/content/groups/public/</url> <releases> <enabled>true</enabled> </releases> </repository> </repositories> <pluginRepositories> <pluginRepository> <id>public</id> <name>aliyun nexus</name> <url>http://maven.aliyun.com/nexus/content/groups/public/</url> <releases> <enabled>true</enabled> </releases> <snapshots> <enabled>false</enabled> </snapshots> </pluginRepository> </pluginRepositories> </project>

    YML

    server: port: 1818 spring: main: allow-bean-definition-overriding: true resources: # 静态资源 static-locations: classpath:/ #json jackson: date-format: yyyy-MM-dd HH:mm:ss time-zone: GMT+8 serialization: fail_on_empty_beans: false deserialization: fail_on_unknown_properties: false defaultPropertyInclusion: ALWAYS parser: allow_unquoted_control_chars: true allow_single_quotes: true shardingsphere: datasource: names: ds0,ds1 ds0: driver-class-name: com.mysql.jdbc.Driver url: jdbc:mysql://localhost:3306/cool?characterEncoding=utf-8&useLegacyDatetimeCode=false&serverTimezone=UTC username: root password: 123456 type: com.alibaba.druid.pool.DruidDataSource filters: stat maxActive: 20 initialSize: 1 maxWait: 60000 minIdle: 1 timeBetweenEvictionRunsMillis: 60000 minEvictableIdleTimeMillis: 300000 validationQuery: select 'x' testWhileIdle: true testOnBorrow: false testOnReturn: false poolPreparedStatements: true maxOpenPreparedStatements: 20 ds1: driver-class-name: com.mysql.jdbc.Driver url: jdbc:mysql://localhost:3306/cool1?characterEncoding=utf-8&useLegacyDatetimeCode=false&serverTimezone=UTC username: root password: 123456 type: com.alibaba.druid.pool.DruidDataSource filters: stat maxActive: 20 initialSize: 1 maxWait: 60000 minIdle: 1 timeBetweenEvictionRunsMillis: 60000 minEvictableIdleTimeMillis: 300000 validationQuery: select 'x' testWhileIdle: true testOnBorrow: false testOnReturn: false poolPreparedStatements: true maxOpenPreparedStatements: 20 props: sql: show: true sharding: default-database-strategy: inline: algorithm-expression: ds$->{id % 2} sharding-column: id tables: ####tb_user表分片策略 模型的TableName tb_user: ####这个是分库的策略 database-strategy: inline: sharding-column: id algorithm-expression: ds$->{id % 2} ###分表分库的总数 0到1 actual-data-nodes: ds$->{0..1}.tb_user$->{0..2} key-generator: column: id type: SNOWFLAKE #分表策略 根据id取模,确定数据最终落在那个表中 table-strategy: inline: # 分表字段id sharding-column: id algorithm-expression: tb_user$->{id % 3} #mybatis mybatis-plus: mapper-locations: classpath:mapper/**/*.xml #实体扫描,多个package用逗号或者分号分隔 typeAliasesPackage: com.example.sharding.modules.*.entity global-config: #数据库相关配置 db-config: #主键类型 AUTO:"数据库ID自增", INPUT:"用户输入ID", ID_WORKER:"全局唯一ID (数字类型唯一ID)", UUID:"全局唯一ID UUID"; id-type: ID_WORKER #字段策略 IGNORED:"忽略判断",NOT_NULL:"非 NULL 判断"),NOT_EMPTY:"非空判断" insertStrategy: NOT_NULL updateStrategy: NOT_NULL selectStrategy: NOT_NULL logic-delete-value: 88 logic-not-delete-value: 1 banner: false configuration: map-underscore-to-camel-case: true cache-enabled: false call-setters-on-nulls: true

    模型

    @TableName("tb_user") @Data @EqualsAndHashCode(callSuper = false) public class UserEntity implements Serializable { private static final long serialVersionUID = 1L; private Long id; private String name; }

    SQL

    /* Navicat Premium Data Transfer Source Server : 本地 Source Server Type : MySQL Source Server Version : 50720 Source Host : localhost:3306 Source Schema : cool Target Server Type : MySQL Target Server Version : 50720 File Encoding : 65001 Date: 02/07/2020 14:59:41 */ SET NAMES utf8mb4; SET FOREIGN_KEY_CHECKS = 0; -- ---------------------------- -- Table structure for tb_user0 -- ---------------------------- DROP TABLE IF EXISTS `tb_user0`; CREATE TABLE `tb_user0` ( `id` bigint(20) NOT NULL COMMENT 'id', `name` varchar(20) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '用户名', PRIMARY KEY (`id`) USING BTREE ) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci COMMENT = '用户管理' ROW_FORMAT = Dynamic; -- ---------------------------- -- Table structure for tb_user1 -- ---------------------------- DROP TABLE IF EXISTS `tb_user1`; CREATE TABLE `tb_user1` ( `id` bigint(20) NOT NULL COMMENT 'id', `name` varchar(20) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '用户名', PRIMARY KEY (`id`) USING BTREE ) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci COMMENT = '用户管理' ROW_FORMAT = Dynamic; -- ---------------------------- -- Table structure for tb_user2 -- ---------------------------- DROP TABLE IF EXISTS `tb_user2`; CREATE TABLE `tb_user2` ( `id` bigint(20) NOT NULL COMMENT 'id', `name` varchar(20) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '用户名', PRIMARY KEY (`id`) USING BTREE ) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci COMMENT = '用户管理' ROW_FORMAT = Dynamic; SET FOREIGN_KEY_CHECKS = 1;

    连接池报错

    Property 'sqlSessionFactory' or 'sqlSessionTemplate' are required org.springframework.boot.web.servlet.context.AnnotationConfigServletWebServerApplicationContext.refresh

    解决方案: 不要用springboot融合的druid

    <dependency> <groupId>com.alibaba</groupId> <artifactId>druid</artifactId> <version>1.1.21</version> </dependency>
    Processed: 0.013, SQL: 9