spring boot + mybatisplus + mysql + druid 实现数据分表操作

一,maven引入jar包

<!-- https://mvnrepository.com/artifact/com.alibaba/druid -->
    <dependency>
      <groupId>com.alibaba</groupId>
      <artifactId>druid</artifactId>
      <version>1.1.21</version>
    </dependency>
    <!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java -->
    <dependency>
      <groupId>mysql</groupId>
      <artifactId>mysql-connector-java</artifactId>
      <version>8.0.23</version>
    </dependency>

    <!-- mybatis plus 代码生成器 -->
    <dependency>
      <groupId>com.baomidou</groupId>
      <artifactId>mybatis-plus-boot-starter</artifactId>
      <version>3.1.1</version>
    </dependency>
    <dependency>
      <groupId>com.baomidou</groupId>
      <artifactId>mybatis-plus-generator</artifactId>
      <version>3.2.0</version>
    </dependency>
<!-- https://mvnrepository.com/artifact/org.apache.shardingsphere/sharding-jdbc-spring-boot-starter -->
    <dependency>
      <groupId>org.apache.shardingsphere</groupId>
      <artifactId>sharding-jdbc-spring-boot-starter</artifactId>
      <version>4.1.1</version>
    </dependency>

二,properties配置

spring.shardingsphere.datasource.names=ds
spring.shardingsphere.datasource.ds.type=com.alibaba.druid.pool.DruidDataSource
spring.shardingsphere.datasource.ds.driver-class-name=com.mysql.cj.jdbc.Driver
spring.shardingsphere.datasource.ds.url=jdbc:mysql://localhost:3306/ds?characterEncoding=utf8&useSSL=false&serverTimezone=UTC&rewriteBatchedStatements=true
spring.shardingsphere.datasource.ds.username=root
spring.shardingsphere.datasource.ds.password=123123

#spring.shardingsphere.datasource.ds1.type=com.alibaba.druid.pool.DruidDataSource
#spring.shardingsphere.datasource.ds1.driver-class-name=com.mysql.jdbc.Driver
#spring.shardingsphere.datasource.ds1.url=jdbc:mysql://localhost:3306/bank1?useUnicode=true&characterEncoding=UTF-8
#spring.shardingsphere.datasource.ds1.username=root
#spring.shardingsphere.datasource.ds1.password=

spring.shardingsphere.sharding.tables.account_info.actual-data-nodes=ds.account_info$->{0..1}
spring.shardingsphere.sharding.tables.account_info.table-strategy.inline.sharding-column=id
spring.shardingsphere.sharding.tables.account_info.table-strategy.inline.algorithm-expression=account_info$->{id % 2}
spring.shardingsphere.sharding.tables.account_info.key-generator.column=id
spring.shardingsphere.sharding.tables.account_info.key-generator.type=SNOWFLAKE

#spring.shardingsphere.sharding.tables.account_info_item.actual-data-nodes=ds$->{0..1}.account_info_item$->{0..1}
#spring.shardingsphere.sharding.tables.account_info_item.table-strategy.inline.sharding-column=order_id
#spring.shardingsphere.sharding.tables.account_info_item.table-strategy.inline.algorithm-expression=account_info_item$->{order_id % 2}
#spring.shardingsphere.sharding.tables.account_info_item.key-generator.column=order_item_id
#spring.shardingsphere.sharding.tables.account_info_item.key-generator.type=SNOWFLAKE

#spring.shardingsphere.sharding.binding-tables=account_info
#spring.shardingsphere.sharding.broadcast-tables=t_config
spring.shardingsphere.props.sql.show=true

#spring.shardingsphere.sharding.default-database-strategy.inline.sharding-column=user_id
#spring.shardingsphere.sharding.default-database-strategy.inline.algorithm-expression=ds$->{user_id % 2}


