1. <strong id="7actg"></strong>
    2. <table id="7actg"></table>

    3. <address id="7actg"></address>
      <address id="7actg"></address>
      1. <object id="7actg"><tt id="7actg"></tt></object>

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

        共 8359字,需瀏覽 17分鐘

         ·

        2020-08-26 14:31

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

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

        真愛,請?jiān)O(shè)置“星標(biāo)”或點(diǎn)個“在看”

        來源: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/

        最近熱文

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

        最近整理了一份大廠算法刷題指南,包括一些刷題技巧,在知乎上已經(jīng)有上萬贊。同時還整理了一份6000頁面試筆記。關(guān)注下面公眾號,在公眾號內(nèi)回復(fù)「刷題」,即可免費(fèi)獲?。?span style="letter-spacing: 0.544px;-webkit-tap-highlight-color: rgba(0, 0, 0, 0);font-weight: bolder;">回復(fù)「加群」,可以邀請你加入讀者群!



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

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

        手機(jī)掃一掃分享

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

        手機(jī)掃一掃分享

        分享
        舉報
        1. <strong id="7actg"></strong>
        2. <table id="7actg"></table>

        3. <address id="7actg"></address>
          <address id="7actg"></address>
          1. <object id="7actg"><tt id="7actg"></tt></object>
            任我操在线视频 | 在线观看国产www | Sara Jay高清在线观看合集 | 日本精品a秘在线观看 | 国内精品久久久久久 | 成人视频网站18 | 波多野结衣成人视频 | 亚洲欧美日韩丝袜另类 | 日本二区三区精品免费 | 日本无码在线视频 |