完美的分表分库方案还未实现
http://jsqlparser.sourceforge.net/
之前写了一部分,现在想重写。但是对于jsqlparser使用的访问者模式再加上sql自身语句的特点无从下手。
例如:String?statement?=?"select?*?from?Hero?h?where?h.id?in?(select?userId?from?User?where??h.id?in?(select?id?from?Hero))";
先不看sql的问题,如果把这个sql解析掉应该变为
"select?*?from?t_hero?h?where?h.id?in?(select?user_id?from?t_user?where??h.id?in?(select?id?from?t_hero))";
关键问题来了:1、jsqlparser转换得到的javabean是一个Statement?通过访问者模式访问其属性
访问者模式没办法向内部传递参数,这样一来想把userId?转换成user_id?可以说是没有办法的,
这个是访问column的方法
????public?void?visit(Column?tableColumn)?{
????????String?tableName?=?tableColumn.getTable().getWholeTableName();
????}
tableColumn的属性table?为空
当然,作为一个Column?自然在sql中有一个所属的table,例如上面的User(t_user)现在,通过jsqlparser转换的bean是不存在这一层关系的。
而我要做的就是通过改造加上这一层关系。
但是我被访问者模式给搞糊涂了,貌似访问者模式只能通过内部访问外部对象,外部无法窥探内部属性。我的理解是,他只能改变自己,而且只能利用方法的参数来处理
而且参数被限定了就如上面的?public?void?visit(Column?tableColumn)
而Column的信息有太少了,导致无法处理Column与Table之间的关系,也就无法修改命名规则
实际上之前的bolg已经陆陆续续的实现了这种切分功能,但是感觉还是不好,主要原因是对于jsqlparser转换的bean处理不当,希望同样研究过的朋友交流下?