我们看看SQLRewriteEngine 的rewrite方法,我们执行一条插入语句, INSERT INTO t_order (user_id, status,shop_id) VALUES (?, ?,?); 这里有3个sqlToken,TableToken、ItemsToken、InsertValuesToken
![](https://img.haomeiwen.com/i5072576/b5d7470d366361c9.png)
SQLBuilder结构
![](https://img.haomeiwen.com/i5072576/3533510a8aa3c142.png)
1、我们首先看看TableToken,看看getTableName方法,移除表名中的[] 和 \ 字符
![](https://img.haomeiwen.com/i5072576/13d7c3c6b9b1c03b.png)
![](https://img.haomeiwen.com/i5072576/42882850292b3392.png)
我们看下执行完appendTablePlaceholder方法,处理完后,当前 currentSegment是 (user_id, status,shop_id
![](https://img.haomeiwen.com/i5072576/bf4a1f5a463a3ccd.png)
2、我们看看ItemsToken是用来补列
AVG查询列:SELECT AVG(price) FROM t_order 的 AVG(price)
ORDER BY 字段不在查询列:SELECT order_id FROM t_order ORDER BY create_time 的 create_time
GROUP BY 字段不在查询列:SELECT COUNT(order_id) FROM t_order GROUP BY user_id 的 user_id
自增主键未在插入列中:INSERT INTO t_order(xx) VALUES ... 中没有自增列 order_id
我们主要看看insert怎么补列的?我们itemToken的item是order_id,所以补完后 (user_id, status,shop_id, order_id
![](https://img.haomeiwen.com/i5072576/3efd7e7ba563ee64.png)
3、InsertValuesToken
对于插入补VALUES , (user_id, status,shop_id, order_id) VALUES ,设置insertShardingConditions 表达式(?,?,?,?)
![](https://img.haomeiwen.com/i5072576/c7dfab45e0a7216d.png)
我们看下rewriteEngine 的generateSQL方法的toSQL方法,遍历所有segments
![](https://img.haomeiwen.com/i5072576/53646887596349ac.png)
首先看下appendTablePlaceholder方法,将逻辑表明换成实际表名
![](https://img.haomeiwen.com/i5072576/7ab5268001c36a1a.png)
我们看下appendInsertValuesPlaceholder方法,拼接(?,?,?,?),INSERT INTO t_order_1 (user_id, status,shop_id, order_id) VALUES (?, ?,?, ?)
![](https://img.haomeiwen.com/i5072576/9988979ab318fd81.png)
网友评论