MyBatis-Plus 根据 http 请求 头部参数自动分表(动态表名)

版本

    implementation('com.baomidou:mybatis-plus-boot-starter:3.3.0')

配置config

MybatisPlusConfig.java

@EnableTransactionManagement
@Configuration
public class MybatisPlusConfig {
    @Bean
    public PaginationInterceptor paginationInterceptor() {
        PaginationInterceptor paginationInterceptor = new PaginationInterceptor();
        // 设置请求的页面大于最大页后操作, true调回到首页,false 继续请求  默认false
        paginationInterceptor.setOverflow(false);
        // 设置最大单页限制数量,默认 500 条,-1 不受限制
        paginationInterceptor.setLimit(-1);

        //动态表名解析器  分表的 表 需要手动导入  (如 user 表 想根据http header 中 '_hospital' 值来动态 生成 user_12 之类的的表)
        Map<String, ITableNameHandler> tableNameHandlerMap = new HashMap<>();
        tableNameHandlerMap.put("user", myDynamicTableNameParser());


        DynamicTableNameParser dynamicTableNameParser = new DynamicTableNameParser().setTableNameHandlerMap(tableNameHandlerMap);

        ArrayList<ISqlParser> sqlParsersList = new ArrayList<>();
        sqlParsersList.add(dynamicTableNameParser);
        paginationInterceptor.setSqlParserList(sqlParsersList);

        return paginationInterceptor;
    }

    @Bean
    public ITableNameHandler myDynamicTableNameParser() {
        return (metaObject, sql, tableName) -> {
        	//获取 请求头 参数 动态分配表名 ,如果是spring security oauth2   就改成从 authentication.getPrincipal() 配置的用户信息中获取 
            ServletRequestAttributes attr = (ServletRequestAttributes) RequestContextHolder.currentRequestAttributes();
            String hospitalId = attr.getRequest().getHeader("_hospital");

            hospitalId = !hospitalId.isEmpty() ? "_" + hospitalId : "";
            return tableName + hospitalId;
        };
    }
}

测试

//userController.java

    @Autowired
    private IUserService userService;

    @GetMapping(value = "/")
    public ResponseEntity<Page<User>> list(@RequestParam(required = false) Integer current, @RequestParam(required = false) Integer pageSize) {
        if (current == null) {
            current = 1;
        }
        if (pageSize == null) {
            pageSize = 10;
        }
        Page<User> aPage = userService.page(new Page<>(current, pageSize));
        return new ResponseEntity<>(aPage, HttpStatus.OK);
    }

//IUserService.java
public interface IUserService extends IService<User> {}


//UserServiceImpl.java
@Service
public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements IUserService {}

//UserMapper.java
public interface UserMapper extends BaseMapper<User> {}

IDEA 的 http Client

GET http://localhost:7080/Demo/user/
_hospital: 10

生成的sql 语句就会变成
在这里插入图片描述

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值