8 8 8 3.4.2 4.1.1 8.0.27
application.properties文件配置org.springframework.boot spring-boot-starter-web org.springframework.boot spring-boot-configuration-processor true org.projectlombok lombok true com.baomidou mybatis-plus-boot-starter ${mybatisplus.boot.starter.version} mysql mysql-connector-java ${mysql.version} org.apache.shardingsphere sharding-jdbc-spring-boot-starter ${sharding-jdbc.version} org.springframework.boot spring-boot-starter-test test
spring.application.name=demo-sharding-jdbc
server.port=8080
# 打印执行的数据库以及语句
spring.shardingsphere.props.sql.show=true
#配置数据源 db0 多个数据源逗号隔开 例如: ds0,ds1
spring.shardingsphere.datasource.names=ds0
# 配置数据库参数
spring.shardingsphere.datasource.ds0.type=com.zaxxer.hikari.HikariDataSource
spring.shardingsphere.datasource.ds0.driver-class-name=com.mysql.cj.jdbc.Driver
spring.shardingsphere.datasource.ds0.jdbc-url=jdbc:mysql://127.0.0.1:3306/shop_order_0?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true
spring.shardingsphere.datasource.ds0.username=root
spring.shardingsphere.datasource.ds0.password=123456
# 配置逻辑表 product_order workid 用于解决分表id重复问题
spring.shardingsphere.sharding.tables.product_order.key-generator.props.worker.id=1
#id生成策略
spring.shardingsphere.sharding.tables.product_order.key-generator.column=id
spring.shardingsphere.sharding.tables.product_order.key-generator.type=SNOWFLAKE
#配置数据节点
spring.shardingsphere.sharding.tables.product_order.actual-data-nodes=ds0.product_order_$->{0..1}
#配置分片键 分片算法(通过订单id取余)
spring.shardingsphere.sharding.tables.product_order.table-strategy.inline.sharding-column=id
spring.shardingsphere.sharding.tables.product_order.table-strategy.inline.algorithm-expression=product_order_$->{id % 2}
ProductOrderMapper 操作类
import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.demo.shardingspherejdbcdemo.model.ProductOrderDO; public interface ProductOrderMapper extends BaseMapperProductOrderDO 实体类{ }
import java.util.Date;
@Data
@TableName("product_order")
public class ProductOrderDO {
private Long id;
private String outTradeNo;
private String state;
private Date createTime;
private Double payAmount;
private String nickname;
private Long userId;
}
springboot 启动类添加注解
@MapperScan("mapper所在路径")
@EnableTransactionManagement
订单表结构sql
CREATE TABLE `product_order_0` ( `id` bigint(20) NOT NULL AUTO_INCREMENT, `out_trade_no` varchar(64) COLLATE utf8mb4_bin DEFAULT NULL COMMENT '订单id', `state` varchar(11) COLLATE utf8mb4_bin DEFAULT NULL COMMENT '', `create_time` datetime DEFAULT NULL COMMENT '订单创建时间', `pay_amount` decimal(16,2) DEFAULT NULL COMMENT '订单实际支付价格', `nickname` varchar(64) COLLATE utf8mb4_bin DEFAULT NULL COMMENT '昵称', `user_id` bigint(20) DEFAULT NULL COMMENT '用户id', PRIMARY KEY (`id`) USING BTREE ) ENGINE=InnoDB AUTO_INCREMENT=1516412560359845891 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin ROW_FORMAT=DYNAMIC;对应表 库结构 测试添加订单数据
@SpringBootTest
class ShardingsphereJdbcDemoApplicationTests {
@Autowired
private ProductOrderMapper productOrderMapper;
@Test
void onlyProductSaveTest() {
//单个库 水平分表
Random random = new Random();
for(int i = 0 ; i < 10; i ++){
ProductOrderDO productOrderDO = new ProductOrderDO();
// productOrderDO.setId(0L);
productOrderDO.setOutTradeNo(UUID.randomUUID().toString().replace("-",""));
productOrderDO.setState("NEW");
productOrderDO.setCreateTime(new Date());
productOrderDO.setPayAmount(Double.valueOf(100+i));
productOrderDO.setNickname(String.format("用户[%s]",i+""));
productOrderDO.setUserId(Long.valueOf(random.nextInt(100)));
productOrderMapper.insert(productOrderDO);
}
}
}
插入的订单数据



