一、 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搭建指南,如需深入理解,还请移步至官方文档。