<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 實現(xiàn)分庫分表

          共 8359字,需瀏覽 17分鐘

           ·

          2020-08-26 14:31

          點擊上方“碼農(nóng)突圍”,馬上關(guān)注

          這里是碼農(nóng)充電第一站,回復(fù)“666”,獲取一份專屬大禮包

          真愛,請設(shè)置“星標”或點個“在看”

          來源:blog.csdn.net/Macky_He/article/details/95754402
          • 一、 Sharding-jdbc簡介
          • 二、項目結(jié)構(gòu)
          • 接口測試使用postman
          • 三、總結(jié)
          • 參考資料

          一、 Sharding-jdbc簡介

          Sharding-jdbc是開源的數(shù)據(jù)庫操作中間件;定位為輕量級Java框架,在Java的JDBC層提供的額外服務(wù)。它使用客戶端直連數(shù)據(jù)庫,以jar包形式提供服務(wù),無需額外部署和依賴,可理解為增強版的JDBC驅(qū)動,完全兼容JDBC和各種ORM框架。
          官方文檔地址:https://shardingsphere.apache.org/document/current/cn/overview/
          本文demo實現(xiàn)了分庫分表功能。如有錯誤,歡迎各位在評論中指出。不勝感激!

          二、項目結(jié)構(gòu)

          首先創(chuàng)建一個一般的Spring boot項目,項目采用三層架構(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>
          實體類以書本為例
          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:?書籍是實體類
          ?*?@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 電商開源項目的倉庫:

          # 數(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ù)庫(表) 配置分庫 + 分表策略 行表達式分片策略
          # 分庫策略
          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
          # 分片算法表達式
          sharding.jdbc.config.sharding.tables.book.table-strategy.inline.algorithm-expression=book_$->{count % 3}

          # 主鍵 UUID 18位數(shù) 如果是分布式還要進行一個設(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é)

          分庫分表實現(xiàn)按照官方文檔做一個demo是第一步,如需深入還需要研究源碼,研究架構(gòu),研究思想;此文僅作為入門demo搭建指南,如需深入理解,還請移步至官方文檔。

          參考資料

          • 官方文檔:https://shardingsphere.apache.org/document/current/cn/manual/sharding-jdbc/usage/sharding/

          最近熱文

          ? ?川大 NLP 博士生被華為以 200 萬年薪錄用!分享以下科研及論文寫作經(jīng)驗...
          ???程序員因接外包被判坐牢 456 天!兩萬字長文揭露心酸真實經(jīng)歷...
          ???牛逼了,日本神秘男子用 AI 黑科技破解馬賽克,震驚業(yè)界大佬!
          ???騰訊牛逼,把特朗普整懵逼了!

          最近整理了一份大廠算法刷題指南,包括一些刷題技巧,在知乎上已經(jīng)有上萬贊。同時還整理了一份6000頁面試筆記。關(guān)注下面公眾號,在公眾號內(nèi)回復(fù)「刷題」,即可免費獲取!回復(fù)「加群」,可以邀請你加入讀者群!



          明天見(??ω??)??

          瀏覽 47
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          <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>
                  肏屄内射视频 | 欧美特级AA片片 | 日韩一区在线视频 | 日韩天堂一区 | 婷婷色五月丁香 |