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 實現分庫分表

        共 8311字,需瀏覽 17分鐘

         ·

        2020-08-24 08:20

        點擊上方“JAVA”,星標公眾號

        重磅干貨,第一時間送達
        • 一、 Sharding-jdbc簡介
        • 二、項目結構
        • 接口測試使用postman
        • 三、總結
        • 參考資料

        一、 Sharding-jdbc簡介

        Sharding-jdbc是開源的數據庫操作中間件;定位為輕量級Java框架,在Java的JDBC層提供的額外服務。它使用客戶端直連數據庫,以jar包形式提供服務,無需額外部署和依賴,可理解為增強版的JDBC驅動,完全兼容JDBC和各種ORM框架。

        官方文檔地址:https://shardingsphere.apache.org/document/current/cn/overview/

        本文demo實現了分庫分表功能。如有錯誤,歡迎各位在評論中指出。不勝感激!

        二、項目結構

        首先創(chuàng)建一個一般的Spring boot項目,項目采用三層架構,結構圖如下:

        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)建數據庫表,DDL語句如下

        創(chuàng)建數據庫表數據
        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 電商開源項目的倉庫:

        # 數據源 db0,db1,db2
        sharding.jdbc.datasource.names=db0,db1,db2
        # 第一個數據庫
        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

        # 第二個數據庫
        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

        # 第三個數據庫
        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

        # 水平拆分的數據庫(表) 配置分庫 + 分表策略 行表達式分片策略
        # 分庫策略
        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位數 如果是分布式還要進行一個設置 防止主鍵重復
        #sharding.jdbc.config.sharding.tables.user.key-generator-column-name=id

        # 打印執(zhí)行的數據庫以及語句
        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鼓勵鼓勵博主,謝謝!

        三、總結

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

        參考資料

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

        來源:blog.csdn.net/Macky_He/article/details/95754402



        ?--END--


        ? 推薦

        公眾號ID|javabaiwen

        小編微信|619531440


        每天分享技術干貨

        視頻|電子書|面試題|開發(fā)經驗

        瀏覽 54
        點贊
        評論
        收藏
        分享

        手機掃一掃分享

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

        手機掃一掃分享

        分享
        舉報
        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>
            91无码乱伦 | 亚洲欧美高清在线 | 一级久久 | 国产综合色在线视频 | 音影先锋资源 | 大香蕉大香蕉伊人网 | 久久婷婷一级婬片A片AAA野外 | 国产精品高潮露脸在线观看 | 帮老师揉腿慢慢滑进内裤在线 | 国产精品自拍视频 |