Spring Boot 集成 Sharding-JDBC + Mybatis-Plus 實(shí)現(xiàn)分庫分表
點(diǎn)擊上方藍(lán)色“小哈學(xué)Java”,選擇“設(shè)為星標(biāo)”
回復(fù)“資源”獲取獨(dú)家整理的學(xué)習(xí)資料!


來源:blog.csdn.net/Macky_He/article/details/95754402
一、 Sharding-jdbc簡介 二、項(xiàng)目結(jié)構(gòu) 接口測試使用postman 三、總結(jié) 參考資料
一、 Sharding-jdbc簡介
“Sharding-jdbc是開源的數(shù)據(jù)庫操作中間件;定位為輕量級Java框架,在Java的JDBC層提供的額外服務(wù)。它使用客戶端直連數(shù)據(jù)庫,以jar包形式提供服務(wù),無需額外部署和依賴,可理解為增強(qiáng)版的JDBC驅(qū)動,完全兼容JDBC和各種ORM框架。
官方文檔地址:https://shardingsphere.apache.org/document/current/cn/overview/
本文demo實(shí)現(xiàn)了分庫分表功能。如有錯誤,歡迎各位在評論中指出。不勝感激!
二、項(xiàng)目結(jié)構(gòu)
首先創(chuàng)建一個一般的Spring boot項(xiàng)目,項(xiàng)目采用三層架構(gòu),結(jié)構(gòu)圖如下:

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.0modelVersion>
????<parent>
????????<groupId>org.springframework.bootgroupId>
????????<artifactId>spring-boot-starter-parentartifactId>
????????<version>2.1.6.RELEASEversion>
????????<relativePath/>?
????parent>
????<groupId>com.mackygroupId>
????<artifactId>spring-boot-shardingjdbcartifactId>
????<version>0.0.1-SNAPSHOTversion>
????<name>spring-boot-shardingjdbcname>
????<description>Demo?project?for?spring-boot-shardingjdbcdescription>
????<properties>
????????<java.version>1.8java.version>
????properties>
????<dependencies>
????????<dependency>
????????????<groupId>org.springframework.bootgroupId>
????????????<artifactId>spring-boot-starter-webartifactId>
????????dependency>
????????<dependency>
????????????<groupId>org.springframework.bootgroupId>
????????????<artifactId>spring-boot-starter-testartifactId>
????????????<scope>testscope>
????????dependency>
????????
????????<dependency>
????????????<groupId>mysqlgroupId>
????????????<artifactId>mysql-connector-javaartifactId>
????????????<scope>runtimescope>
????????dependency>
????????
????????<dependency>
????????????<groupId>com.baomidougroupId>
????????????<artifactId>mybatis-plus-boot-starterartifactId>
????????????<version>3.1.1version>
????????dependency>
????????
????????
????????<dependency>
????????????<groupId>io.shardingspheregroupId>
????????????<artifactId>sharding-jdbc-spring-boot-starterartifactId>
????????????<version>3.1.0version>
????????dependency>
????????
????????<dependency>
????????????<groupId>io.shardingspheregroupId>
????????????<artifactId>sharding-jdbc-spring-namespaceartifactId>
????????????<version>3.1.0version>
????????dependency>
????????
????????
????????<dependency>
????????????<groupId>org.projectlombokgroupId>
????????????<artifactId>lombokartifactId>
????????dependency>
????dependencies>
????<build>
????????<plugins>
????????????<plugin>
????????????????<groupId>org.springframework.bootgroupId>
????????????????<artifactId>spring-boot-maven-pluginartifactId>
????????????plugin>
????????plugins>
????build>
project>
實(shí)體類以書本為例
package?com.macky.springbootshardingjdbc.entity;
import?com.baomidou.mybatisplus.annotation.TableName;
import?com.baomidou.mybatisplus.extension.activerecord.Model;
import?groovy.transform.EqualsAndHashCode;
import?lombok.Data;
import?lombok.experimental.Accessors;
/**
?*?@author?Macky
?*?@Title?class?Book
?*?@Description:?書籍是實(shí)體類
?*?@date?2019/7/13?15:23
?*/
@Data
@EqualsAndHashCode(callSuper?=?true)
@Accessors(chain?=?true)
@TableName("book")
public?class?Book?extends?Model<Book>?{
????private?int?id;
????private?String?name;
????private?int?count;
}
開放保存和查詢兩個接口,代碼如下:
package?com.macky.springbootshardingjdbc.controller;
import?com.macky.springbootshardingjdbc.entity.Book;
import?com.macky.springbootshardingjdbc.service.BookService;
import?org.springframework.beans.factory.annotation.Autowired;
import?org.springframework.web.bind.annotation.*;
import?java.util.List;
/**
?*?@author?Macky
?*?@Title?class?BookController
?*?@Description:?TODO
?*?@date?2019/7/12?20:53
?*/
@RestController
public?class?BookController?{
????@Autowired
????BookService?bookService;
????@RequestMapping(value?=?"/book",?method?=?RequestMethod.GET)
????public?List?getItems() {
????????return?bookService.getBookList();
????}
????@RequestMapping(value?=?"/book",method?=?RequestMethod.POST)
????public?Boolean?saveItem(Book?book){
????????return?bookService.save(book);
????}
}
BookServiceImpl.java
package?com.macky.springbootshardingjdbc.service.impl;
import?com.baomidou.mybatisplus.core.toolkit.Wrappers;
import?com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import?com.macky.springbootshardingjdbc.entity.Book;
import?com.macky.springbootshardingjdbc.mapper.BookMapper;
import?com.macky.springbootshardingjdbc.service.BookService;
import?org.springframework.stereotype.Service;
import?java.util.List;
/**
?*?@author?Macky
?*?@Title?class?BookServiceImpl
?*?@Description:?TODO
?*?@date?2019/7/12?20:47
?*/
@Service
public?class?BookServiceImpl?extends?ServiceImpl<BookMapper,?Book>?implements?BookService?{
????@Override
????public?List?getBookList()? {
????????return?baseMapper.selectList(Wrappers.lambdaQuery());
????}
????@Override
????public?boolean?save(Book?book)?{
????????return?super.save(book);
????}
}
BookMapper.java
package?com.macky.springbootshardingjdbc.mapper;
import?com.baomidou.mybatisplus.core.mapper.BaseMapper;
import?com.macky.springbootshardingjdbc.entity.Book;
/**
?*?@author?Macky
?*?@Title?class?BookMapper
?*?@Description:?TODO
?*?@date?2019/7/12?20:46
?*/
public?interface?BookMapper?extends?BaseMapper<Book>?{
}
創(chuàng)建數(shù)據(jù)庫表,DDL語句如下
創(chuàng)建數(shù)據(jù)庫表數(shù)據(jù)
CREATE?DATABASE?IF?NOT?EXISTS?`db0`;
USE?`db0`;
DROP?TABLE?IF?EXISTS?`book_0`;
CREATE?TABLE?`book_0`?(
?`id`?INT?(?11?)?NOT?NULL,
?`name`?VARCHAR?(?255?)?DEFAULT?NULL,
?`count`?INT?(?11?)?DEFAULT?NULL,
?PRIMARY?KEY?(?`id`?)
)?ENGINE?=?INNODB?DEFAULT?CHARSET?=?utf8mb4;
DROP?TABLE?IF?EXISTS?`book_1`;
CREATE?TABLE?`book_1`?(
?`id`?INT?(?11?)?NOT?NULL,
?`name`?VARCHAR?(?255?)?DEFAULT?NULL,
?`count`?INT?(?11?)?DEFAULT?NULL,
?PRIMARY?KEY?(?`id`?)
)?ENGINE?=?INNODB?DEFAULT?CHARSET?=?utf8mb4;
CREATE?DATABASE?IF?NOT?EXISTS?`db1`;
USE?`db1`;
DROP?TABLE?IF?EXISTS?`book_0`;
CREATE?TABLE?`book_0`?(
?`id`?INT?(?11?)?NOT?NULL,
?`name`?VARCHAR?(?255?)?DEFAULT?NULL,
?`count`?INT?(?11?)?DEFAULT?NULL,
?PRIMARY?KEY?(?`id`?)
)?ENGINE?=?INNODB?DEFAULT?CHARSET?=?utf8mb4;
DROP?TABLE?IF?EXISTS?`book_1`;
CREATE?TABLE?`book_1`?(
?`id`?INT?(?11?)?NOT?NULL,
?`name`?VARCHAR?(?255?)?DEFAULT?NULL,
?`count`?INT?(?11?)?DEFAULT?NULL,
?PRIMARY?KEY?(?`id`?)
)?ENGINE?=?INNODB?DEFAULT?CHARSET?=?utf8mb4;
CREATE?DATABASE?IF?NOT?EXISTS?`db2`;
USE?`db2`;
DROP?TABLE?IF?EXISTS?`book_0`;
CREATE?TABLE?`book_0`?(
?`id`?INT?(?11?)?NOT?NULL,
?`name`?VARCHAR?(?255?)?DEFAULT?NULL,
?`count`?INT?(?11?)?DEFAULT?NULL,
?PRIMARY?KEY?(?`id`?)
)?ENGINE?=?INNODB?DEFAULT?CHARSET?=?utf8mb4;
DROP?TABLE?IF?EXISTS?`book_1`;
CREATE?TABLE?`book_1`?(
?`id`?INT?(?11?)?NOT?NULL,
?`name`?VARCHAR?(?255?)?DEFAULT?NULL,
?`count`?INT?(?11?)?DEFAULT?NULL,
?PRIMARY?KEY?(?`id`?)
)?ENGINE?=?INNODB?DEFAULT?CHARSET?=?utf8mb4;
配置分庫分表策略application.properties:
> 推薦一個艿艿寫的 3000+ Star 的 SpringCloud Alibaba 電商開源項(xiàng)目的倉庫:
# 數(shù)據(jù)源 db0,db1,db2
sharding.jdbc.datasource.names=db0,db1,db2
# 第一個數(shù)據(jù)庫
sharding.jdbc.datasource.db0.type=com.zaxxer.hikari.HikariDataSource
sharding.jdbc.datasource.db0.driver-class-name=com.mysql.cj.jdbc.Driver
sharding.jdbc.datasource.db0.jdbc-url=jdbc:mysql://localhost:3306/db0?useUnicode=true&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=UTC
sharding.jdbc.datasource.db0.username=root
sharding.jdbc.datasource.db0.password=Aa123456
# 第二個數(shù)據(jù)庫
sharding.jdbc.datasource.db1.type=com.zaxxer.hikari.HikariDataSource
sharding.jdbc.datasource.db1.driver-class-name=com.mysql.cj.jdbc.Driver
sharding.jdbc.datasource.db1.jdbc-url=jdbc:mysql://localhost:3306/db1?useUnicode=true&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=UTC
sharding.jdbc.datasource.db1.username=root
sharding.jdbc.datasource.db1.password=Aa123456
# 第三個數(shù)據(jù)庫
sharding.jdbc.datasource.db2.type=com.zaxxer.hikari.HikariDataSource
sharding.jdbc.datasource.db2.driver-class-name=com.mysql.cj.jdbc.Driver
sharding.jdbc.datasource.db2.jdbc-url=jdbc:mysql://localhost:3306/db2?useUnicode=true&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=UTC
sharding.jdbc.datasource.db2.username=root
sharding.jdbc.datasource.db2.password=Aa123456
# 水平拆分的數(shù)據(jù)庫(表) 配置分庫 + 分表策略 行表達(dá)式分片策略
# 分庫策略
sharding.jdbc.config.sharding.default-database-strategy.inline.sharding-column=id
sharding.jdbc.config.sharding.default-database-strategy.inline.algorithm-expression=db$->{id % 3}
# 分表策略 其中book為邏輯表 分表主要取決于id行
sharding.jdbc.config.sharding.tables.book.actual-data-nodes=db$->{0..2}.book_$->{0..2}
sharding.jdbc.config.sharding.tables.book.table-strategy.inline.sharding-column=count
# 分片算法表達(dá)式
sharding.jdbc.config.sharding.tables.book.table-strategy.inline.algorithm-expression=book_$->{count % 3}
# 主鍵 UUID 18位數(shù) 如果是分布式還要進(jìn)行一個設(shè)置 防止主鍵重復(fù)
#sharding.jdbc.config.sharding.tables.user.key-generator-column-name=id
# 打印執(zhí)行的數(shù)據(jù)庫以及語句
sharding.jdbc.config.props..sql.show=true
spring.main.allow-bean-definition-overriding=true
#讀寫分離
sharding.jdbc.datasource.dsmaster =
接口測試使用postman
示例:
GET請求------>http://localhost:8080/book
POST請求:------->http://localhost:8080/book?id=1&name=java編程思想&count=8
demo的github地址:
https://github.com/Macky-He/spring-boot--shardingsphere-examples 如各位覺得有幫助的話,還請給個star鼓勵鼓勵博主,謝謝!
三、總結(jié)
分庫分表實(shí)現(xiàn)按照官方文檔做一個demo是第一步,如需深入還需要研究源碼,研究架構(gòu),研究思想;此文僅作為入門demo搭建指南,如需深入理解,還請移步至官方文檔。
參考資料
官方文檔:https://shardingsphere.apache.org/document/current/cn/manual/sharding-jdbc/usage/sharding/
END
有熱門推薦?
1.?Spring Boot 微信點(diǎn)餐開源系統(tǒng)!
2.?9種不同的方法幫助你提高國內(nèi)訪問Github的速度!
最近面試BAT,整理一份面試資料《Java面試BATJ通關(guān)手冊》,覆蓋了Java核心技術(shù)、JVM、Java并發(fā)、SSM、微服務(wù)、數(shù)據(jù)庫、數(shù)據(jù)結(jié)構(gòu)等等。
獲取方式:點(diǎn)“在看”,關(guān)注公眾號并回復(fù)?Java?領(lǐng)取,更多內(nèi)容陸續(xù)奉上。
文章有幫助的話,在看,轉(zhuǎn)發(fā)吧。
謝謝支持喲 (*^__^*)