#spring.datasource.ds0.type=com.alibaba.druid.pool.DruidDataSource
#spring.datasource.ds0.driver-class-name=com.mysql.jdbc.Driver
#spring.datasource.ds0.url=jdbc:mysql://localhost:3306/bank1?useUnicode=true&characterEncoding=UTF-8
#spring.datasource.ds0.username=root
#spring.datasource.ds0.password=123123
#spring.datasource.ds0.initialSize=5
#spring.datasource.ds0.minIdle=5
#spring.datasource.ds0.maxActive=20
#spring.datasource.ds0.maxWait=60000
#spring.datasource.ds0.timeBetweenEvictionRunsMillis=60000
#spring.datasource.ds0.minEvictableIdleTimeMillis=300000
#spring.datasource.ds0.validationQuery=SELECT 1 FROM DUAL
#spring.datasource.ds0.testWhileIdle=true
#spring.datasource.ds0.testOnBorrow=false
#spring.datasource.ds0.testOnReturn=false
#spring.datasource.ds0.poolPreparedStatements=true
#spring.datasource.ds0.maxPoolPreparedStatementPerConnectionSize=20
#spring.datasource.ds0.filters=stat,wall,log4j
#spring.datasource.ds0.connectionProperties=druid.stat.mergeSql=true;druid.stat.slowSqlMillis=5000
#spring.datasource.ds0.useGlobalDataSourceStat=true

mybatis-plus.configuration.map-underscore-to-camel-case=true
mybatis-plus.configuration.auto-mapping-behavior=full
mybatis-plus.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl
mybatis-plus.mapper-locations=classpath*:/mapper/**/*.xml
mybatis-plus.global-config.db-config.logic-not-delete-value=1
mybatis-plus.global-config.db-config.logic-delete-value=0

三,重写DataSourceHealthContributorAutoConfiguration    AbstractHealthIndicator方法避开spring boot健康检查,避免后续isValid错误

package com.tp.user_server2.config;

import org.springframework.beans.factory.ObjectProvider;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.actuate.autoconfigure.jdbc.DataSourceHealthContributorAutoConfiguration;
import org.springframework.boot.actuate.health.AbstractHealthIndicator;
import org.springframework.boot.actuate.jdbc.DataSourceHealthIndicator;
import org.springframework.boot.jdbc.metadata.DataSourcePoolMetadataProvider;
import org.springframework.context.annotation.Configuration;
import org.springframework.util.StringUtils;

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

@Configuration
public class ShardingJdbcDataSourceHealthConfig extends DataSourceHealthContributorAutoConfiguration {

    @Value("${spring.datasource.dbcp2.validation-query:select 1}")
    private String defaultQuery;

    public ShardingJdbcDataSourceHealthConfig(Map<String, DataSource> dataSources, ObjectProvider<DataSourcePoolMetadataProvider> metadataProviders) {
        super(dataSources, metadataProviders);
    }


    @Override
    protected AbstractHealthIndicator createIndicator(DataSource source) {
        DataSourceHealthIndicator indicator = (DataSourceHealthIndicator) super.createIndicator(source);
        if (!StringUtils.hasText(indicator.getQuery())) {
            indicator.setQuery(defaultQuery);
        }
        return indicator;
    }
}

四,控制类做业务测试

@ResponseBody
    @GetMapping(value = "/saveAccount")
    public String saveAccount(){

        AccountInfo accountInfo = new AccountInfo();
        accountInfo.setAccountName("王五");
        accountInfoService.save(accountInfo);

        AccountInfo accountInfo1 = new AccountInfo();
        accountInfo1.setAccountName("赵六");
        accountInfoService.save(accountInfo1);
        return "1";
    }

五,结果展示,后续做分库分表实验

