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.自己配置好目录结构。
2.pom.xml
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.itmuch.boot</groupId> <artifactId>sharding-jdbc-manualConfiguration</artifactId> <version>0.0.1-SNAPSHOT</version> <packaging>jar</packaging> <name>sharding-jdbc-manualConfiguration</name> <url>http://maven.apache.org</url> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>1.5.9.RELEASE</version> <relativePath/> <!-- lookup parent from repository --> </parent> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding> <java.version>1.8</java.version> </properties> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.mybatis.spring.boot</groupId> <artifactId>mybatis-spring-boot-starter</artifactId> <version>1.3.1</version> </dependency> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <scope>runtime</scope> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> <!--sharding-jdbc --> <dependency> <groupId>io.shardingjdbc</groupId> <artifactId>sharding-jdbc-core</artifactId> <version>2.0.3</version> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-devtools</artifactId> </dependency> <!-- <dependency> --> <!-- <groupId>com.alibaba</groupId> --> <!-- <artifactId>druid</artifactId> --> <!-- <version>1.1.3</version> --> <!-- </dependency> --> <dependency> <groupId>commons-dbcp</groupId> <artifactId>commons-dbcp</artifactId> </dependency> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> </dependency> <!-- https://mvnrepository.com/artifact/com.alibaba/fastjson --> <dependency> <groupId>com.alibaba</groupId> <artifactId>fastjson</artifactId> <version>1.2.47</version> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build> </project>
简单提一下:
这里主要是这个依赖
<dependency> <groupId>io.shardingjdbc</groupId> <artifactId>sharding-jdbc-core</artifactId> <version>2.0.3</version> </dependency>
它是当当网开源的sharding-jdbc,当然这个不重要啦!
顺便说一下:
<!-- <dependency> --> <!-- <groupId>com.alibaba</groupId> --> <!-- <artifactId>druid</artifactId> --> <!-- <version>1.1.3</version> --> <!-- </dependency> --> <dependency> <groupId>commons-dbcp</groupId> <artifactId>commons-dbcp</artifactId> </dependency>
我是用的DBCP数据库连接池,这里的druid连接池被我注掉了,当然你也可以使用它,把DBCP注掉。它们都差不多。我想很多其他博友应该有写。大家找找看咯!
在这里我要吐槽下:TMD,CSDN博客上面的文章叫什么东西啊,我读过几次,在上面down下来的代码都是不能运行的,然后在博客园上面再找相同内容的东西,一比对,发现很明显的配置漏洞。我也是无语了。
所以我是推荐咱博客园的文章的,大家都很优秀!!!
application.yml
我们是手动配置数据源,那这里我们可以上面都不用谢了呀!直接放个空文件得了,当然你如果不想使用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 class Application { public static void main(String[] args) { SpringApplication.run(Application.class, args); } }
启动类嘛,我们都一样!不不不。。。注意了,多了个注解,看到它要干嘛了吗?它要把自动配置数据源的功能排除掉。
这里你要是看过我前面的文章“为什么用springboot”中的springboot自动配置的原理,这个东西,so easy啦!
testController.java
@RestController public class testController { @Resource UserInfoMapper userInfoMaper; @Resource DemoService demoService; @GetMapping("insert/{id}") public String insertData(@PathVariable Long id) { demoService.demo(); return "success"; } @GetMapping("get/{id}") public String getData(@PathVariable Long id) { UserInfo userInfoByUserId = demoService.getUserInfoByUserId(id); System.out.println("得到的结果为:" + JSON.toJSON(userInfoByUserId)); return JSON.toJSON(userInfoByUserId).toString(); } }
对外接口,我们提供两个吧,向数据库插入数据传的id没用,我传了玩儿的!!!
插入的内容请看下面的service.
DemoService.java
@Service public class DemoService { @Resource UserInfoMapper userInfoMapper; public static Long userId = 100L; public void demo() { System.out.println("Insert--------------"); for (int i = 1; i <= 100; i++) { UserInfo userInfo = new UserInfo(); 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("over.........."); } public UserInfo getUserInfoByUserId(Long id) { return userInfoMapper.selectByPrimaryKey(id); } }
我们就试验向数据库插100条数据咯,再提供下查询方法。哦哦,Entity在下面
UserInfo.java
1 public class UserInfo { 2 private Long userId; 3 4 private String userName; 5 6 private String account; 7 8 private String password; 9 10 public Long getUserId() { 11 return userId; 12 } 13 14 public void setUserId(Long userId) { 15 this.userId = userId; 16 } 17 18 public String getUserName() { 19 return userName; 20 } 21 22 public void setUserName(String userName) { 23 this.userName = userName == null ? null : userName.trim(); 24 } 25 26 public String getAccount() { 27 return account; 28 } 29 30 public void setAccount(String account) { 31 this.account = account == null ? null : account.trim(); 32 } 33 34 public String getPassword() { 35 return password; 36 } 37 38 public void setPassword(String password) { 39 this.password = password == null ? null : password.trim(); 40 } 41 }