Spring Boot 整合 ShardingSphere

框架:

  1. Spring boot
  2. ShardingSphere
  3. Mybatis

文章源码:https://gitee.com/yihong-sword/learn_shardingsphere

Spring boot 整合 SardingSphere (多表(分)):https://www.cnblogs.com/yi1036943655/p/15733915.html

Spring boot 整合 SardingSphere (单表访问以及分库分表):https://www.cnblogs.com/yi1036943655/p/15734158.html

Spring boot 整合 SardingSphere (精确分表策略):https://www.cnblogs.com/yi1036943655/p/15734061.html

Pom:

        <dependency>
            <groupId>org.apache.shardingsphere</groupId>
            <artifactId>sharding-jdbc-spring-namespace</artifactId>
            <version>4.1.1</version>
        </dependency>
        <dependency>
            <groupId>org.apache.shardingsphere</groupId>
            <artifactId>sharding-jdbc-spring-boot-starter</artifactId>
            <version>4.1.1</version>
        </dependency>

Mysql

  • Schema 后缀是0 - xx不限 例如:sharding0、sharding1
  • Table 后缀是0 - xx不限 
-- auto-generated definition
create table s_user0
(
    id   int auto_increment
        primary key,
    name varchar(20) null comment '名字',
    age  varchar(3)  null comment '年龄'
);

代码中数据库结构:

sharding0
    -->> s_user0
    -->> s_user1
sharding1
    -->> s_user0
    -->> s_user1

application.properties

# 应用名称
spring.application.name=learn_shardingsphere
# 应用服务 WEB 访问端口
server.port=8085

# 数据源 sharding01 sharding02
spring.shardingsphere.datasource.names=sharding0,sharding1

# 第一个数据库
spring.shardingsphere.datasource.sharding0.type=com.zaxxer.hikari.HikariDataSource
spring.shardingsphere.datasource.sharding0.driver-class-name=com.mysql.cj.jdbc.Driver
spring.shardingsphere.datasource.sharding0.jdbc-url=jdbc:mysql://localhost:3306/sharding0?serverTimezone=GMT%2B8&useSSL=false
spring.shardingsphere.datasource.sharding0.username=root
spring.shardingsphere.datasource.sharding0.password=yihongjian

# 第二个数据库
spring.shardingsphere.datasource.sharding1.type=com.zaxxer.hikari.HikariDataSource
spring.shardingsphere.datasource.sharding1.driver-class-name=com.mysql.cj.jdbc.Driver
spring.shardingsphere.datasource.sharding1.jdbc-url=jdbc:mysql://localhost:3306/sharding1?serverTimezone=GMT%2B8&useSSL=false
spring.shardingsphere.datasource.sharding1.username=root
spring.shardingsphere.datasource.sharding1.password=yihongjian

# 水平拆分的数据库(表) 配置分库 + 分表策略 行表达式分片策略
# 分库策略
spring.shardingsphere.sharding.default-database-strategy.inline.sharding-column=id
spring.shardingsphere.sharding.default-database-strategy.inline.algorithm-expression=sharding$->{id % 2}

# 分表策略 其中 s_user 为逻辑表 分表主要取决于s_user.id的行
spring.shardingsphere.sharding.tables.s_user.actual-data-nodes=sharding$->{0..1}.s_user$->{0..1}
spring.shardingsphere.sharding.tables.s_user.table-strategy.inline.sharding-column=age
spring.shardingsphere.sharding.tables.s_user.table-strategy.inline.algorithm-expression=s_user$->{Integer.valueOf(age) % 2}

# 打印执行的数据库以及语句
spring.shardingsphere.props.sql.show=true
spring.main.allow-bean-definition-overriding=true
logging.level.com.sharding.demo.mapper=DEBUG

