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