使用MyBatis-Sharding 框架进行分库分表具体代码实例

  • Post author:
  • Post category:其他




1.使用 MyBatis-Sharding 框架进行水平分库分表,需要进行以下几个步骤:



配置数据源和分片规则。

在 application.yml 中配置数据源和分片规则,例如:

yaml

spring:
  shardingsphere:
    datasource:
      names: ds0,ds1
      ds0:
        jdbcUrl: jdbc:mysql://localhost:3306/db_0?useUnicode=true&characterEncoding=UTF-8&autoReconnect=true
        username: root
        password: root
        driverClassName: com.mysql.jdbc.Driver
      ds1:
        jdbcUrl: jdbc:mysql://localhost:3306/db_1?useUnicode=true&characterEncoding=UTF-8&autoReconnect=true
        username: root
        password: root
        driverClassName: com.mysql.jdbc.Driver
    sharding:
      tables:
        user:
          actualDataNodes: ds$->{0..1}.user_$->{0..2}
          tableStrategy:
            inline:
              shardingColumn: id
              algorithmExpression: user_$->{id % 3}
          keyGenerateStrategy:
            column: id
            keyGeneratorName: snowflake
          bindingTables: user

上面的配置文件中定义了两个数据源 ds0 和 ds1,以及一张表 user。其中,actualDataNodes 定义了真实的数据节点,通过 $->{n} 的方式指定分片范围;tableStrategy 定义了分表策略,可以使用内置算法或自定义算法;keyGenerateStrategy 定义了主键生成策略,这里使用了雪花算法;bindingTables 定义了绑定表,这里只有一张表。



编写Mapper接口和SQL语句。

java

public interface UserMapper {
    int insert(User user);

    User selectByPrimaryKey(Long id);

    List<User> selectAll();
}

xml

<!-- user.xml -->
<select id="selectByPrimaryKey" resultType="User">
    select * from user_${id % 3} where id=#{id}
</select>
<insert id="insert" parameterType="User">
    insert into user_${id % 3} (name, age) values (#{name}, #{age})
</insert>
<select id="selectAll" resultType="User">
    select * from user_0
    union all
    select * from user_1
    union all
    select * from user_2
</select>

在Mapper接口中定义了增删改查的方法,在XML文件中编写对应的SQL语句,其中涉及到user_${id % 3} 的语句通过分表策略自动路由到不同的数据节点执行。



使用Mapper接口进行数据库操作。

可以通过Spring注入的方式获取Mapper对象,然后使用它来进行数据库操作。

java

@Autowired
UserMapper mapper;

public void test() {
    // 插入数据
    User user = new User();
    user.setName("张三");
    user.setAge(20);
    mapper.insert(user);

    // 查询单个数据
    User result = mapper.selectByPrimaryKey(1L);
    System.out.println(result);

    // 查询所有数据
    List<User> resultList = mapper.selectAll();
    System.out.println(resultList);
}



2.使用 MyBatis-Sharding 框架进行垂直分库分表,需要进行以下几个步骤:

使用 MyBatis-Sharding 进行垂直分库,需要进行以下几个步骤:



配置数据源和分片规则。

在 application.yml 中配置数据源和分片规则,例如:

yaml

spring:
  shardingsphere:
    datasource:
      names: ds_master,ds_slave1,ds_slave2
      ds_master:
        jdbcUrl: jdbc:mysql://localhost:3306/db_master?useUnicode=true&characterEncoding=UTF-8&autoReconnect=true
        username: root
        password: root
        driverClassName: com.mysql.jdbc.Driver
      ds_slave1:
        jdbcUrl: jdbc:mysql://localhost:3306/db_slave1?useUnicode=true&characterEncoding=UTF-8&autoReconnect=true
        username: root
        password: root
        driverClassName: com.mysql.jdbc.Driver
      ds_slave2:
        jdbcUrl: jdbc:mysql://localhost:3306/db_slave2?useUnicode=true&characterEncoding=UTF-8&autoReconnect=true
        username: root
        password: root
        driverClassName: com.mysql.jdbc.Driver
    sharding:
      tables:
        user:
          bindingTables: user_info,user_account
          tableStrategy:
            inline:
              shardingColumn: id
              algorithmExpression: user_${id % 3}
          keyGenerateStrategy:
            column: id
            keyGeneratorName: snowflake
    master-slave-rules:
       user_info:
         masterDataSourceName: ds_master
         slaveDataSourceName: ds_slave1
       user_account:
         masterDataSourceName: ds_master
         slaveDataSourceName: ds_slave2

上面的配置文件中定义了三个数据源 ds_master、ds_slave1、ds_slave2,以及两张表 user_info 和 user_account。其中,bindingTables 定义了绑定表,表示这两张表在同一个数据节点中;tableStrategy 定义了分表策略和分片范围;keyGenerateStrategy 定义了主键生成策略;master-slave-rules 定义了主从规则,将 user_info 绑定到 ds_slave1 数据源上,将 user_account 绑定到 ds_slave2 数据源上。



编写Mapper接口和SQL语句。

java

public interface UserInfoMapper {
    int insert(UserInfo userInfo);

    UserInfo selectByPrimaryKey(Long id);

    List<UserInfo> selectAll();
}

xml

<!-- user_info.xml -->
<select id="selectByPrimaryKey" resultType="UserInfo">
    select * from user_info where id=#{id}
</select>
<insert id="insert" parameterType="UserInfo">
    insert into user_info (name, age) values (#{name}, #{age})
</insert>
<select id="selectAll" resultType="UserInfo">
    select * from user_info
</select>

java

public interface UserAccountMapper {
    int insert(UserAccount userAccount);

    UserAccount selectByPrimaryKey(Long id);

    List<UserAccount> selectAll();
}

xml

<!-- user_account.xml -->
<select id="selectByPrimaryKey" resultType="UserAccount">
    select * from user_account where id=#{id}
</select>
<insert id="insert" parameterType="UserAccount">
    insert into user_account (balance) values (#{balance})
</insert>
<select id="selectAll" resultType="UserAccount">
    select * from user_account
</select>

在Mapper接口中定义了增删改查的方法,在XML文件中编写对应的SQL语句。



使用Mapper接口进行数据库操作。

可以通过Spring注入的方式获取Mapper对象,然后使用它来进行数据库操作。

java

@Autowired
UserInfoMapper userInfoMapper;

@Autowired
UserAccountMapper userAccountMapper;

public void test() {
    // 插入数据
    UserInfo userInfo = new UserInfo();
    userInfo.setName("张三");
    userInfo.setAge(20);
    userInfoMapper.insert(userInfo);

    UserAccount userAccount = new UserAccount();
    userAccount.setBalance(100);
    userAccountMapper.insert(userAccount);

    // 查询单个数据
    UserInfo userInfoResult = userInfoMapper.selectByPrimaryKey(1L);
    System.out.println(userInfoResult);

    UserAccount userAccountResult = userAccountMapper.selectByPrimaryKey(1L);
    System.out.println(userAccountResult);

    // 查询所有数据
    List<UserInfo> userInfoList = userInfoMapper.selectAll();
    System.out.println(userInfoList);

    List<UserAccount> userAccountList = userAccountMapper.selectAll();
    System.out.println(userAccountList);
}

以上就是使用 MyBatis-Sharding 进行垂直分库操作的基本步骤和示例代码。需要注意的是,垂直分库将一个表的多个字段拆分到不同的数据节点中存储,通常需要更加细致地考虑数据的分片策略和访问规则。



版权声明:本文为vsmybits原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。