Sharding-JDBC 公共表
Posted 认真对待世界的小白
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Sharding-JDBC 公共表相关的知识,希望对你有一定的参考价值。
公共表属于系统中数据量较小,变动少,而且属于高频联合查询的依赖表。参数表、数据字典表等属于此类型。可以将这类表在每个数据库都保存一份,所有更新操作都同时发送到所有分库执行。接下来看一下如何使用Sharding-JDBC实现公共表。
(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为公共表
spring.shardingsphere.sharding.broadcast-tables=t_dict
(3)数据操作
新增DictDao:
@Mapper @Component public interface DictDao { /** * 新增字典 * * @param type 字典类型 * @param code 字典编码 * @param value 字典值 * @return */ @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); /** * 删除字典 * * @param dictId 字典id * @return */ @Delete("delete from t_dict where dict_id = #{dictId}") int deleteDict(@Param("dictId") Long dictId); }
(4)字典操作测试
新增单元测试方法:
@Test public void testInsertDict() { dictDao.insertDict(1L, "user_type", "0", "管理员"); dictDao.insertDict(2L, "user_type", "1", "操作员"); } @Test public void testDeleteDict() { dictDao.deleteDict(1L); dictDao.deleteDict(2L); }
执行testInsertDict:
通过日志可以看出,对t_dict的表的操作被广播至所有数据源。
测试删除字典,观察是否把所有数据源中该 公共表的记录删除。
(5)字典关联查询测试
字典表已在各各分库存在,各业务表即可和字典表关联查询。
定义用户关联查询dao:
在UserDao中定义:
/** * 根据id列表查询多个用户,关联查询字典表 * * @param userIds 用户id列表 * @return */ @Select({"<script>", " select", " * ", " from t_user t ,t_dict b", " where t.user_type = b.code and t.user_id in", "<foreach collection=\'userIds\' item=\'id\' open=\'(\' separator=\',\' close=\')\'>", "#{id}", "</foreach>", "</script>" }) List<Map> selectUserInfobyIds(@Param("userIds") List<Long> userIds);
定义测试方法:
@Test public void testSelectUserInfobyIds(){ List<Long> userIds = new ArrayList<>(); userIds.add(1L); userIds.add(2L); List<Map> users = userDao.selectUserInfobyIds(userIds); JSONArray jsonUsers = new JSONArray(users); System.out.println(jsonUsers); }
执行测试方法,查看日志,成功关联查询字典表:
以上是关于Sharding-JDBC 公共表的主要内容,如果未能解决你的问题,请参考以下文章