# mybatis
mybatis.mapper-locations=classpath:/mappers/*.xml

Controller

package com.sharding.demo.controller;

import com.sharding.demo.entity.User;
import com.sharding.demo.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import java.util.List;

@RestController
@RequestMapping("/user")
public class UserController {

    @Autowired
    private UserService userService;

    @PostMapping("/save")
    public String save(@RequestBody User user) {
        userService.save(user);
        return "success";
    }

    @GetMapping("/findAll")
    public List<User> findAll() {
        return userService.findAll();
    }

}

Bean

package com.sharding.demo.entity;

import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;

@NoArgsConstructor
@AllArgsConstructor
@Data
@Builder
public class User {
    private Long id;
    private String name;
    private String age;
}

Service

package com.sharding.demo.service.impl;

import com.sharding.demo.entity.User;
import com.sharding.demo.mapper.UserMapper;
import com.sharding.demo.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.List;

@Service
public class UserServiceImpl implements UserService {

    @Autowired
    private UserMapper userMapper;

    @Override
    public void delete(Long id) {
        userMapper.delete(id);
    }

    @Override
    public int update(User user) {
        return userMapper.update(user);
    }

    @Override
    public List<User> findAll() {
        return userMapper.findAll();
    }

    @Override
    public void save(User user) {
        userMapper.save(user);
    }
}

Mapper

package com.sharding.demo.mapper;

import com.sharding.demo.entity.User;
import org.apache.ibatis.annotations.Mapper;

import java.util.List;

@Mapper
public interface UserMapper {

    void delete(Long id);

    int update(User user);

    List<User> findAll();

    void save(User user);
}

UserMapper.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.sharding.demo.mapper.UserMapper">
    <resultMap id="BaseResultMap" type="com.sharding.demo.entity.User">
        <id column="id" jdbcType="BIGINT" property="id"/>
        <result column="name" jdbcType="VARCHAR" property="name"/>
        <result column="age" jdbcType="VARCHAR" property="age"/>
    </resultMap>
    <sql id="Base_Column_List">
        id, name, age
    </sql>

    <insert id="save" parameterType="com.sharding.demo.entity.User">
        insert into s_user (id, name, age) value (#{id}, #{name}, #{age})
    </insert>

    <select id="findAll" resultMap="BaseResultMap">
        select
        <include refid="Base_Column_List"/>
        from s_user
    </select>

    <delete id="delete" parameterType="java.lang.Long">
        delete from s_user
        where id = #{id,jdbcType=BIGINT}
    </delete>

    <update id="update" parameterType="com.sharding.demo.entity.User">
        update s_user
        set
            name = #{name,jdbcType=VARCHAR},
            age = #{age,jdbcType=VARCHAR}
        where id = #{id,jdbcType=BIGINT}
    </update>
</mapper>

启动Console

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

WARNING: Illegal reflective access by org.codehaus.groovy.reflection.CachedClass$3$1 (file:/Users/yihongjian/.m2/repository/org/codehaus/groovy/groovy/2.4.5/groovy-2.4.5-indy.jar) to method java.lang.Object.finalize()
WARNING: Please consider reporting this to the maintainers of org.codehaus.groovy.reflection.CachedClass$3$1
WARNING: Use --illegal-access=warn to enable warnings of further illegal reflective access operations
WARNING: All illegal access operations will be denied in a future release
2021-12-26 15:13:01.055  INFO 14323 --- [  restartedMain] .e.DevToolsPropertyDefaultsPostProcessor : Devtools property defaults active! Set 'spring.devtools.add-properties' to 'false' to disable
2021-12-26 15:13:01.055  INFO 14323 --- [  restartedMain] .e.DevToolsPropertyDefaultsPostProcessor : For additional web related logging consider setting the 'logging.level.web' property to 'DEBUG'
2021-12-26 15:13:01.739  INFO 14323 --- [  restartedMain] 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)
2021-12-26 15:13:01.754  INFO 14323 --- [  restartedMain] 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)
2021-12-26 15:13:01.756  INFO 14323 --- [  restartedMain] 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)
2021-12-26 15:13:01.758  INFO 14323 --- [  restartedMain] 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)
2021-12-26 15:13:01.760  INFO 14323 --- [  restartedMain] 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)
2021-12-26 15:13:01.762  INFO 14323 --- [  restartedMain] 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)
2021-12-26 15:13:01.943  INFO 14323 --- [  restartedMain] trationDelegate$BeanPostProcessorChecker : Bean 'org.apache.shardingsphere.shardingjdbc.spring.boot.SpringBootConfiguration' of type [org.apache.shardingsphere.shardingjdbc.spring.boot.SpringBootConfiguration$$EnhancerBySpringCGLIB$$f93fcc61] is not eligible for getting processed by all BeanPostProcessors (for example: not eligible for auto-proxying)
2021-12-26 15:13:02.160  INFO 14323 --- [  restartedMain] o.s.b.w.embedded.tomcat.TomcatWebServer  : Tomcat initialized with port(s): 8085 (http)
2021-12-26 15:13:02.169  INFO 14323 --- [  restartedMain] o.apache.catalina.core.StandardService   : Starting service [Tomcat]
2021-12-26 15:13:02.169  INFO 14323 --- [  restartedMain] org.apache.catalina.core.StandardEngine  : Starting Servlet engine: [Apache Tomcat/9.0.41]
2021-12-26 15:13:02.224  INFO 14323 --- [  restartedMain] o.a.c.c.C.[Tomcat].[localhost].[/]       : Initializing Spring embedded WebApplicationContext
2021-12-26 15:13:02.224  INFO 14323 --- [  restartedMain] w.s.c.ServletWebServerApplicationContext : Root WebApplicationContext: initialization completed in 1169 ms
2021-12-26 15:13:02.380  INFO 14323 --- [  restartedMain] com.zaxxer.hikari.HikariDataSource       : HikariPool-1 - Starting...
2021-12-26 15:13:02.507  INFO 14323 --- [  restartedMain] com.zaxxer.hikari.HikariDataSource       : HikariPool-1 - Start completed.
2021-12-26 15:13:02.521  INFO 14323 --- [  restartedMain] com.zaxxer.hikari.HikariDataSource       : HikariPool-2 - Starting...
2021-12-26 15:13:02.525  INFO 14323 --- [  restartedMain] com.zaxxer.hikari.HikariDataSource       : HikariPool-2 - Start completed.
2021-12-26 15:13:02.526  INFO 14323 --- [  restartedMain] com.zaxxer.hikari.HikariDataSource       : HikariPool-3 - Starting...
2021-12-26 15:13:02.530  INFO 14323 --- [  restartedMain] com.zaxxer.hikari.HikariDataSource       : HikariPool-3 - Start completed.
2021-12-26 15:13:02.607  INFO 14323 --- [  restartedMain] o.a.s.core.log.ConfigurationLogger       : ShardingRuleConfiguration:
defaultDatabaseStrategy:
  inline:
    algorithmExpression: sharding$->{id % 2}
    shardingColumn: id
tables:
  s_user:
    actualDataNodes: sharding$->{0..1}.s_user$->{0..1}
    logicTable: s_user
    tableStrategy:
      inline:
        algorithmExpression: s_user$->{Integer.valueOf(age) % 2}
        shardingColumn: age
  s_student:
    actualDataNodes: sharding$->{0..1}.s_student$->{0..1}
    logicTable: s_student
    tableStrategy:
      inline:
        algorithmExpression: s_student$->{Integer.valueOf(age) % 2}
        shardingColumn: age

2021-12-26 15:13:02.608  INFO 14323 --- [  restartedMain] o.a.s.core.log.ConfigurationLogger       : Properties:
sql.show: 'true'

2021-12-26 15:13:02.627  INFO 14323 --- [  restartedMain] ShardingSphere-metadata                  : Loading 2 logic tables' meta data.
2021-12-26 15:13:02.693  INFO 14323 --- [  restartedMain] ShardingSphere-metadata                  : Meta data load finished, cost 85 milliseconds.
2021-12-26 15:13:03.055  INFO 14323 --- [  restartedMain] o.s.s.concurrent.ThreadPoolTaskExecutor  : Initializing ExecutorService 'applicationTaskExecutor'
2021-12-26 15:13:03.199  INFO 14323 --- [  restartedMain] o.s.b.d.a.OptionalLiveReloadServer       : LiveReload server is running on port 35729
2021-12-26 15:13:03.223  INFO 14323 --- [  restartedMain] o.s.b.w.embedded.tomcat.TomcatWebServer  : Tomcat started on port(s): 8085 (http) with context path ''
2021-12-26 15:13:03.233  INFO 14323 --- [  restartedMain] com.sharding.demo.DemoApplication        : Started DemoApplication in 2.596 seconds (JVM running for 9.623)

Postman 测试结果

 

posted @ 2021-12-26 20:18  一只奋斗的猪  阅读(1169)  评论(0编辑  收藏  举报