公共表
公共表属于系统中数据量较小,变动少,而且属于高频联合查询的依赖表。参数表、数据字典表等属于此类型。可以将这类表在每个数据库都保存一份,所有更新操作都同时发送到所有分库执行。
(1)创建数据库
分别在user_db、order_db_1、order_db_2中创建t_dict表:
CREATE TABLE `t_dict` (
`dict_id` BIGINT ( 20 ) NOT NULL COMMENT '字典id',
`type` VARCHAR ( 50 ) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '字典类型',
`code` VARCHAR ( 50 ) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '字典编码',
`value` VARCHAR ( 50 ) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '字典值',
PRIMARY KEY ( `dict_id` ) USING BTREE
) ENGINE = INNODB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;
(2)在Sharding-JDBC规则中修改
# 指定t_dict为公共表k
spring.shardingsphere.sharding.broadcast‐tables=t_dict
(3)字典操作测试
@Mapper
public interface TDictMapper {
@Insert("insert into t_dict(dict_id,type,code,value) value(#{dictId},#{type},#{code},#{value})")
int insertDict(@Param("dictId") Long dictId, @Param("type") String type, @Param("code") String code, @Param("value") String value);
@Delete("delete from t_dict where dict_id = #{dictId}")
int deleteDict(@Param("dictId") Long dictId);
}
通过日志可以看出,对t_dict的表的操作被广播至所有数据源。
(4)字典关联查询测试
字典表已在各各分库存在,各业务表即可和字典表关联查询。
定义用户关联查询dao:
在UserDao中定义:
@Select("<script> SELECT * FROM t_order AS o LEFT JOIN t_dict AS d ON o.user_id = d.dict_id WHERE user_id IN " +
"<foreach collection='userIds' open='(' separator=',' close=')' item='id'> " +
"#{id}" +
"</foreach>" +
"</script>")
List<Map> selectOrderAndDict(@Param("userIds") List<Long> userIds);
查看日志,成功关联查询字典表: