springboot集成shardingSphere,demo地址:https://github.com/MeihaoLife/demo-dubbo
1、引入shardingSphere的sharding-jdbc的相关依赖,此处直接引入starter
<!-- shardingSphere 依赖 -->
<dependency>
<groupId>org.apache.shardingsphere</groupId>
<artifactId>sharding-jdbc-spring-boot-starter</artifactId>
<version>4.1.1</version>
</dependency>
<!-- mybatis plus -->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.4.1</version>
</dependency>
<!-- mysql -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>
2、配置sharding-jdbc的分库分表配置
server:
port: 9081
spring:
main:
allow-bean-definition-overriding: true
shardingsphere: # shardingsphere 分库分表 读写分离配置
datasource: # 数据源配置
names: m-db1,m-db2,m-db3,s-db1,s-db2,s-db3
m-db1:
type: com.zaxxer.hikari.HikariDataSource
driver-class-name: com.mysql.cj.jdbc.Driver
jdbc-url: jdbc:mysql://localhost:3306/db1?characterEncoding=utf-8&&serverTimezone=GMT%2B8
username: root
password: 123456
m-db2:
type: com.zaxxer.hikari.HikariDataSource
driver-class-name: com.mysql.cj.jdbc.Driver
jdbc-url: jdbc:mysql://localhost:3306/db2?characterEncoding=utf-8&&serverTimezone=GMT%2B8
username: root
password: 123456
m-db3:
type: com.zaxxer.hikari.HikariDataSource
driver-class-name: com.mysql.cj.jdbc.Driver
jdbc-url: jdbc:mysql://localhost:3306/db3?characterEncoding=utf-8&&serverTimezone=GMT%2B8
username: root
password: 123456
s-db1:
type: com.zaxxer.hikari.HikariDataSource
driver-class-name: com.mysql.cj.jdbc.Driver
jdbc-url: jdbc:mysql://localhost:3307/db1?characterEncoding=utf-8&&serverTimezone=GMT%2B8
username: root
password: 123456
s-db2:
type: com.zaxxer.hikari.HikariDataSource
driver-class-name: com.mysql.cj.jdbc.Driver
jdbc-url: jdbc:mysql://localhost:3307/db2?characterEncoding=utf-8&&serverTimezone=GMT%2B8
username: root
password: 123456
s-db3:
type: com.zaxxer.hikari.HikariDataSource
driver-class-name: com.mysql.cj.jdbc.Driver
jdbc-url: jdbc:mysql://localhost:3307/db3?characterEncoding=utf-8&&serverTimezone=GMT%2B8
username: root
password: 123456
sharding:
default-database-strategy: # 分库
inline:
sharding-column: user_id # 分库字段
algorithm-expression: m-db$->{user_id%3+1} # 分库规则
tables: # 分表
t_user_operate_log:
actual-data-nodes: m-db$->{1..3}.t_user_operate_log_$->{0..1}
table-strategy:
inline:
sharding-column: user_id # 分表字段
algorithm-expression: t_user_operate_log_$->{user_id%2} # 分表规则
master-slave-rules: #主从配置,读写分离配置,读走从库(从库可以配置多个),写主库
m-db1:
master-data-source-name: m-db1
slave-data-source-names: s-db1
m-db2:
master-data-source-name: m-db2
slave-data-source-names: s-db2
m-db3:
master-data-source-name: m-db3
slave-data-source-names: s-db3
props: # 打印sql
sql:
show: true
mybatis-plus:
configuration:
map-underscore-to-camel-case: true # 下划线转驼峰
3、数据库操作代码
@Data
@Builder
@SuppressWarnings("serial")
public class UserOperateLogDTO implements Serializable {
private Long userId;
private Date operateTime;
private String operateDesc;
private Byte operateResult;
}
@Data
@Accessors(chain = true)
@TableName("t_user_operate_log")
public class UserOperateLogModel extends Model<UserOperateLogModel> {
private Long id;
private Long userId;
private Date operateTime;
private String operateDesc;
private Byte operateResult;
private String handlerClass;
private String handlerMethod;
}
/**
* @ClassName: UserOperateLogService
* @Description: TODO
* @Author: zhānghào
* @Date: 2021/1/13 5:36 下午
* @Version: v1.0
**/
public interface UserOperateLogService {
boolean save(UserOperateLogDTO entity);
List<UserOperateLogDTO> getList(UserOperateLogDTO userOperateLogModel);
}
@Service
public class UserOperateLogServiceImpl extends ServiceImpl<UserOperateLogMapper, UserOperateLogModel> implements UserOperateLogService {
// 数据写入主库,分库分表
@Override
public boolean save(UserOperateLogDTO userOperateLogDTO) {
UserOperateLogModel model = new UserOperateLogModel();
BeanUtils.copyProperties(userOperateLogDTO, model);
return super.save(model);
}
// 数据读取从库,分库分表
@Override
public List<UserOperateLogDTO> getList(UserOperateLogDTO userOperateLogDTO) {
UserOperateLogModel userOperateLogModel = new UserOperateLogModel();
BeanUtils.copyProperties(userOperateLogDTO, userOperateLogModel);
if (userOperateLogModel.getUserId() == null) {
return Collections.emptyList();
}
QueryWrapper<UserOperateLogModel> queryWrapper = new QueryWrapper<>();
queryWrapper.eq("user_id", userOperateLogModel.getUserId());
List<UserOperateLogModel> userOperateLogModels = this.baseMapper.selectList(queryWrapper);
if (userOperateLogModels.size() == 0) {
return Collections.emptyList();
}
List<UserOperateLogDTO> returnList = new ArrayList<>(userOperateLogModels.size());
userOperateLogModels.forEach(model -> returnList.add(UserOperateLogDTO.builder()
.userId(model.getUserId())
.operateTime(model.getOperateTime())
.operateDesc(model.getOperateDesc())
.operateResult(model.getOperateResult()).build()));
return returnList;
}
}