<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          Spring Boot 集成 Sharding-JDBC + Mybatis-Plus 實(shí)現(xiàn)分庫分表

          共 8358字,需瀏覽 17分鐘

           ·

          2020-08-22 04:13

          點(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的速度!

          3.?你還在認(rèn)為 count(1) 比 count(*) 效率高?

          4.?收到面試通知后,如下的準(zhǔn)備可以大大提升面試成功率?

          最近面試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ā)吧。

          謝謝支持喲 (*^__^*)

          瀏覽 47
          點(diǎn)贊
          評論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          點(diǎn)贊
          評論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  日本黄色小视频 | 青青青青青青久久久久久久 | 亚洲婷婷综合网 | 五月色影音先锋 | 欧美干逼|