<think>嗯,用户想了解如何在Spring Boot项目中集成ShardingSphere、MyBatis和Druid实现分库分表的功能。我需要根据他们提供的引用资料来构建回答。首先,我应该回顾一下用户提供的三个引用内容,看看里面有没有相关的步骤或配置示例。 引用[1]提到Spring Boot集成MyBatis和Druid,这可能涉及到基本的依赖和配置,比如Druid连接池的设置。引用[2]和引用[3]则直接提到了ShardingSphere用于分库分表,以及集成MyBatis和Druid的过程。看来这些引用内容已经涵盖了大部分需要的步骤,所以可能需要将这些信息整合起来,形成一个连贯的教程。 接下来,我需要考虑分库分表的具体实现步骤。通常,集成ShardingSphere需要添加相关的依赖,比如Sharding-JDBC的starter。然后,配置数据源的分片策略,比如分库和分表的规则。可能还需要配置MyBatis的Mapper和实体类,以及Druid数据源监控。 用户可能还需要示例代码或配置文件的片段,比如application.properties或YAML文件的配置,以及如何定义分片算法。此外,分库分表的常见策略,比如按用户ID分片或按时间分表,也是需要提到的。同时,应该注意ShardingSphere 5.x之后的版本配置方式是否有变化,避免用户在使用时遇到版本兼容性问题。 还需要考虑可能的问题,比如分布式事务和SQL限制,这些在引用中提到过。用户可能在实际应用中会遇到这些问题,所以提前说明会有帮助。此外,是否需要提供测试方法,比如如何验证分库分表是否成功,或者如何查看Druid的监控数据。 最后,生成的相关问题应该覆盖用户可能进一步询问的方向,比如具体配置参数、性能优化、事务处理等。确保回答结构清晰,分步骤说明,每个部分都有相应的配置示例和解释,这样用户能一步步跟着操作。</think>### Spring Boot集成ShardingSphere+MyBatis+Druid分库分表教程 #### 一、环境准备 1. 开发环境要求 - JDK 1.8+ - Spring Boot 2.7.x - MySQL 5.7+ - Maven 3.6+ 2. 核心依赖配置(pom.xml) ```xml <dependency> <groupId>org.apache.shardingsphere</groupId> <artifactId>sharding-jdbc-spring-boot-starter</artifactId> <version>5.1.1</version> </dependency> <dependency> <groupId>com.alibaba</groupId> <artifactId>druid-spring-boot-starter</artifactId> <version>1.2.8</version> </dependency> <dependency> <groupId>org.mybatis.spring.boot</groupId> <artifactId>mybatis-spring-boot-starter</artifactId> <version>2.2.2</version> </dependency> ``` #### 二、配置文件(application.yml) ```yaml spring: shardingsphere: datasource: names: ds0,ds1 ds0: type: com.alibaba.druid.pool.DruidDataSource url: jdbc:mysql://localhost:3306/db0 username: root password: root ds1: type: com.alibaba.druid.pool.DruidDataSource url: jdbc:mysql://localhost:3306/db1 username: root password: root rules: sharding: tables: user: actual-data-nodes: ds$->{0..1}.user_$->{0..1} database-strategy: standard: sharding-column: user_id sharding-algorithm-name: db-sharding table-strategy: standard: sharding-column: user_id sharding-algorithm-name: table-sharding sharding-algorithms: db-sharding: type: INLINE props: algorithm-expression: ds$->{user_id % 2} table-sharding: type: INLINE props: algorithm-expression: user_$->{user_id % 2} props: sql-show: true mybatis: mapper-locations: classpath:mapper/*.xml configuration: map-underscore-to-camel-case: true ``` #### 三、分片策略实现 1. 垂直分库:按业务模块划分数据库 2. 水平分表:采用用户ID取模分片 $$ \text{分库逻辑:db_index = user_id \% 2} $$ $$ \text{分表逻辑:table_index = user_id \% 2} $$ #### 四、MyBatis集成 1. 创建实体类 ```java public class User { private Long userId; private String username; // getters/setters } ``` 2. Mapper接口示例 ```java @Mapper public interface UserMapper { @Insert("INSERT INTO user(user_id, username) VALUES(#{userId}, #{username})") void insert(User user); @Select("SELECT * FROM user WHERE user_id = #{userId}") User selectByUserId(Long userId); } ``` #### 五、Druid监控配置 ```yaml spring: datasource: druid: stat-view-servlet: enabled: true url-pattern: /druid/* filter: stat: enabled: true ``` 访问监控界面:`http://localhost:8080/druid` #### 六、注意事项 1. 分布式事务需使用`@ShardingSphereTransactionType(TransactionType.XA)` 2. 避免使用跨库JOIN操作[^2] 3. 分片键选择需满足高离散度要求 4. 版本兼容性:ShardingSphere 5.x+ 配置语法与4.x不同[^3]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值