概述:如果我们有一些非业务表如基础配置表或者数据字典等表,不需要做分库分表那么改如何设计,Sharding-jdbc 中公共表可实现该种配置。公共表即每个数据库中都存在的一张表,改表在数据库中也无分表配置,独立唯一。

环境:SpringBoot 2.2 + mybatis plus3.0 + Sharding jdbc4.0

需求:我们在数据库course_1、course_2、user_db 三个数据库中都创建一张数据字典表t_data,然后实现新增,修改,删除,查询,查询所有表是否同步更新。

工程目录结构:

主要步骤:

  1. 创建数据库环境
  2. 创建maven工程,导入依赖
  3. 创建主启动类
  4. 创建实体类、数据库接口类
  5. 创建配置文件
  6. 编写测试代码测试验证

一、创建数据库环境

分别创建三个数据库、course_db_1、course_db_2、user_db。每张表中都创建一个t_data。其他表创建参考《ShardingSphere(四) 垂直分库配置搭建,实现写入读取》。

CREATE TABLE `t_data` (`data_id` bigint(20) NOT NULL,`field_name` varchar(20) DEFAULT NULL,`field_value` varchar(20) DEFAULT NULL,`field_key` varchar(20) DEFAULT NULL,PRIMARY KEY (`data_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8

二、创建maven工程,导入依赖

idea创建maven工程并引入Sharding mybatisplus 等依赖,pom.xml 内容如下:

<?xml version="1.0" encoding="UTF-8"?>
<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.0</modelVersion><groupId>org.sharding</groupId><artifactId>sharding</artifactId><version>1.0-SNAPSHOT</version><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.2.2.RELEASE</version></parent><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId></dependency><dependency><groupId>com.alibaba</groupId><artifactId>druid-spring-boot-starter</artifactId><version>1.1.20</version></dependency><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>5.1.31</version></dependency><dependency><groupId>org.apache.shardingsphere</groupId><artifactId>sharding-jdbc-spring-boot-starter</artifactId><version>4.0.0-RC1</version></dependency><dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-boot-starter</artifactId><version>3.0.2</version></dependency><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>
</project>

三、创建主启动类

src/main/java/com/xiaohui/ShardingApplication.java

package com.xiaohui;import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;@SpringBootApplication
@MapperScan("com.xiaohui.mapper")
public class ShardingApplication {public static void main(String[] args) {SpringApplication.run(ShardingApplication.class,args);}
}

四、创建业代码

src/main/java/com/xiaohui/entity/TData.java

package com.xiaohui.entity;import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;@Data
@TableName(value = "t_data")
public class TData {private Long dataId;private String fieldKey;private String fieldName;private String fieldValue;
}

src/main/java/com/xiaohui/mapper/DataMapper.java

package com.xiaohui.mapper;import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.xiaohui.entity.TData;
import org.springframework.stereotype.Repository;@Repository
public interface DataMapper extends BaseMapper<TData> {
}

其他实体类、数据库接口类参考上一章节文章《ShardingSphere(四) 垂直分库配置搭建,实现写入读取》。

五、创建配置文件

#sharding-jdbc 分片策略
#=================================数据源配置部分========================================
#数据源名称,多数据源以逗号分隔
spring.shardingsphere.datasource.names=ds0,ds1,ds2
#配置 ds0 ds1数据源具体内容
spring.shardingsphere.datasource.ds0.type=com.alibaba.druid.pool.DruidDataSource
spring.shardingsphere.datasource.ds0.driver-class-name=com.mysql.jdbc.Driver
spring.shardingsphere.datasource.ds0.url=jdbc:mysql://127.0.0.1:3306/course_db_1
spring.shardingsphere.datasource.ds0.username=root
spring.shardingsphere.datasource.ds0.password=root
spring.shardingsphere.datasource.ds1.type=com.alibaba.druid.pool.DruidDataSource
spring.shardingsphere.datasource.ds1.driver-class-name=com.mysql.jdbc.Driver
spring.shardingsphere.datasource.ds1.url=jdbc:mysql://127.0.0.1:3306/course_db_2
spring.shardingsphere.datasource.ds1.username=root
spring.shardingsphere.datasource.ds1.password=root
spring.shardingsphere.datasource.ds2.type=com.alibaba.druid.pool.DruidDataSource
spring.shardingsphere.datasource.ds2.driver-class-name=com.mysql.jdbc.Driver
spring.shardingsphere.datasource.ds2.url=jdbc:mysql://127.0.0.1:3306/user_db
spring.shardingsphere.datasource.ds2.username=root
spring.shardingsphere.datasource.ds2.password=root#公共表 数据字典表
spring.shardingsphere.sharding.broadcast-tables=t_data
#=================================数据节点配置部分======================================
#=================================数据库分库策略=======================================
#=================================数据库分表策略========================================
#==================================数据库字段生成策略====================================
spring.shardingsphere.sharding.tables.t_data.key-generator.column=data_id
spring.shardingsphere.sharding.tables.t_data.key-generator.type=SNOWFLAKE
#==================================其他配置=============================================
#解决报错 Consider renaming one of the beans or enabling overriding...
spring.main.allow-bean-definition-overriding=true
#打开sql日志输出
spring.shardingsphere.props.sql.show=true

公共表配置主要使用broadcast-tables进行声明配置,如下配置则表示t_data为所有数据库中的公共表。

spring.shardingsphere.sharding.broadcast-tables=t_data

六、编写测试类测试验证

package com.xiaohui;import com.baomidou.mybatisplus.core.conditions.Wrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.xiaohui.entity.Course;
import com.xiaohui.entity.TData;
import com.xiaohui.entity.User;
import com.xiaohui.mapper.DataMapper;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;import java.util.List;@RunWith(SpringRunner.class)
@SpringBootTest
public class MainTest {@Autowiredprivate DataMapper dataMapper;//=============================公共表测试===================================@Testpublic void testAddData(){TData data = new TData();data.setFieldKey("1");data.setFieldName("sex");data.setFieldValue("男");dataMapper.insert(data);}@Testpublic void testGetById(){QueryWrapper<TData> dataQueryWrapper = new QueryWrapper<>();dataQueryWrapper.eq("data_id",562742414687600641L);TData data = dataMapper.selectOne(dataQueryWrapper);System.out.println(data);}@Testpublic void testDataDel(){QueryWrapper<TData> dataQueryWrapper = new QueryWrapper<>();dataQueryWrapper.eq("data_id",557657187803987969L);dataMapper.delete(dataQueryWrapper);}
}
  • 测试执行新增测试testAddData()
2021-02-02 16:50:12.866  INFO 7532 --- [           main] ShardingSphere-SQL                       : Rule Type: sharding
2021-02-02 16:50:12.868  INFO 7532 --- [           main] ShardingSphere-SQL                       : Logic SQL: INSERT INTO t_data  ( field_key,field_name,field_value )  VALUES  ( ?,?,? )
2021-02-02 16:50:12.869  INFO 7532 --- [           main] ShardingSphere-SQL                       : SQLStatement: InsertStatement(super=DMLStatement(super=AbstractSQLStatement(type=DML, tables=Tables(tables=[Table(name=t_data, alias=Optional.absent())]), routeConditions=Conditions(orCondition=OrCondition(andConditions=[AndCondition(conditions=[])])), encryptConditions=Conditions(orCondition=OrCondition(andConditions=[])), sqlTokens=[TableToken(tableName=t_data, quoteCharacter=NONE, schemaNameLength=0), SQLToken(startIndex=20)], parametersIndex=3, logicSQL=INSERT INTO t_data  ( field_key,
field_name,field_value )  VALUES  ( ?,?,? )), deleteStatement=false, updateTableAlias={}, updateColumnValues={}, whereStartIndex=0, whereStopIndex=0, whereParameterStartIndex=0, whereParameterEndIndex=0), columnNames=[field_key, field_name, field_value], values=[InsertValue(columnValues=[org.apache.shardingsphere.core.parse.old.parser.expression.SQLPlaceholderExpression@4a44cfc0, org.apache.shardingsphere.core.parse.old.parser.expression.SQLPlaceholderExpression@60e3c26e, org.apache.shardingsphere.core.parse.old.parser.expression.SQLPlaceholderExpression@80b122b])])
2021-02-02 16:50:12.869  INFO 7532 --- [           main] ShardingSphere-SQL                       : Actual SQL: ds0 ::: INSERT INTO t_data   (field_key, field_name, field_value, data_id) VALUES (?, ?, ?, ?) ::: [1, sex, 男, 563404971823857665]
2021-02-02 16:50:12.869  INFO 7532 --- [           main] ShardingSphere-SQL                       : Actual SQL: ds1 ::: INSERT INTO t_data   (field_key, field_name, field_value, data_id) VALUES (?, ?, ?, ?) ::: [1, sex, 男, 563404971823857665]
2021-02-02 16:50:12.869  INFO 7532 --- [           main] ShardingSphere-SQL                       : Actual SQL: ds2 ::: INSERT INTO t_data   (field_key, field_name, field_value, data_id) VALUES (?, ?, ?, ?) ::: [1, sex, 男, 563404971823857665]

通过打印我们可以看到实际执行的sql再每个数据库都执行了新增操作。并且新增时生成的主键id也是一样的。

  • 测试查询操作testGetById()

打印日志如下:通过多次执行查询可以通过选择的数据源看出,他会随机的在多个数据源中选择一个进行查询。

2021-02-02 16:54:11.311  INFO 10184 --- [           main] ShardingSphere-SQL                       : Rule Type: sharding
2021-02-02 16:54:11.313  INFO 10184 --- [           main] ShardingSphere-SQL                       : Logic SQL: SELECT  data_id,field_key,field_name,field_value  FROM t_data  WHERE  data_id = ?
2021-02-02 16:54:11.314  INFO 10184 --- [           main] ShardingSphere-SQL                       : SQLStatement: SelectStatement(super=DQLStatement(super=AbstractSQLStatement(type=DQL, tables=Tables(tables=[Table(name=t_data, alias=Optional.absent())]), routeConditions=Conditions(orCondition=OrCondition(andConditions=[])), encryptConditions=Conditions(orCondition=OrCondition(andConditions=[])), sqlTokens=[TableToken(tableName=t_data, quoteCharacter=NONE, schemaNameLength=0)], parametersIndex=1, logicSQL=SELECT  data_id,field_key,field_name,field_value  FROM t_data  WHERE  data_id = ?)), containStar=false, firstSelectItemStartIndex=8, selectListStopIndex=47, groupByLastIndex=0, items=[CommonSelectItem(expression=data_id, alias=Optional.absent()), CommonSelectItem(expression=field_key, alias=Optional.absent()), CommonSelectItem(expression=field_name, alias=Optional.absent()), CommonSelectItem(expression=field_value, alias=Optional.absent())], groupByItems=[], orderByItems=[], limit=null, subqueryStatement=null, subqueryStatements=[], subqueryConditions=[])
2021-02-02 16:54:11.314  INFO 10184 --- [           main] ShardingSphere-SQL                       : Actual SQL: ds2 ::: SELECT  data_id,field_key,field_name,field_value  FROM t_data  WHERE  data_id = ? ::: [563404971823857665]
TData(dataId=563404971823857665, fieldKey=1, fieldName=sex, fieldValue=男)
  • 测试删除操作testDataDel()

打印如下,可以看到他对每个数据源都进行了删除操作,来保证每张表的数据在每个数据源上保持统一。

2021-02-02 16:57:19.769  INFO 1936 --- [           main] ShardingSphere-SQL                       : Rule Type: sharding
2021-02-02 16:57:19.772  INFO 1936 --- [           main] ShardingSphere-SQL                       : Logic SQL: DELETE FROM t_data  WHERE  data_id = ?
2021-02-02 16:57:19.772  INFO 1936 --- [           main] ShardingSphere-SQL                       : SQLStatement: DMLStatement(super=AbstractSQLStatement(type=DML, tables=Tables(tables=[Table(name=t_data, alias=Optional.absent())]), routeConditions=Conditions(orCondition=OrCondition(andConditions=[])), encryptConditions=Conditions(orCondition=OrCondition(andConditions=[])), sqlTokens=[TableToken(tableName=t_data, quoteCharacter=NONE, schemaNameLength=0)], parametersIndex=1, logicSQL=DELETE FROM t_data  WHERE  data_id = ?), deleteStatement=true, updateTableAlias={t_data=t_data}, updateColumnValues={}, whereStartIndex=20, whereStopIndex=37, whereParameterStartIndex=0, whereParameterEndIndex=0)
2021-02-02 16:57:19.772  INFO 1936 --- [           main] ShardingSphere-SQL                       : Actual SQL: ds0 ::: DELETE FROM t_data  WHERE  data_id = ? ::: [563404971823857665]
2021-02-02 16:57:19.772  INFO 1936 --- [           main] ShardingSphere-SQL                       : Actual SQL: ds1 ::: DELETE FROM t_data  WHERE  data_id = ? ::: [563404971823857665]
2021-02-02 16:57:19.772  INFO 1936 --- [           main] ShardingSphere-SQL                       : Actual SQL: ds2 ::: DELETE FROM t_data  WHERE  data_id = ? ::: [563404971823857665]

ShardingSphere(五) 公共表配置,实现读写改操作相关推荐

  1. 5、ShardingSphere 之 公共表

    文章目录 1 公共表 2 在多个数据库中创建公共表 2.1 edudb1库中t_dict 2.2 edudb2库中t_dict 2.3 userdb库中t_dict 3 创建po 4 创建mapper ...

  2. 【TcaplusDB知识库】GO快速上手PB表的增删查改操作

    PROTOBUF说明 PROTO表是基于PROTOBUF协议设计的TcaplusDB表,PROTOBUF协议是Google开源的通用RPC通信协议,用于TcaplusDB存储数据的序列化.反序列化等操 ...

  3. 数据结构C语言实现顺序表——实现增删查改操作完整代码

    #define _CRT_SECURE_NO_WARNINGS 1 #include<stdio.h> #include<stdlib.h> #include<asser ...

  4. MySQL - 对数据表进行“增删查改”的基础操作 - 细节狂魔

    文章目录 前文知识点回顾 正文 :对数据表进行"增删查改"操作 新增操作 - insert 关键字 查找语句(基础操作) - select关键字 - 重点!!!!!!!! 1.最基 ...

  5. ShardingSphere(二) 水平分表配置搭建,实现分表写入读取

    概述:本章内容分将搭建一个ShardingSphere工程环境,并实现最简单的单库下的水平分表配置演示.通过解读配置文件我们来了解ShardingSphere中是如何实现他的路由操作. 环境:Spri ...

  6. ShardingSphere分库分表(SpringBoot+mybatis+mysql)配置

    一.什么是ShardingSphere 定位为轻量级 Java 框架,在 Java 的 JDBC 层提供的额外服务. 它使用客户端直连数据库,以 jar 包形式提供服务,无需额外部署和依赖,可理解为增 ...

  7. ShardingSphere分库分表

    ShardingSphere是一款起源于当当网内部的应用框架.2015年在当当网内部诞生,最初就叫ShardingJDBC.2016年的时候,由其中一个主要的开发人员张亮,带入到京东数科,组件团队继续 ...

  8. mysql主从shardingsphere分库分表

    问题: 1. 公司的mysql主从复制方式怎么查看--这个命令在哪敲 2.公司扩容一个从的时候怎么做的?-- 3.公司主从架构模式是什么样的?几主几从 4.公司的业务场景有木有要求写后立马查出数据的 ...

  9. ShardingSphere(四) 垂直分库配置搭建,实现写入读取

    概述:垂直分库即转库专用,不同的数据库中存放不同的表信息.比如学生和课程信息,我们将课程表存放与一个数据库中,学生信息存储于另一个库中,本章将介绍如何通过配置Sharding jdbc实现垂直分库操作 ...

最新文章

  1. python目录操作shutil
  2. 推荐两款快速查找/替换电脑中文件的软件
  3. asp.net webapi 自托管插件式服务(转)
  4. Java教程分享:使用Spring框架能带来哪些好处?
  5. mysql explain insert_简述Mysql Explain 命令
  6. 文本标注工具——doccano
  7. Codeforces Round #435 (Div. 2) E. Mahmoud and Ehab and the function[二分]
  8. 计算机病毒的防治方法不包括,计算机病毒的防治方法
  9. 常用URLscheme整理+不同场景下打开URLscheme的方法(adb/安卓原生/按键精灵/auto.js/uniapp/easyclick)
  10. php get month,JavaScript从Date对象返回月份 (0 ~ 11)的方法getMonth()
  11. 前端代码动态生成 审批流程图、流程图
  12. 局计算机信息网络安全管理办法,区科技局网络安全与信息化管理制度
  13. 谷木美身粥要怎样做?谷木美身粥功效真的那么神奇?
  14. 国家药品监督管理局药品审评中心—重点功能介绍
  15. 椭圆方程 matlab,五点差分法(matlab)解椭圆型偏微分方程
  16. linux内核和发行版有什么区别?附镜像包以及如何查看Linux系统内核版本和发行版本
  17. python实训报告万能模板_(完整word版)实训报告万能模板
  18. android 获取年月日
  19. 邮件 黑名单 白名单 灰名单
  20. 搭建Python虚拟环境

热门文章

  1. python之验证身份证号合法性的库:id_validator
  2. JSP小项目,会员管理系统之实现登录功能
  3. Ranger-Sqoop2插件安装
  4. 常用的对象处理工具类
  5. ASP.NET Core 基于SignalR实时通讯的前后端分离技术
  6. html的frame加背景图片,tkinter第二章(添加图片,背景图片)
  7. Linux程序包管理2
  8. 日本研发高精度诊疗感应器,或颠覆疾病诊疗
  9. winform B窗體調用A窗體的DATAGRIDVIEW刷新
  10. switch case里的变量生命周期