1.引入依赖
主要引入Sharding-JDBC依赖sharding-jdbc-spring-boot-starter
,其他的依赖都是为了后面的测试环节所准备的
pom.xml
<!-- sharding-jdbc -->
<dependency>
<groupId>org.apache.shardingsphere</groupId>
<artifactId>sharding-jdbc-spring-boot-starter</artifactId>
<version>4.0.0-RC1</version>
</dependency>
2.创建两个结构相同的表
创建两个结构相同的用户表(user0
,user1
),两张表的建表语句如下
CREATE TABLE `user0` (
`id` bigint(11) NOT NULL,
`username` varchar(32) NOT NULL,
`password` varchar(32) NOT NULL,
`motto` varchar(255) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
CREATE TABLE `user1` (
`id` bigint(11) NOT NULL,
`username` varchar(32) NOT NULL,
`password` varchar(32) NOT NULL,
`motto` varchar(255) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
3.项目配置文件
application.yml
注意: 主键生成使用sharding-jdbc
提供的主键生成策略雪花算法,如果有读者对不了解雪花算法,可以到sharding-jdbc
官网文档 《Shard-JDBC官方文档-分布式主键》 中了解,官网对使用该算法的原因和原理都讲的十分清楚,笔者在这里就不再赘述了~!
server:
port: 9999
spring:
shardingsphere:
props:
sql:
show: true
datasource:
names: ds0
ds0:
type: com.alibaba.druid.pool.DruidDataSource
driverClassName: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=UTF-8&serverTimezone=UTC
username: root
password: 123456
sharding:
tables:
user: # 水平分表,取模运算(user表的分布情况user0,user1)
keyGeneratorColumnName: id # 主键
keyGenerator:
column: id
type: SNOWFLAKE # 使用雪花算法
actualDataNodes: ds0.user$->{0..1} # 分库分表分表表达式,匹配user0和user1
tableStrategy:
inline:
shardingColumn: id # 分片字段
algorithmExpression: user$->{id % 2} # 分片表达式
4.编写user表实体类
/**
* <p>user表实体类</p>
* @author Bosen
* @date 2021/10/10 15:36
*/
@AllArgsConstructor
@NoArgsConstructor
@Data
public class User {
private long id;
private String motto;
private String username;
private String password;
}
5.编写user表映射接口
/**
* <p>user表映射接口</p>
* @author Bosen
* @date 2021/10/10 15:37
*/
@Repository
@Mapper
public interface UserMapper {
@Insert("insert into user(username, password, motto) values(#{username}, #{password}, #{motto})")
int insert(@Param("username") String username, @Param("password") String password, @Param("motto") String motto);
@Select("select * from user where id = #{id}")
User findById(@Param("id") long id);
@Select("select * from user;")
List<User> findAll();
}
6.编写测试类
@SpringBootTest
class ShardingTestApplicationTests {
@Autowired
UserMapper userMapper;
@Test
void testInsert() {
System.out.println(userMapper.insert("张三", "123456", "长风破浪会有时,直挂云帆济沧海"));
}
@Test
void testSelect() {
System.out.println(userMapper.findById(653987601618829313L));
}
@Test
void testFindAll() {
System.out.println(userMapper.findAll());
}
}
1.执行方法testInsert()
,并查看表user0
和user1
的数据:
如上,通过查看两张表的数据,我们可以发现有一条id=653987601618829313
的数据插入到了表user1
中,而表user0
为空。这是因为该id值通过分片表达式id % 2
的计算得出结果1
,进而得知该数据应该插入到表user1
中,而非表user0
。
若现在我们再多插入几条数据,再次观察两张表中的数据:
此时我们发现,表user0
中也有数据插入了,并且两张表的id值分别是偶数和奇数。
2.执行方法testSelect()
,运行结果如下:
我们获取到了在表user1
中id=653987601618829313
的数据
3.执行方法testFindAll()
,运行结果如下:(此时我们可以得到两张表中的所有数据,为了易于分辨数据来源于哪一张表,笔者将user0
表中的名字数据由张三
改为了李四
)
至此,我们的SpringBoot已经成功整合Sharding-JDBC分库分表中间件,并测试完毕~!!