Mysql数据库分库分表Springboot+mybatis+druid+shardingsphere

一、添加POM引用

<?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">
<parent>
<artifactId>MySQL-Test</artifactId>
<groupId>org.example</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>

<artifactId>SubTable</artifactId>

<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>

<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<version>2.1.9.RELEASE</version>
</dependency>
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>2.0.1</version>
</dependency>
<!--mybatis驱动-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.17</version>
</dependency>
<!--druid数据源-->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid-spring-boot-starter</artifactId>
<version>1.1.16</version>
</dependency>
<dependency>
<groupId>org.apache.shardingsphere</groupId>
<artifactId>sharding-jdbc-spring-boot-starter</artifactId>
<version>4.0.0-RC1</version>
</dependency>
<!--lombok实体工具-->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
<!--swagger2-->
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger2</artifactId>
<version>2.8.0</version>
</dependency>
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger-ui</artifactId>
<version>2.8.0</version>
</dependency>
</dependencies>

</project>

二、配置连接属性

server.port=8088
#指定mybatis信息
#mybatis.config-location=classpath:mybatis-config.xml
mybatis.type-aliases-package="com.test.mapper"

spring.shardingsphere.datasource.names=slave0,slave1
# 数据源 主库
spring.shardingsphere.datasource.slave0.type=com.alibaba.druid.pool.DruidDataSource
spring.shardingsphere.datasource.slave0.driver-class-name=com.mysql.jdbc.Driver
spring.shardingsphere.datasource.slave0.url=jdbc:mysql://192.168.187.128:33066/masterDB?useUnicode=true&characterEncoding=utf-8&serverTimezone=GMT
spring.shardingsphere.datasource.slave0.username=root
spring.shardingsphere.datasource.slave0.password=123456
# 数据源 从库
spring.shardingsphere.datasource.slave1.type=com.alibaba.druid.pool.DruidDataSource
spring.shardingsphere.datasource.slave1.driver-class-name=com.mysql.jdbc.Driver
spring.shardingsphere.datasource.slave1.url=jdbc:mysql://192.168.187.128:33065/masterDB?characterEncoding=utf-8
spring.shardingsphere.datasource.slave1.username=root
spring.shardingsphere.datasource.slave1.password=123456

#数据分表规则
#指定所需分的表
spring.shardingsphere.sharding.tables.dog.actual-data-nodes=slave$->{0..1}.dog$->{0..2}
#指定主键
spring.shardingsphere.sharding.tables.dog.table-strategy.inline.sharding-column=id
#分表规则为主键除以3取模
spring.shardingsphere.sharding.tables.dog.table-strategy.inline.algorithm-expression=dog$->{id % 3}

#打印sql
spring.shardingsphere.props.sql.show=true

三、代码

1、Application代码

import com.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceAutoConfigure;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import springfox.documentation.swagger2.annotations.EnableSwagger2;

@SpringBootApplication
@EnableAutoConfiguration(exclude = {DruidDataSourceAutoConfigure.class})
@EnableSwagger2
public class Application {
public static void main(String[] args){
SpringApplication.run(Application.class, args);
}
}

2、Mapper代码

import com.test.model.Dog;
import org.apache.ibatis.annotations.*;

import java.util.List;

@Mapper
public interface DogMapper {
@Insert("INSERT INTO `dog` (`id`,`name`, `age`) VALUES (#{dog.id},#{dog.name}, #{dog.age});")
public Boolean insert(@Param("dog") Dog dog);
@Select("select * from dog")
public List<Dog> getAll();
@Update("update dog set name=#{dog.name},age=#{dog.age} where id=#{dog.id};")
void update(@Param("dog") Dog dog);
@Select("select MAX(id) from `dog`;")
Integer getMax();
}

3、controller代码

import com.test.mapper.DogMapper;
import com.test.model.Dog;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiParam;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import java.util.Date;
import java.util.List;


@Api(value = "UserController")
@RestController
public class DogController {
@Autowired
DogMapper dogMapper;

@ApiOperation(value = "插入数据", notes = "")
@PostMapping("/insert")
public String insert() {
Dog dog =new Dog();
dog.setName("小明"+new Date().toString());
dog.setAge(11);
dogMapper.insert(dog);
return "插入数据成功";
}

@ApiOperation(value = "插入数据", notes = "")
@PostMapping("/insert1")
public String insert1(@ApiParam(value = "用户", required = true) Dog dog) {
dogMapper.insert(dog);
return "插入数据成功";
}

@ApiOperation(value = "插入条数数据", notes = "")
@GetMapping("/insert-num")
public String insertNum(@RequestParam(value = "num",name = "num",required = true) Integer num) {
Integer id= dogMapper.getMax();
for(Integer i =0;i<num;i++){
Dog dog=new Dog();
dog.setId(id+1+i);
dog.setName("dog:"+String.valueOf(id+1+i));
dog.setAge(id+1+i);
dogMapper.insert(dog);
}
return "插入数据成功";
}

@ApiOperation(value = "插入数据", notes = "")
@GetMapping("/update")
public String update(@ApiParam(value = "用户", required = true) Dog dog) {
dogMapper.update(dog);
return "插入数据成功";
}

@ApiOperation(value = "分页查询", notes = "")
@GetMapping(value="/page")
public List<Dog> page(@RequestParam(value = "第几页", required = true) Integer pageIndex,
@RequestParam(value = "每页数据量", required = true) Integer pageSize) {
List<Dog> list= dogMapper.getAll();
return list;
}

@ApiOperation(value = "查询所有", notes = "")
@GetMapping(value="/getAll")
public List<Dog> getAll() {
List<Dog> list= dogMapper.getAll();
return list;
}

@ApiOperation(value = "获取id最大值", notes = "")
@GetMapping(value="/getMaxId")
public Integer getMaxId() {
Integer id= dogMapper.getMax();
return id;
}
}

4、model

import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;

import java.io.Serializable;

@ApiModel
@Data
public class Dog implements Serializable {
    @ApiModelProperty(value="id",dataType="Integer",name="id",example="1")
    private Integer id;
    @ApiModelProperty(value="name",dataType="String",name="name",example="小明")
    private String name;
    @ApiModelProperty(value="age",dataType="Integer",name="age",example="1")
    private Integer age;
}

5、swagger

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import springfox.documentation.builders.ApiInfoBuilder;
import springfox.documentation.builders.PathSelectors;
import springfox.documentation.builders.RequestHandlerSelectors;
import springfox.documentation.service.ApiInfo;
import springfox.documentation.service.Contact;
import springfox.documentation.spi.DocumentationType;
import springfox.documentation.spring.web.plugins.Docket;

@Configuration
public class SwaggerConfig {
    Boolean swaggerEnabled=true;
    @Bean
    public Docket createRestApi() {
        return new Docket(DocumentationType.SWAGGER_12).apiInfo(apiInfo())
                // 是否开启
                .enable(swaggerEnabled).select()
                // 扫描的路径包
                .apis(RequestHandlerSelectors.basePackage("com.test.controller"))
                // 指定路径处理PathSelectors.any()代表所有的路径
                .paths(PathSelectors.any()).build().pathMapping("/");
    }

    private ApiInfo apiInfo() {
        return new ApiInfoBuilder()
                .title("SpringBoot-Swagger3集成和使用-demo示例")
                .description("springboot | swagger")
                // 作者信息
                .contact(new Contact("name", "个人主页url", "email"))
                .version("1.0.0")
                .build();
    }
}

四、主从数据库部署

见博文:docker-compose安装mysql主从集群

原文地址:https://www.cnblogs.com/raorao1994/p/14993329.html