Spring Boot 集成 Sharding-JDBC + Mybatis-Plus 实现分库分表

一、 Sharding-jdbc简介
“Sharding-jdbc是开源的数据库操作中间件;定位为轻量级Java框架,在Java的JDBC层提供的额外服务。它使用客户端直连数据库,以jar包形式提供服务,无需额外部署和依赖,可理解为增强版的JDBC驱动,完全兼容JDBC和各种ORM框架。
官方文档地址:https://shardingsphere.apache.org/document/current/cn/overview/
本文demo实现了分库分表功能。如有错误,欢迎各位在评论中指出。不胜感激!

二、项目结构
首先创建一个一般的Spring boot项目,项目采用三层架构,
结构图如下:
在这里插入图片描述

POM.xml文件如下:
![<?xml version="1.0" encoding="UTF-8"?>

4.0.0

org.springframework.boot
spring-boot-starter-parent
2.1.6.RELEASE


com.macky
spring-boot-shardingjdbc
0.0.1-SNAPSHOT
spring-boot-shardingjdbc
Demo project for spring-boot-shardingjdbc

<properties>
    <java.version>1.8</java.version>
</properties>

<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-test</artifactId>
        <scope>test</scope>
    </dependency>
    <!--mysql-->
    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
        <scope>runtime</scope>
    </dependency>
    <!--Mybatis-Plus-->
    <dependency>
        <groupId>com.baomidou</groupId>
        <artifactId>mybatis-plus-boot-starter</artifactId>
        <version>3.1.1</version>
    </dependency>
    <!--shardingsphere start-->
    <!-- for spring boot -->
    <dependency>
        <groupId>io.shardingsphere</groupId>
        <artifactId>sharding-jdbc-spring-boot-starter</artifactId>
        <version>3.1.0</version>
    </dependency>
    <!-- for spring namespace -->
    <dependency>
        <groupId>io.shardingsphere</groupId>
        <artifactId>sharding-jdbc-spring-namespace</artifactId>
        <version>3.1.0</version>
    </dependency>
    <!--shardingsphere end-->
    <!--lombok-->
    <dependency>
        <groupId>org.projectlombok</groupId>
        <artifactId>lombok</artifactId>
    </dependency>
</dependencies>

<build>
    <plugins>
        <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
        </plugin>
    </plugins>
</build>

]

实体类以书本为例

![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;
]

@Data
@EqualsAndHashCode(callSuper = true)
@Accessors(chain = true)
@TableName(“book”)
public class Book extends Model {
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;

@RestController
public class BookController {

@Autowired
BookService bookService;

@RequestMapping(value = "/book", method = RequestMethod.GET)
public List<Book> 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 Mac

  • @Title ServiceImpl

  • @Description:Doer

  • @date 2020/10/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;

创建数据库表,DDL语句如下

创建数据库表数据
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

三、总结

分库分表实现按照官方文档做一个demo是第一步,如需深入还需要研究源码,研究架构,研究思想;此文仅作为入门demo搭建指南,如需深入理解,还请移步至官方文档。

猜你喜欢

转载自blog.csdn.net/weixin_42584783/article/details/108894799