我们看看SQLRewriteEngine 的rewrite方法,我们执行一条插入语句, INSERT INTO t_order (user_id, status,shop_id) VALUES (?, ?,?); 这里有3个sqlToken,TableToken、ItemsToken、InsertValuesToken
SQLBuilder结构
1、我们首先看看TableToken,看看getTableName方法,移除表名中的[] 和 \ 字符
我们看下执行完appendTablePlaceholder方法,处理完后,当前 currentSegment是 (user_id, status,shop_id
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
3、InsertValuesToken
对于插入补VALUES , (user_id, status,shop_id, order_id) VALUES ,设置insertShardingConditions 表达式(?,?,?,?)
我们看下rewriteEngine 的generateSQL方法的toSQL方法,遍历所有segments
首先看下appendTablePlaceholder方法,将逻辑表明换成实际表名
我们看下appendInsertValuesPlaceholder方法,拼接(?,?,?,?),INSERT INTO t_order_1 (user_id, status,shop_id, order_id) VALUES (?, ?,?, ?)