zoukankan      html  css  js  c++  java
  • 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主从集群

  • 相关阅读:
    剑指offer-最小的k个数
    剑指offer-数组中出现次数超过一半的数字
    android开发------响应用户事件
    android开发------初识Activity
    android开发------编写用户界面之相对布局
    android开发------编写用户界面之线性布局(补充知识)
    android开发------编写用户界面之线性布局
    android开发------第一个android程序
    加密狗的工作原理
    克隆加密狗、复制加密狗、破解加密狗的定义区别
  • 原文地址:https://www.cnblogs.com/raorao1994/p/14993329.html
Copyright © 2011-2022 走看看