sharding jdbc + mybatis +spring
1.我们先建立数据库和表(分别建了两个库两张表):
CREATE DATABASE `user_0` /*!40100 DEFAULT CHARACTER SET utf8 */;
CREATE TABLE `user_info_1` (
`user_id` bigint(19) NOT NULL,
`user_name` varchar(45) DEFAULT NULL,
`account` varchar(45) NOT NULL,
`password` varchar(45) DEFAULT NULL,
PRIMARY KEY (`user_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
CREATE TABLE `user_info_0` (
`user_id` bigint(19) NOT NULL,
`user_name` varchar(45) DEFAULT NULL,
`account` varchar(45) NOT NULL,
`password` varchar(45) DEFAULT NULL,
PRIMARY KEY (`user_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
CREATE DATABASE `user_1` /*!40100 DEFAULT CHARACTER SET utf8 */;
CREATE TABLE `user_info_1` (
`user_id` bigint(19) NOT NULL,
`user_name` varchar(45) DEFAULT NULL,
`account` varchar(45) NOT NULL,
`password` varchar(45) DEFAULT NULL,
PRIMARY KEY (`user_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
CREATE TABLE `user_info_0` (
`user_id` bigint(19) NOT NULL,
`user_name` varchar(45) DEFAULT NULL,
`account` varchar(45) NOT NULL,
`password` varchar(45) DEFAULT NULL,
PRIMARY KEY (`user_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
2.开始我们项目的建立,首先明确一点的,我们添加配置的顺序要有先后,思路要清晰,不然在你出错的时候,你都不知道朝哪个方向去思考,我们是spring boot+mybatis+sharding jdbc,我们首先是一个spring boot的项目,所以我们首先建立一个spring boot项目,你可以从https://start.spring.io这个网址去创建一个spring boot项目
这个时候,你可以测试一下,你的spring boot项目能否正常启动,可以,你就进入到下一步的配置当中。
3.mybatis的配置
首先,看看我的源码的目录结构:
4.sharding jdbc的配置
当你mybatis调整好了的时候,这个时候就该加sharding jdbc的配置了,接下如果出问题,应该先朝sharding jdbc的方向去考虑.
从目录结构中我们可以看到,我有一个config包,我把我的配置都写在这里面的,首先,我们先实现我们的分库分表的策略
分库策略的类,DemoDatabaseShardingAlgorithm
image.png
使用io.shardingjdbc,就应该实现PreciseShardingAlgorithm接口,然后实现doSharding方法,对应SQL中的=, IN,还有RangeShardingAlgorithm接口中,对应SQL中的BETWEEN AND,因为我只需要=,in操作,所以只实现了PreciseShardingAlgorithm接口,你如果都需要,你可以都实现。
分表策略的类,DemoTableShardingAlgorithm
image.png
剩下的就是最重要的部分,sharding jdbc的配置:
DataSourceConfig:
image.png
image.png
当你遇到一个问题:意思差不多是,需要一个数据源,但是发现好几个,你可以在
getShardingDataSource()这个方法上添加注解:@Primary,设置默认数据源
还有一个重中之重的部分,在Applicatian这个启动类中:加上注解
@EnableAutoConfiguration(exclude={DataSourceAutoConfiguration.class})
@EnableTransactionManagement(proxyTargetClass = true)
主要是为了防止代码的自动配置
image.png
5.测试
我写了一个测试服务和一个测试类
测试服务:DemoService
image.png
测试类DemoApplicationTests
image.png