SpringMySQl分表_springboot(⼗三)-分库分表-⼿动配置sharding-jdbc简介
Sharding-JDBC直接封装JDBC API,可以理解为增强版的JDBC驱动,旧代码迁移成本⼏乎为零:
可适⽤于任何基于java的ORM框架,如:JPA, Hibernate, Mybatis, Spring JDBC Template或直接使⽤JDBC。
可基于任何第三⽅的数据库连接池,如:DBCP, C3P0, BoneCP, Druid等。
理论上可⽀持任意实现JDBC规范的数据库。虽然⽬前仅⽀持MySQL,但已有⽀持Oracle,SQLServer,DB2等数据库的计划。
Sharding-JDBC定位为轻量级java框架,使⽤客户端直连数据库,以jar包形式提供服务,未使⽤中间层,⽆需额外部署,⽆其他依
赖,DBA也⽆需改变原有的运维⽅式。SQL解析使⽤Druid解析器,是⽬前性能最⾼的SQL解析器。
具体的介绍可以上它的⽂档那⾥看看,简单归纳起来就是,它是⼀个增强版的JDBC,对使⽤者透明,逻辑代码什么的都不⽤动,它来完成分库分表的操作;然后它还⽀持分布式事务(不完善)。看起来很不错的样⼦。
下⾯⽤个⼩例⼦来看⼀下分库分表的使⽤。使⽤的是SpringBoot,mybatis,DBCP连接池。
1.新建⼀个springboot项⽬
ArtifactId为sharding-jdbc-manualConfiguration.⾃⼰配置好⽬录结构。
l
4.0.0
com.itmuch.boot
sharding-jdbc-manualConfiguration
0.0.1-SNAPSHOT
jar
sharding-jdbc-manualConfiguration
org.springframework.boot
spring-boot-starter-parent
1.5.9.RELEASE
UTF-8
UTF-8
1.8
org.springframework.boot
spring-boot-starter-web
mybatis-spring-boot-starter
1.3.1
mysqlspringboot是啥
mysql-connector-java
runtime
org.springframework.boot
spring-boot-starter-test
test
io.shardingjdbc
sharding-jdbc-core
2.0.3
org.springframework.boot
spring-boot-devtools
commons-dbcp
commons-dbcp
mysql
mysql-connector-java
com.alibaba
fastjson
1.2.47
org.springframework.boot
spring-boot-maven-plugin
简单提⼀下:
这⾥主要是这个依赖
io.shardingjdbc
sharding-jdbc-core
2.0.3
它是当当⽹开源的sharding-jdbc,当然这个不重要啦!
commons-dbcp
commons-dbcp
我是⽤的DBCP数据库连接池,这⾥的druid连接池被我注掉了,当然你也可以使⽤它,把DBCP注掉。它们都差不多。我想很多其他博友应该有写。⼤家看咯!
在这⾥我要吐槽下:TMD,CSDN博客上⾯的⽂章叫什么东西啊,我读过⼏次,在上⾯down下来的代码都是不能运⾏的,然后在博客园上⾯再相同内容的东西,⼀⽐对,发现很明显的配置漏洞。我也是⽆语了。
所以我是推荐咱博客园的⽂章的,⼤家都很优秀
我们是⼿动配置数据源,那这⾥我们可以上⾯都不⽤谢了呀!直接放个空⽂件得了,当然你如果不想使⽤8080端⼝,想在这⾥配置⼀下当前项⽬的使⽤端⼝号,你可以在这⾥配置下咯
数据库
我们要准备三个数据库user_0,user_1,user_2,每个数据库⾥准备两张表user_info_0,user_info_1.⼀共使⽤六张⼀样⼀样的表。
DROP TABLE IF EXISTS `user_info_0`;CREATE TABLE `user_info_0` (
`user_id` bigint(19) NOT NULL,`user_name` varchar(45) DEFAULT NULL,`account` varchar(45) DEFAULT
NULL,`password` varchar(45) DEFAULT NULL,PRIMARY KEY (`user_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;-- ----------------------------
-- Table structure for user_info_1
-- ----------------------------
DROP TABLE IF EXISTS `user_info_1`;CREATE TABLE `user_info_1` (
`user_id` bigint(19) NOT NULL,`user_name` varchar(45) DEFAULT NULL,`account` varchar(45) DEFAULT
NULL,`password` varchar(45) DEFAULT NULL,PRIMARY KEY (`user_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
Application.java
@SpringBootApplication
@EnableAutoConfiguration(exclude= { DataSourceAutoConfiguration.class})public classApplication {public static
voidmain(String[] args) {
SpringApplication.run(Application.class, args);
}
}
启动类嘛,我们都⼀样!不不不。。。注意了,多了个注解,看到它要⼲嘛了吗?它要把⾃动配置数据源的功能排除掉。
这⾥你要是看过我前⾯的⽂章“为什么⽤springboot”中的springboot⾃动配置的原理,这个东西,so easy啦!
testController.java
@RestControllerpublic classtestController {
@Resource
UserInfoMapper userInfoMaper;
DemoService demoService;
@GetMapping("insert/{id}")publicString insertData(@PathVariable Long id) {
demoService.demo();return "success";
}
@GetMapping("get/{id}")publicString getData(@PathVariable Long id) {
UserInfo UserInfoByUserId(id);
System.out.println("得到的结果为:" +JSON(userInfoByUserId));JSON(userInfoByUserId).toString(); }
}
对外接⼝,我们提供两个吧,向数据库插⼊数据传的id没⽤,我传了玩⼉的
插⼊的内容请看下⾯的service.
DemoService.java
@Servicepublic classDemoService {
@Resource
UserInfoMapper userInfoMapper;public static Long userId = 100L;public voiddemo() {
System.out.println("Insert--------------");for (int i = 1; i <= 100; i++) {
UserInfo userInfo= newUserInfo();
userInfo.setUserId(userId);
System.out.println(userId);
userInfo.setAccount("Account" +i);
userInfo.setPassword("pass" +i);
userInfo.setUserName("name" +i);
userId++;
userInfoMapper.insert(userInfo);
System.out.println("第" + i + "条");
}
System.out.println("");
}publicUserInfo getUserInfoByUserId(Long id) {returnuserInfoMapper.selectByPrimaryKey(id);
}
}
我们就试验向数据库插100条数据咯,再提供下查询⽅法。哦哦,Entity在下⾯
UserInfo.java
1 public classUserInfo {
2 privateLong userId;3
4 privateString userName;5
6 privateString account;7
8 privateString password;9
10 publicLong getUserId() {11 returnuserId;12 }13
14 public voidsetUserId(Long userId) {15 this.userId =userId;16 }17
18 publicString getUserName() {19 returnuserName;20 }21
22 public voidsetUserName(String userName) {23 this.userName = userName == null ? null: im();24 }25
26 publicString getAccount() {27 returnaccount;28 }29
30 public voidsetAccount(String account) {31 this.account = account == null ? null: im();32 }33
34 publicString getPassword() {35 returnpassword;36 }37
38 public voidsetPassword(String password) {39 this.password = password == null ? null: im();40 }41 }
点击展开
UserInfoMapper.java
@Mapperpublic interfaceUserInfoMapper {/*** This method was generated by MyBatis Generator. This method corresponds to
* the database table user_info
*
* @ated Tue Mar 13 23:47:19 CST 2018*/
intinsert(UserInfo record);/*** This method was generated by MyBatis Generator. This method corresponds to
* the database table user_info
*
* @ated Tue Mar 13 23:47:19 CST 2018*/
intinsertSelective(UserInfo record);/*** This method was generated by MyBatis Generator. This method corresponds to
* the database table user_info
*
* @ated Tue Mar 13 23:47:19 CST 2018*/UserInfo selectByPrimaryKey(Long userId);/*** This method was generated by MyBatis Generator. This method corresponds to
* the database table user_info
*
* @ated Tue Mar 13 23:47:19 CST 2018*/
intupdateByPrimaryKeySelective(UserInfo record);/*** This method was generated by MyBatis Generator. This method corresponds to
* the database table user_info
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论