ShardingSphere(五) 公共表配置,实现读写改操作
概述:如果我们有一些非业务表如基础配置表或者数据字典等表,不需要做分库分表那么改如何设计,Sharding-jdbc 中公共表可实现该种配置。公共表即每个数据库中都存在的一张表,改表在数据库中也无分表配置,独立唯一。
环境:SpringBoot 2.2 + mybatis plus3.0 + Sharding jdbc4.0
需求:我们在数据库course_1、course_2、user_db 三个数据库中都创建一张数据字典表t_data,然后实现新增,修改,删除,查询,查询所有表是否同步更新。
工程目录结构:
主要步骤:
- 创建数据库环境
- 创建maven工程,导入依赖
- 创建主启动类
- 创建实体类、数据库接口类
- 创建配置文件
- 编写测试代码测试验证
一、创建数据库环境
分别创建三个数据库、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(五) 公共表配置,实现读写改操作相关推荐
- 5、ShardingSphere 之 公共表
文章目录 1 公共表 2 在多个数据库中创建公共表 2.1 edudb1库中t_dict 2.2 edudb2库中t_dict 2.3 userdb库中t_dict 3 创建po 4 创建mapper ...
- 【TcaplusDB知识库】GO快速上手PB表的增删查改操作
PROTOBUF说明 PROTO表是基于PROTOBUF协议设计的TcaplusDB表,PROTOBUF协议是Google开源的通用RPC通信协议,用于TcaplusDB存储数据的序列化.反序列化等操 ...
- 数据结构C语言实现顺序表——实现增删查改操作完整代码
#define _CRT_SECURE_NO_WARNINGS 1 #include<stdio.h> #include<stdlib.h> #include<asser ...
- MySQL - 对数据表进行“增删查改”的基础操作 - 细节狂魔
文章目录 前文知识点回顾 正文 :对数据表进行"增删查改"操作 新增操作 - insert 关键字 查找语句(基础操作) - select关键字 - 重点!!!!!!!! 1.最基 ...
- ShardingSphere(二) 水平分表配置搭建,实现分表写入读取
概述:本章内容分将搭建一个ShardingSphere工程环境,并实现最简单的单库下的水平分表配置演示.通过解读配置文件我们来了解ShardingSphere中是如何实现他的路由操作. 环境:Spri ...
- ShardingSphere分库分表(SpringBoot+mybatis+mysql)配置
一.什么是ShardingSphere 定位为轻量级 Java 框架,在 Java 的 JDBC 层提供的额外服务. 它使用客户端直连数据库,以 jar 包形式提供服务,无需额外部署和依赖,可理解为增 ...
- ShardingSphere分库分表
ShardingSphere是一款起源于当当网内部的应用框架.2015年在当当网内部诞生,最初就叫ShardingJDBC.2016年的时候,由其中一个主要的开发人员张亮,带入到京东数科,组件团队继续 ...
- mysql主从shardingsphere分库分表
问题: 1. 公司的mysql主从复制方式怎么查看--这个命令在哪敲 2.公司扩容一个从的时候怎么做的?-- 3.公司主从架构模式是什么样的?几主几从 4.公司的业务场景有木有要求写后立马查出数据的 ...
- ShardingSphere(四) 垂直分库配置搭建,实现写入读取
概述:垂直分库即转库专用,不同的数据库中存放不同的表信息.比如学生和课程信息,我们将课程表存放与一个数据库中,学生信息存储于另一个库中,本章将介绍如何通过配置Sharding jdbc实现垂直分库操作 ...
最新文章
- python目录操作shutil
- 推荐两款快速查找/替换电脑中文件的软件
- asp.net webapi 自托管插件式服务(转)
- Java教程分享:使用Spring框架能带来哪些好处?
- mysql explain insert_简述Mysql Explain 命令
- 文本标注工具——doccano
- Codeforces Round #435 (Div. 2) E. Mahmoud and Ehab and the function[二分]
- 计算机病毒的防治方法不包括,计算机病毒的防治方法
- 常用URLscheme整理+不同场景下打开URLscheme的方法(adb/安卓原生/按键精灵/auto.js/uniapp/easyclick)
- php get month,JavaScript从Date对象返回月份 (0 ~ 11)的方法getMonth()
- 前端代码动态生成 审批流程图、流程图
- 局计算机信息网络安全管理办法,区科技局网络安全与信息化管理制度
- 谷木美身粥要怎样做?谷木美身粥功效真的那么神奇?
- 国家药品监督管理局药品审评中心—重点功能介绍
- 椭圆方程 matlab,五点差分法(matlab)解椭圆型偏微分方程
- linux内核和发行版有什么区别?附镜像包以及如何查看Linux系统内核版本和发行版本
- python实训报告万能模板_(完整word版)实训报告万能模板
- android 获取年月日
- 邮件 黑名单 白名单 灰名单
- 搭建Python虚拟环境