巧用Sharding-JDBC规则命中分片

巧用Sharding-JDBC规则命中分片

#分库分表
<sharding:table-rule logic-table="T_ORDER"
          actual-data-nodes="m1.T_ORDER_$->{1..10}_$->{202201..202212}"
          table-strategy-ref="tableShardingStrategy" key-generator-ref="orderKeyGenerator"/>
#分片键
<sharding:complex-strategy id="tableShardingStrategy" sharding-columns="merchant_no, request_date"
          algorithm-ref="分片逻辑"/>
 #分片逻辑
<bean id="分片逻辑"
      class="com.xxx.TableShardingAlgorithm"/>
#雪花ID
<sharding:key-generator id="orderKeyGenerator" type="SNOWFLAKE" column="id"/>

字段解释
merchant_no 商户号
request_date 请求时间(格式为"yyyy-MM-dd")
假设我们的分片逻辑为
merchant_no%10+1 和 request_date (格式为"yyyyMM")
来组成一个完整的表名:m1.T_ORDER_1_202201

我们可以通过在mybatis中直接传值的方式来命中我们想要的分片
具体代码如下:

<select id="selectByOrderList" resultMap="BaseResultMap"
            parameterType="java.util.Map">
        select
        <include refid="Base_Column_List"/>
        from T_ORDER
        where (request_date = #{requestDate,jdbcType=DATE} or 1=1)
        AND (merchant_no=#{merchantNo,jdbcType=VARCHAR} or 1=1)
        AND CREATED_AT &gt; #{startTime,jdbcType=TIMESTAMP}
        AND CREATED_AT &lt; #{endTime,jdbcType=TIMESTAMP}
    </select>

其中
(request_date = #{requestDate,jdbcType=DATE} or 1=1)
(merchant_no=#{merchantNo,jdbcType=VARCHAR} or 1=1)
这两句便是取巧的方法,通过传参来利用我们使用Sharding-JDBC制定的分片规则巧妙地命中我们想要的分片

对比${tableName}

这里其实是利用$做了一个sql拼接,有sql注入的风险不建议使用

<select id="selectByOrderList" resultMap="BaseResultMap"
            parameterType="java.util.Map">
        select
        <include refid="Base_Column_List"/>
        from ${tableName}
        where request_date <= #{startTime,jdbcType=DATE}
        AND request_date >= #{endTime,jdbcType=DATE}
</select>

Mybatis(and)or(and)写法

AND ((CREATED_BY REGEXP "[1][3456789][0-9]{9}" and LENGTH(CREATED_BY) = 11)
OR (BUYER_LOGON_ID REGEXP "[1][3456789][0-9]{9}" and LENGTH(BUYER_LOGON_ID) = 11))

另外在网上看到有使用实体类属性这样赋值表名

<select id="selectByOrderList" resultMap="BaseResultMap"
            parameterType="java.util.Map">
        select
        <include refid="Base_Column_List"/>
        from #{request.tableName}
</select>

#{request.tableName}
测试时报错为:
Syntax error or unsupported sql by uproxy.
如果有那位大佬测试成功了评论区踢一下我。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值